指令条件:
一、跳转指令
a) 在跳转前保存当前地址:
MOV LR, PC ;可以实现4GB地址空间的任意跳转
b) 跳转指令:
可以完成从当前指令向前或者向后的32MB的地址空间的跳转
i. B 直接跳转
ii. BL 待返回的跳转指令
iii. BLX 待返回和状态切换的跳转指令
iv. BX 带状态切换的跳转指令
c) B: 有去无回跳转
i. 格式:
B{条件} 目标地址;
ii. 无条件跳转:
B Label ; 程序无条件跳转到标号Lalel
iii. 有条件跳转:
CMP R1, #0
BEQ Label ; R1 == 0
; 当CPSR寄存器中的Z条件码置位时跳转
d) BL: 可返回跳转
i. 格式:
BL{条件} 目标地址
ii. 在跳转之前,会在寄存器R14中保存PC当前值,可以通过重新加载R14到PC中,来返回跳转
iii. 可返回跳转:
BL Label ; 当程序无条件跳转到标号Label,同时将当前pc 值保存到R14中
e) BLX: ARM → Thumb
i. 格式:
BLX 目标地址
ii. BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM切换到Thumb状态;
该指令同时将pc当前内容保存到寄存器R14中:
iii. 调用者: 使用ARM指令集
iv. 子程序: 使用Thumb指令集
f) BX: → ARM、Thumb
i. 格式:
BX{条件} 目标地址
ii. BX: 跳转到指令中所指定的目标地址,目标地址可以是ARM指令,也可以是Thumb指令。
二、数据处理指令
数据处理指令: 数据传送指令 /算术逻辑运算指令 /比较指令
算术逻辑指令: 将运算结果保存在目的寄存器中, 同时更新CPSR中的相应条件标志位.
1) MOV
i. MOV{条件}{S} 目的寄存器,源操作数
MOV R1, R0 ; 将寄存器R0的值传送到寄存器R1
MOV PC, R14 ; 将R14的值传送到PC,子程序返回
MOV R1, R0, LSL#3 ; 将寄存器R0的值左移3位送到R1
2) MVN : 取反
i. MVN{条件}{S} 目的寄存器,源操作数
MVN R0, #0XFF ; R0 ← ~0XFF
3) CMP
把两个寄存器的内容或立即数进行比较, 同时更新CPSR中条件标志位.
i. CMP{条件} 操作数1,操作数2
CMP R1, R0
CMP R1, #100
4) TST: 测试
i. TST{条件} 操作数1,操作数2 ; 操作数2是一个位掩码
TST R1, #%1 ; 测试R1中最低位是否置位(%表示二进制)
5) ADD
i. ADD{条件}{S} 目的寄存器,操作数1, 操作数2
ADD R0, R1, R2 ; R0 = R1 + R2
ADD R0, R2, R3, LSL#1 ; R0 = R2 + (R3 << 1)
6) SUB
i. SUB{条件}{S} 目的寄存器,操作数1, 操作数2
SUB R0, R1, #255 ; R0 = R1 - 255
SUB R0, R2, R3, LSL#1 ; R0 = R2 - (R3 << 1)
7) AND
i. AND{条件}{S} 目的寄存器,操作数1, 操作数2
AND R0, R0, #3 ; 保持R0的0, 1位,其余位清零
8) ORR: 置位某位
i. ORR{条件}{S} 目的寄存器,操作数1, 操作数2
ORR R0, R0, #3 ; 置位R0的0,1位,其余保持.
9) BIC: 清零某位 (Bit Clear)
i. BIC{cond}{S} Rd, Rn, operand2 ;清除Rn的某位结果放于Rd,operand2为32位掩码
BIC R0, R0, #%1011 ; 将R0的0,1,3位清零
10) MUL
i. MUL{条件}{S} 目的寄存器,操作数1, 操作数2
MUL R0, R1, R2 ; R0 = R1 * R2
11) MULS
MULS R0, R1, R2 ;同时设置CPSR相关标志位
三、程序状态寄存器访问指令
PST : Program Status Register, 程序状态寄存器
1) MRS : Move PSR to register
MRS{条件} 通用寄存器,程序状态寄存器(CPSR / SPSR)
MRS R0, CPSR ; 传送CPSR的内容到R0
MRS R0, SPSR ; 传送SPSR的内容到R0
2) MSR : Move register to PSR
MSR{条件} 程序状态寄存器_<域>,操作数
MSR CPSR, R0 ; 传送R0的内容到CPSR
MSR SPSR, R0 ; 传送R0的内容到SPSR
MSR CPSR_c, R0 ; 传送R0到SPSR,但仅修改SPSR 中的控制位域.