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+1ADD 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,R2ADC 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:为向目标寄存器传送的数据
如果觉得《ARM-汇编指令集》对你有帮助,请点赞、收藏,并留下你的观点哦!