数据处理指令

数据处理指令只能处理寄存器中的数据,内存中的数据需要通过加载指令加载到寄存器中进行处理。

助记符 说明 操作
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 指令同步隔离