ARM汇编之数据处理指令

ARM汇编之数据处理指令

前言

首先,请问大家几个小小问题,你清楚:

  • ARM汇编中有关数据处理的相关指令有哪些吗?
  • 数据处理指令可以分为哪几类呢?

今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:

在这里插入图片描述


正文

数据传送指令

MOV:数据传输指令

MOV指令的作用如下:

  • 将数据从一个寄存器传送至另一个寄存器;
  • 将一个常数传送至一个寄存器;
  • 实现单纯的移位操作,左移操作可以实现操作数乘以2的n次方;
  • 当PC作为目标寄存器,可直接实现程序的跳转;

MOV指令格式与实例展示如下:

在这里插入图片描述

图1 MOV指令格式说明与实例

MVN:数据求反传送指令

MVN指令的主要作用如下:

  • 向寄存器传送一个负数;
  • 生成位掩码;
  • 求一个数的反码;

MVN指令格式与实例展示如下:

在这里插入图片描述

图2 MVN指令格式说明与实例

其中上图中的0x4用二进制数(0x00000100)表示, 然后对其取反得到(0x11111011),可见取反后为负数,因此针对负数求其补码则为储存在R0中的值,先将负数最高位转换为正数(01111011)取反,得到(10000100),加1得到其补码,最后结果为(10000101),即结果为-5;

算法逻辑运算指令

算法逻辑运算涉及到加减乘除,位操作等操作,这些都是汇编语言经常会使用到指令,掌握这些基本指令对分析问题产生很多帮助。

ADD:加法指令

ADD指令顾名思义就是加法指令,目的就是为了实现两个操作数进行相加。

ADD指令格式与实例展示如下:

在这里插入图片描述

图3 ADD指令格式说明与实例

如上图所示,ADD指令就是将<shift_operand>表示的数据与寄存器中的值相加,并把结果保存到目标寄存器中,同时根据操作的结果更新CPSR中相应的条件标志位。

SUB:减法指令

SUB指令就是为了实现两个操作数相减。

SUB指令格式与实例展示如下:

在这里插入图片描述

图4 ADD指令格式说明与实例

如上图所示,SUB指令就是从中减去<shift_operand>表示的数值,并把结果保存至目标寄存器中中,同时,根据操作的结果更新CPSR中的相应的条件标志位;

当SUBS指令与跳转指令结合使用时,便可以实现成循环程序,这样就不需要CMP指令了。

RSB:逆向减法指令

RSB指令用于实现两个数相减。

RSB指令格式与实例展示如下:

在这里插入图片描述

图5 RSB指令格式说明与实例

如上图所示,RSB指令可以从<shifter_operand>表示的数值中减去寄存器值,并把结果保存到目标寄存器中,同时根据操作的结果更新CPSR中相应的条件标志位。

ADC:带位加法指令

ADC指令和ADD指令结合使用,可以实现两个64位的操作数相加。

ADC指令格式与实例展示如下:

在这里插入图片描述

图6 ADC指令格式说明与实例

SBC:带位减法指令

SBC指令与SUBS指令可以联合使用,来实现两个64位的操作数相减。

SBC指令格式与实例展示如下:

在这里插入图片描述

图7 SBC指令格式说明与实例

需要注意的是在SBCS指令中,如果发生了借位操作,CPSR寄存器中的C标志位设置为0;如果没有发生借位操作,CPSR寄存器中的C标志位设置为1。

RSC:带位逆向减法指令

RSC指令将<shifter_operand>表示的数值减去寄存器的值,再减去寄存器CPSR中C条件标志位的反码,并把结果保存到目标寄存器z中,同时,根据操作的结果更新CPSR寄存器中的条件标志位。

RSC指令格式与实例展示如下:

在这里插入图片描述

图8 RSC指令格式说明与实例

AND:逻辑与操作指令

AND指令就是将如下<shifter_operand>表示的数值与寄存器的值按位做逻辑与操作,并把结果保存到目标寄存器中,同时根据是否存在S来决定是否将操作的结果更新CPSR寄存器的条件标志位中的值。

AND指令格式与实例展示如下:

在这里插入图片描述

图9 ADD指令格式说明与实例

BIC:位清除指令

BIC指令就是将<shifter_operand>表示的数值与寄存器的值的反码按位做逻辑与操作,并把结果保存到目标寄存器中,同时根据操作的结果更新CPSR中的相应的条件标志位。

BIC指令格式与实例展示如下:

在这里插入图片描述

图10 BIC指令格式说明与实例

EOR:逻辑异或操作指令

EOR指令就是将<shifter_operand>表示的数值与寄存器的值按位做逻辑异或操作,并将结果保存进目标寄存器中,同时,根据操作的结果更新CPSR中相应的条件标志位。

EOR指令格式与实例展示如下:

在这里插入图片描述

图11 EOR指令格式说明与实例

ORR:逻辑或操作指令

ORR指令就是将<shifter_operand>表示的数值与寄存器的值按位做逻辑或操作,并将结果保存至目标寄存器中,同时,根据操作的结果更新CPSR中相应的条件标志位。

ORR指令格式与实例展示如下:

在这里插入图片描述

图12 ORR指令格式说明与实例
比较指令

CMP:比较指令

CMP指令就是从寄存器中减去表示的数值,根据操作的结果更新CPSR中的条件标志位,该更新是默认更新,无需是否添加"S"。

CMP指令格式与实例展示如下:

在这里插入图片描述

图13 CMP指令格式说明与实例

CMN:基于相反数的比较指令

CMN指令是指将寄存器中的值加上<shifter_operand>表示的数值,根据操作的结果更新CPSR中的条件标志位,该更新是默认更新,无需是否添加"S"。

CMN指令格式与实例展示如下:

在这里插入图片描述

图14 CMN指令格式说明与实例

TST:位测试指令

TST指令是将<shifter_operand>表示的数值与寄存器的值按位做逻辑与操作,根据操作的结果更新CPSR中相应的条件标志位。

TST指令格式与实例展示如下:

在这里插入图片描述

图15 TST指令格式说明与实例

TST指令通常用于测试寄存器中某些位是1还是0,一般会与BEQ或者BNE指令配合使用完成条件判断跳转功能。

TEQ:相等测试指令

TEQ指令就是将<shifter_operand>表示的数值与寄存器的值按位做逻辑异或操作,根据操作的结果更新CPSR中相应的条件判断位。

TEQ指令格式与实例展示如下:

在这里插入图片描述

图16 TEQ指令格式说明与实例

TEQ指令通常用来判断两个数是否相等,但这种比较操作不会影响到CPSR寄存器中的V位跟C位;同时,TEQ指令也可用于比较操作数符合是否相同,该指令执行后,CPSR寄存器中的N位位两个操作数符号位做异或的结果。

ARM指令条件码

为提高代码密度,减少ARM指令的数量,几乎所有的ARM指令可以根据CPSR寄存器中的标志位,通过指令组合实现条件执行。

如无条件跳转指令B,我们在其后添加条件码就可组成BEQ,BNE组合指令。BEQ指令表示如何两个数比较,结果相等时则跳转,BNE指令则表示结果不相等时跳转了。

因此有必要将ARM指令条件码列举于此,方便大家及时查阅,及时了解指令的含义以及是否可以被执行。一般而言,条件执行经常出现在跳转或者循环的程序结构中。

在这里插入图片描述

图17 ARM条件码列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车小T

感谢打赏,我会继续努力奉献精彩

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值