数据处理指令
(1)数据传输指令 mov mvn
(2)算术指令 add sub rsb adc sbc rsc
(3)逻辑指令 and orr eor bic //与或非
(4)比较指令 cmp cmn tst teq
(5)乘法指令 mvl mla umull umlal smull smlal
(6)前导零计数 clz (用的不多)
详细分析:
mov r1, r0 @两个寄存器之间数据传递,r0赋值给r1
mov r1, #0x0 @将立即数赋值给寄存器,0赋值给r1
mvn和mov用法一样,区别在于,mvn是安慰取反后在赋值
譬如:r1 = 0xff,
(1)mov r0, r1后,r0 = 0xff;
(2)mvn r0, r1后,r0 = 0xffff00;
bic bic r0, r0, #0x1f @读出r0中的bit0到bit4清零后赋值给r0
cmp cmp r0, r1 等价于 sub r2, r0, r1 @比较指令天生就会影响cpsr的标志位
cmn cmn r0, r1 等价于 add r2, r0, r1
tst tst r0, #0xf @测试r0的bit0~bit3是否全为0
常用ARM指令2:cpsr访问指令
mrs & msr
mrs用来读psr,msr用来写psr
CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。
cpsr和spsr的区别和联系:cpsr是程序状态寄存器,整个SOC就只有一个,而spsr有5个
举例:
@mrs r0, cpsr @把cpsr中的读取到r0中
@bic r0,r0,#0x1f @将低5位清零,
@orr r0,r0,#0xd3 @11010011,禁止中断和快速中断
@msr cpsr, r0 @把r0的值写入cpsr
msrcpsr_c, #0xd3 @把cpsr的特定位改成0xd3。本句代码效果等价于上面4句
常用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位表示的,即为合法立即数
常用ARM指令5:软中断指令
swi(software interrupt) 软中断指令用来实现操作系统中系统调用