数据处理指令
数据处理指令只能处理寄存器中的数据,内存中的数据需要通过加载指令加载到寄存器中进行处理。
助记符 |
说明 |
操作 |
MOV Rd,operand2 |
数据传送 |
Rd <- operand2 |
MVN Rd,operand2 |
数据非传送 |
Rd <- (~operand2) |
算术运算指令
助记符 |
说明 |
操作 |
ADD Rd,Rn,operand2 |
加法 |
Rd <- Rn + operand2 |
SUB Rd,Rn,operand2 |
减法 |
Rd <- Rn - operand2 |
RSB Rd,Rn,operand2 |
逆向减法 |
Rd <- operand2 - Rn |
ADC Rd,Rn,operand2 |
带进位加法 |
Rd <- Rn + operand2 + Carry |
SBC Rd,Rn,operand2 |
带进位减法 |
Rd <- Rn - operand2 - (NOT)Carry |
RSC Rd,Rn,operand2 |
带进位逆向减法 |
Rd <- operand2 - Rn - (NOT) Carry |
例子:
这个小例子实现 64 位的加法,两个数分别存放在 [r1,r0] 和 [r3,r2] 中,结果存放在[r1,r0]中。
adds r0,r0,r2
adc r1,r1,r3
其中 adds 最后的 s 表示该条指令影响标志位。相应的一个 96 位减法的例子如下:
subs r3,r6,r9
sbcs r4,r7,r10
sbc r5,r8,r11
应该注意的是 sbc 指令最后是减去 Carry 位的反码,这是因为减法运算(包括 CMP),当
运算产生了借位时(无符号数溢出),C=0,否则 C=1。
逻辑运算指令
助记符 |
说明 |
操作 |
AND Rd,Rn,operand2 |
逻辑与 |
Rd <- Rn & operand2 |
ORR Rd,Rn,operand2 |
逻辑或 |
Rd <- Rn |
EOR Rd,Rn,operand2 |
逻辑异或 |
Rd <- Rn ^ operand2 |
BIC Rd,Rn,operand2 |
位清除 |
Rd <- Rn & (~operand2) |
比较指令
比较指令不保存运算结果,只影响相应的标志位。
助记符 |
说明 |
操作 |
CMP Rn,operand2 |
比较 |
标志位(NZCV) <- Rn - operand2 |
CMN Rn,operand2 |
负数比较 |
标志位(NZCV <- Rn + operand2 |
TST Rn,operand2 |
位测试 |
标志位(NZCV <- Rn & operand2 |
TEQ Rn,operand2 |
相等测试指令 |
标志位(NZCV <- Rn ^ operand2 |
TST指令测试相应比特位是否置位,主要是影响 Z 位,通常与 EQ 和 NE 条件码配合使用,当所有测试位均
为 0 时,EQ 有效,否则 NE 有效。
CPSR/SPSR 读写指令
助记符 |
说明 |
MSR{cond} APSR_flags, Rm |
对 CPSR/SPSR 进行写操作 |
MRS{cond} Rn, CPSR/SPSR |
对 CPSR/SPSR 进行读操作 |
协处理器指令
助记符 |
说明 |
MCR |
ARM寄存器到协处理器的寄存器的数据传送 |
MRC |
协处理器的寄存器到ARM寄存器的数据传送 |
CDP |
协处理器数据操作指令 |
LDC |
协处理器数据加载指令 |
STC |
协处理器数据存储指令 |
隔离(同步)指令
助记符 |
说明 |
DMB |
数据存储器隔离 |
DSB |
数据同步隔离 |
ISB |
指令同步隔离 |