数据传输指令 mov mvn
算术指令 add sub rsb adc sbc rsc
逻辑指令 and orr eor bic
比较指令 cmp cmn tst teq
乘法指令 mvl mla umull umlal smull smlal
前导零计数 clz
数据传输指令:
mov r1, r0 @两个寄存器之间数据传递
mov r1, #0xff @将立即数赋值给r1
mvn和mov用法是一样的,区别是mvn是按位取反后传递。
逻辑指令:
and:逻辑与
orr:逻辑或
eor:逻辑异或
bic:位清除指令 bic r0, r1, #0x1f @将r1中的数的bit0~bit4清零后赋值给r0
比较指令:比较指令用来比较2个寄存器中的数。
(注意:比较指令不用加s后缀就可以影响cpsr中的标志位,之所以这样做的原因是重在过程,而不像mov那种注重结果。例如cmp r0, r1 这句执行之后,下句就可以通过cpsr中的z位为1来知道上句相等。)
cmp: cmp r0, r1 等价于 sub r2, r0, r1 (r2 = r0 - r1)
cmn: cmn r0, r1 等价于 add r0, r1
tst: tst r0, #0xf @测试r0的bit0~bit3是否全为0
teq:
mrs & msr
mrs用来读cpsr/spsr,msr用来写cpsr/spsr
CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。
b & bl & bx
b 直接跳转(就没打开算返回)
bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用
bx跳转同时切换到ARM模式,一般用于异常处理的跳转。
ldr/str & ldm/stm & swp(内存和寄存器互换指令)
单个字/半字/字节访问 ldr/str
多字批量访问 ldm/stm m(multiple 多重的)
swp r1, r2, [r0] 把r0作为地址里边的值读取到r1里边,把r2里边的值写回r0里边。
swp r1, r1, [r0] 把r0作为地址里边的值读取到r1里边,把r1原来的值写回r0里边。
swi(software interrupt)
软中断指令用来实现OS中系统调用
ARM指令都是32位的,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分。
合法立即数:经过任意位数的移位后非0部分可以用8位表示的即为合法立即数。
合法立即数:0x000000ff 0x00ff0000 0xf000000f
非法立即数:0x000001ff
更多嵌入式学习笔记、实战项目,点击这里即可免费领取