ARM 指令集
ARM 指令集分为 6 类:
- 跳转指令
- 数据处理指令
- 程序状态寄存器(PSR)转移指令
- Load/Store 指令
- 协处理器指令
- 异常中断产生指令
指令的一般格式
ARM 指令的一般编码格式
<opcode> {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
opcode:是指令助记符,如 ADD 表示算数加法操作指令
cond:表示指令执行的条件
S:决定指令的操作是否影响 CPSR 的值
Rd:表示目标寄存器
Rn:表示包含第 1 个操作数的寄存器
shifter_operand:表示第 2 个操作数
跳转指令
- B 跳转指令
- BL 带返回的跳转指令
- 执行跳转操作的同时还将 PC 寄存器的值保存在 LR 寄存器中,BL 指令用于实现子程序调用,子程序的返回可以通过将 LR 寄存器的值复制到 PC 寄存器中来实现
- BX 带状态切换的跳转指令
- BX 指令跳转到指令中指定的目标地址,目标地址处的指令可以是 ARM 指令,也可以是 Thumb 指令
- BLX 带返回和状态切换的跳转指令
- 从 ARM 指令跳转到指令中指定的目标地址,目标地址可以是 ARM 指令,也可以是 Thumb 指令
数据处理指令
数据处理指令又分为三类
数据传送指令:如 MOV
算数逻辑运算指令:如 ADD
比较指令:如 TST
- MOV:数据传送指令
- MVN:数据求反传送指令
- CMP:比较指令
- CMN:基于相反数的比较指令
- TST:位测试指令
- TEQ:相等测试指令
- ADD:加法指令
- SUB:减法指令
- RSB:逆向加法指令
- ADC:带位加法指令
- SBC:带位减法指令
- RSC:带位逆向减法指令
- AND:逻辑与操作指令
- BIC:位清除指令
- EOR:逻辑异或操作指令
- ORR:逻辑或操作指令
MOV 传送指令
MOV 指令将 <shifter_operand> 表示的数据传送到目标寄存器 中,并根据操作的结果更新 CPSR 相应的条件标志位
指令的语法格式:
MOV {<cond>}{S} <Rd>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
shifter_operand:为向目标寄存器传送的数据
MOV 指令完成的功能:
- 将数据从一个寄存器传送到另一个寄存器
- 将一个常数传送到一个寄存器中
- 实现单纯的移位操作。左移操作可以实现将操作数乘以 2 n 次方
- 当 PC 寄存器作为目标寄存器是可以程序跳转。这种跳转可以实现子程序调用以及从子程序中返回
- 当 PC 寄存器作为目标寄存器且指令中 S 位被设置时,指令在执行跳转操作的同时,将当前处理器模式的 SPSR 寄存器内容复制到 CPSR 中。这样 MOVS PC,LR 可以实现从某些异常中断中返回。
MVN 传送指令
MVN 指令将 <shifter_operand> 表示的数据的反码传送到目标寄存器 中,并根据操作的结果更新 CPSR 相应的条件标志位
指令的语法格式:
MVN {<cond>}{S} <Rd>,<shifter_operand>
其中各参数的用法与 MOV 传送指令相同
MVN 指令有以下用途
ADD 加法指令
ADD 指令将 <shifter_operand> 表示的数据与寄存器 中的值相加,并把结果保存在目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的标志位
ADD 指令实现两个操作数相加
指令的语法格式
ADD {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
示例:
ADD Rx, Rx,#1 ;Rx=Rx+1
ADD Rd, Rx, Rx, LSL, #n ;Rd=Rx+Rx*(2*n)
ADD Rs, PC, #offset ;生成基于 PC 的跳转指针
ADC 带位加法指令
ADC 指令将 <shifter_operand> 表示的数据与寄存器 中的值相加,再加上 CPSR 中 C 条件标志位的值,并把结果保存在目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的标志位
指令的语法格式
ADC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
ADC 指令和 ADD 指令联合使用可以实现两个 64 位的操作数相加。
如果寄存器 R0 和 R1 中放置一个 64 位的源操作数,其中 R0 中放置低 32 位数值,R1 中放置高 32 位数据,
如果寄存器 R2 和 R3 中放置另一个 64 位的源操作数,其中 R2 中放置低 32 位数值,R3 中放置高 32 位数据,
下面的指令序列实现了两个 64 位操作数的加法操作
ADDS R4,R0,R2
ADC R5,R1,R3
若将 ADC R5,R1,R3 指令改为 ADCS R5,R1,R3,操作结果将影响到 CPSR 寄存器中相应的条件标志位的值
SUB 减法指令
SUB 指令从寄存器 中减去 <shifter_operand> 表示的数值,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
SUB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
SUB 指令实现两个操作数相减
示例:
SUB Rx,RX,#1 ;Rx=Rx-1
SBC 带位减法指令
SBC 指令从寄存器 中减去 <shifter_operand> 表示的数值,再减去 CPSR 中 C 条件标志位的反码,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
SBC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
RSB 逆向减法指令
RSB 指令从 <shifter_operand> 表示的数值中减去寄存器 值,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
RSB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
示例:
RSB Rd, Rx, #0; Rd=-Rx
RSC 带位逆向减法指令
RSC 指令从 <shifter_operand> 表示的数值中减去寄存器 值,再减去寄存器 CPSR 中 C 条件标志位的反码,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
RSC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
AND 逻辑与操作指令
AND 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑与操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
AND {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
ORR 逻辑或操作指令
ORR 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑或操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
ORR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
EOR 逻辑或操作指令
EOR 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑异或操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
EOR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
BIC 位清除指令
BIC 指令将 <shifter_operand> 表示的数值中与寄存器 的值的反码按位做逻辑与操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。
指令的语法格式
BIC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>
cond:为指令执行的条件码
S:决定指令的操作是否影响 CPSR 中条件标志位的值
Rd:寄存器为目标寄存器
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
CMP 比较指令
CMP 指令从寄存器 中减去 <shifter_operand> 表示的数值,根据操作的结果更新 CPSR 中相应的条件标志位,后面的指令就可以根据 CPSR 中相应的条件标志位来判断是否执行。
指令的语法格式
CMP {<cond>}<Rn>,<shifter_operand>
cond:为指令执行的条件码
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
CMN 基于相反数的比较指令
CMN 指令从寄存器 中加上 <shifter_operand> 表示的数值,根据操作的结果更新 CPSR 中相应的条件标志位,后面的指令就可以根据 CPSR 中相应的条件标志位来判断是否执行。
指令的语法格式
CMN {<cond>}<Rn>,<shifter_operand>
cond:为指令执行的条件码
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
TST 位测试指令
TST 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑与操作,根据操作的结果更新 CPSR 中相应的条件标志位
指令的语法格式
TST {<cond>}<Rn>,<shifter_operand>
cond:为指令执行的条件码
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
TEQ 相等测试指令
TEQ 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑异或操作,根据操作的结果更新 CPSR 中相应的条件标志位
指令的语法格式
TST {<cond>}<Rn>,<shifter_operand>
cond:为指令执行的条件码
Rn:寄存器为第 1 个源操作数所在的寄存器
shifter_operand:为向目标寄存器传送的数据
|