一、常用ARM指令:
1、数据处理指令:
(1)、mov r0, r1 两个寄存器之间数据传递。
(2)mvn r0, r1 两个寄存器间按位取反数据传递。
2、算述指令:
(1), (add 加; Sub 减; rsb 反减; abc sbc rsc )
(2)逻辑指令:(and 与;orr或; eor异或; bic按位清零 )不加S也影响标志位(N、Z、C、V)。
(3)乘法指令:( mvl; mla; umull; umlal; smull; smlal; )
(4)前导计数: CLZ 看一个数前面有几个零。
示例:
bic r0, r1, #0x1F 将r1中的bit0到bit4清零后赋值给r0。
bic r0, r0, #0x1F注意:汇编寄存器不能直接清零,必须像行前代码一样,先读出来,清零再写回去。
比较指令:用来比较2个寄存器中的数,注意比较指令不用加S后缀就可以影响CPSR中的标志位,经过比较结果放入标志位。
示例:
Cmp r0, r1 等价于r0减r1是否为零。
Sub r2, r0, r1 等价于(r2 = r0 - r1)
Cmn r0, r1 等价于 add r0, r1。
Tst r0, #0xF 测试r0的0bit至3bit是否全为零。
Teq 对两个数异或。
3、CPSR、SPSR访问指令:
(1)、CPSR和SPSR的区别和联系:CPSR是程序状态寄存器,整个SOC中只有一个;而SPSR有5个(对应5种异常模式),作用是当从普通模式进入异常模式时,用来保存之前普通模式下的CPSR的。目的是返回普通模式时恢复原来的CPSR。
(2)CPSR是一个比较特殊的寄存器,所以有专门的读写指令,
(3)、MSR_C CPSR把32位每几位分组起一个名字(后缀C等字母区分),C表示mode标志位,在这CPSR_C表示只操作mode位。
mrs用来读,msr用来写;psr是SPSR和CPSR的通称。
4、跳转(分支)指令:( .b 、bl、 bx )
.b: 直接跳转就没打算返回,绝对跳转goto。
Bl: 跳转前把返回地址放入LR中,以便返回,以便用于函数调用(一般也用在函数调用)。
Bx: 跳转同时切换到ARM模式,一般用于异常处理的跳转。
5、访问内存指令:
(1)、ldr 读 / str写 与 ldm 读 / stm 写。
Ldr / str 加后娺实现,单字/半字/字节访问。
Ldm/stm 多字节批量访问。
(3)、SWP r1, r2, [r0] 将r0中地址指向的数据放入r1,再把r2的数据放入r0指向的地址里。SWP r1, r1, [r0]用同一个寄存器可以实现r1与r0互换,达到寄存器和内存交换数据的目的。
6、指令中的立即数:
(1)、合法立即数与非法立即数(32用来表示什么?划分多少位用来表示指令,多少位表示数字),本质是32位除去指令的位数,余下的才能放立即数,所以不可能32位全表示立即数,立即数只能占一部分位段。
(2)、ARM指令都是32位,除指令标记(操作数如:r0,r1等)和操作标记(指令后缀)外,本身只能附带很少位的立即数(还有多少位能真正表示数字)。
(3)合法立即数判定:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数。
(4)伪指令中不用判断立即数的合法性(编译器帮助转换),但在指令中必须用合法立即数。
(5)在指令中#0x1f、 =0x1f;数字前面用#开头的表示是立即数。=开头的不是立即数。
立即区分数示例:
合法:0XFF 等价0X 00 00 00 FF; 0X00 FF 00 00 可移位实现。
非法立即数: 0X 00 00 01 FF;
7、软件中断指令:
(1)、swi: 用软件产生中断。软中断指令用来实现操作系统中系统调用。