ARM常用汇编指令

文章目录

    • 1 常用ARM指令
      • 1.1 LDR
      • 1.2 STR
      • 1.3 B
      • 1.4 MOV
      • 1.5 LDR伪指令
      • 1.6 ADD/SUB指令
      • 1.7 BL指令
      • 1.8 LDM/STM指令

1 常用ARM指令

1.1 LDR

LDR (load):读寄存器。

举例:LDR R0, [R1],假设R1的值是x,读取地址x上的数据(4字节),保存到R0中。

1.2 STR

STR (store):写寄存器。

举例:STR R0,[R1],假设R1的值是x,把R0的值写到地址x(4字节)。

1.3 B

无条件跳转。

1.4 MOV

MOV:(move)移动,赋值。

举例1:MOV R0,R1, 把R1的值赋值给R0;

举例2:MOV R0,#0x100, 把0x100赋值给R0,即R0=0x100。

1.5 LDR伪指令

举例:LDR R0,=0x12345678 这是一条伪指令,即实际中并不存在这个指令,他会被拆分成几个真正的ARM指令,实现一样的效果。 最后结果是R0=0x12345678。

为什么会引入伪指令?
在ARM的32位指令中,有些字节表示指令,有些字节表示数据,因此表示数据的没有32位,不能表示一个32位的任意值,只能表示一个较小的简单值,这个简单值称为立即数。引入伪指令后,利用LDR可以为R0赋任意大小值,编译器会自动拆分成真正的的指令,实现目的。

1.6 ADD/SUB指令

add r0, r1, #4:r0 = r1 + 4
sub r0, r1, #4:r0 = r1 - 4
sub r0, r1, r2:r0 = r1 - r2

1.7 BL指令

Branch and Link,执行bl指令时会做如下两件事:

  • 将返回地址(bl指令的下一条指令的地址)保存在lr寄存器
  • 跳转到指定地址去执行

1.8 LDM/STM指令

ldm指令从内存中读取数据到多个寄存器中,stm将多个寄存器的数据保存到内存中去。

可搭配的后缀有:过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。

举例:
stmdb sp!, (fp,ip,lr,pc)
假设Sp=4096。 db意思是先减后存,按高编号寄存器存在高地址存。
!号的作用是最终将保存sp的值。
ARM常用汇编指令_第1张图片

ldmia sp, (fp,ip,pc)
ARM常用汇编指令_第2张图片

你可能感兴趣的:(Linux)