失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > ARM-汇编指令集

ARM-汇编指令集

时间:2022-12-16 05:04:55

相关推荐

ARM-汇编指令集

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-汇编指令集》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。