汇编指令归纳

1.跳转指令 b, bl
a.这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。

b.这两条指令的可跳转的范围是当前指令的前后32MB。

c.它们是位置无关的指令。

2.数据传送指令mov, 地址读取伪指令ldr
mov指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器。
mov r1, r2 //r1 = r2
mov r1, #4096 //r1 = 4096

注意:
a.mov指令传送的常数必须能用立即数来表示,当不知道一个数能否用“立即数”来表示时,可以使用ldr命令来赋值。
b.ldr指令是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的指令:
如果该常数能用“立即数”来表示,则使用mov指令;
否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来

示例:
ldr r1, =4097 //r1=4097
ldr 本意为“大范围的地址读取伪指令”,上面的例子使用它来常数赋给寄存器r1。下面的例子是获得代码的绝对地址:
ldr r1, =label
label:
……

3.内存访问指令 ldr str
ldr指令既可能是前面所述的大范围的地址读取伪指令,也可能是内存访问指令。当它的第二个参数前面有“=”时,表示伪指令,否则表示内存访问指令。

ldr指令从内存中读取数据到寄存器,str指令把寄存器的值存储到内存中,它们操作的数据都是32位的,示例如下:
ldr r1, [r2, #4] //将地址 r2+4 的内存单元数据读取到 r1 中
ldr r1, [r2] //将地址 r2 的内存单元数据读取到 r1 中
ldr r1, [r2], #4 //将地址 r2 的内存单元数据读取到 r1 中,然后 r2=r2+4
str r1, [r2, #4] //将 r1 的数据保存到地址为 r2+4 的内存单元中
str r1, [r2] //将 r1 的数据保存到地址为 r2 的内存单元中
str r1, [r2], #4 //将 r1 的数据保存到地址为 r2 的内存单元中,然后 r2=r2+4

4.加减指令 add sub
add r1, r2, #1 //r1=r2+1,即寄存器r1的值等于寄存器r2的值加1
sub r1, r2, #1 //r1=r2-1,即寄存器r1的值等于寄存器r2的值减1

5.程序状态寄存器的访问指令 msr mrs
ARM处理器有一个程序状态寄存器(cpsr),它用来控制处理器的工作模式、设置中断的总开关。示例如下:
msr cpsr, r0 //复制 r0 到 cpsr 中
mrs r0, cpsr //复制 cpsr 到 r0 中

6.其他伪指令
在ARM的汇编指令中,常常用到如下语句:
.extern main
.text
.global _start
_start:

“.extern”定义一个外部符号(可以是变量也可以是函数),上面的代码表示文件中引用的main是一个外部函数。
“.text”表示下面的语句都属于代码段。
“.global”将文件中的某个程序标号定义为全局的,比如上面的代码表示 _start

是个全局函数


相关文档
最新文档