ARM Cortex-M之汇编小结(1)

ARM Cortex-M之汇编小结(1)

最近在学习ARM Cortex-M,许久没有再使用汇编的小弟,看到一段汇编命令十分之头疼。耗费一天时间之后,终于对这段代码有所了解,作为学习笔记记录一下。

ldr

在ARM指令集中,ldr指令即可能是大范围的地址读取伪指令,也可能是内存访问指令,当它的第二个参数之前有“=”时,表示伪指令,否则是内存访问指令,比如 :

LDR r0,=name, 像这种带等号的是伪指令, 而不是ARM指令。 LDR 伪指令用于加载立即数或一个地址值到指定寄存器.

  1. 如果name是立即数的话: LDR R0,=0x123 ;将0x123存入R0
  2. 如果name是个标识符: LDR R0,=name ;将name的地址存入R0
  3. 如果name加有[]符号的话: LDR R0,[R1] ;将R1所指向的地址存储的值存入R0
  4. 如果name有[]的表达式的话: LDR R0,[R1, R2] ;将R1+R2所指向的地址存储的值存入R0

str

把一个寄存器按字存储到存储器中

  1. str r1, [r2, #4] // 将r1的数据保存到地址为r2+4的内存单元中
  2. str r1, [r2] // 将r1的数据保存到地址为r2的内存单元中
  3. str r1, [r2], #4 // 将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4

b, bl, bcc

  • B : 直接跳转到制定的地方
  • BL : 除跳转外还将返回地址(bl的下一条指令的地址) 保存到lr寄存器中
  • BCC: 如果标志位C为0的时候,就发生跳转,否则继续执行下一条指令. 一般会结合cmp 指令一起。

orr,

按位或,可以理解为C 中的"|"

and

按位与,可以理解为C 中的"&"

lsr

逻辑右移,可以理解为C中的">>"

比如说:
lsr Rd, Rn, #4 ; Rd = Rn>>4

lsr Rd, Rn ; Rd >>= Rn

lsl

与lsr 类似,它是逻辑左移,可以理解为C中的"<<"

bfi

BFI(位段插入指令),则把某个寄存器按LSB对齐的数值,拷贝到另一个寄存器的某个位段中,其格式为 BFI.W Rd, Rn, #lsb, #width

例如,
LDR R0, =0x12345678
LDR R1, =0xAABBCCDD
BFI.W R1, R0, #8, #16
则执行后,R1= 0xAA5678DD (总是从Rn的最低位提取,#lsb只对Rd起作用——译注)

code

ENTRY: main

main:
  ldr r3, =0x20000000
  ldr r0, =0x800
  ldr r1, =0x200
  ldr r2, #0
  b LoopLoadImg

LoadImg:
   ldr r4, [r3, r2]
   str r4, [r0, r2]
   add r2, r2, #4
   
 LoopLoadImg:
   cmp r1, r2
   bcc LoadImg
 
SetVTOR:
   ldr r0, =0x800
   ldr r1, =0xE000ED08
   str r0, [r1]
   ldr sp, [r0]
   ldr r4, [r0, #4]
   bx r4
   

目前就做这些总结了,以后有新的知识,在做补充.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值