常用ARM指令1:数据处理指令

数据传输指令 mov mvn
算术指令 add sub rsb adc sbc rsc
逻辑指令 and orr eor bic
比较指令 cmp cmn tst teq
乘法指令 mvl mla umull umlal smull smlal
前导零计数 clz

mov(move) mov r1,r0 @两个寄存器之间的数据传递
mov r1,#0xff @ 将值赋给寄存器

mvn和mov用法一致 区别在于mov是原封不动传递,mvn是按位取反后传递

r1 = 0x000000ff mon r0,r1 r0 = 0xffffff00

其他的指令百度即可

and 逻辑与
orr 逻辑或
eor 逻辑异或
bic 位清楚 bic r0,r1,#0xlf @将r1中的bit0到bit4清零后赋值给r0 ox1f = 0x0000001f = 0x00001111

比较指令
cmp cmp r0,r1 等价于 sub r2,r0,r1
cmn cmn r0,r1 等价于 add r0,r1
tst tst r0,#0x8 测试 bit_3 是否为0
teq teq 对俩个数进行异或
比较指令用来比较两个寄存器中的数
注意:比较指令不用加s后缀就可以影响cpsr中的标志位 结果直接放到标志位了 没有返回

常用ARM指令2:CPSR访问指令

  • mrs & msr
  • mrs用来读psr,msr用来写psr
  • CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

cpsr和spsr的区别和联系:cpsr是程序状态寄存器整个soc只有一个。spsr有五个,分别在五种异常模式下,作用是当从普通模式进入异常模式时,保存之前普通模式下的cpsr,以备在返回普通模式时恢复原来的cpsr。

常用ARM指令3:跳转(分支)指令

  • b & bl & bx
  • b 直接跳转(就没打开算返回)
  • bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用
  • bx跳转同时切换到ARM模式,一般用于异常处理的跳转。

常用ARM指令4:访存指令

  • ldr/str & ldm/stm & swp
  • 单个字/半字/字节访问 ldr/str
  • 多字批量访问 ldm/stm
  • swp r1, r2, [r0] 交换-地址内存交换
  • swp r1, r1, [r0] 交换-地址内存交换 可以同一个

ARM汇编中的立即数 前面加#

  • 合法立即数与非法立即数
  • ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分。
  • 合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数

合法立即数 : 0x000000ff 0x00ff0000 0xf00000f
非法立即数 : 0x000001ff

常用ARM指令5:软中断指令

  • swi(software interrupt)
  • 软中断指令用来实现操作系统中系统调用