前言
首先,请问大家几个小小问题,你清楚:
-
ARM汇编中有关数据处理的相关指令有哪些吗?
-
数据处理指令可以分为哪几类呢?
今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:
正文
数据传送指令
MOV:数据传输指令
MOV指令的作用如下:
-
将数据从一个寄存器传送至另一个寄存器;
-
将一个常数传送至一个寄存器;
-
实现单纯的移位操作,左移操作可以实现操作数乘以2的n次方;
-
当PC作为目标寄存器,可直接实现程序的跳转;
MOV指令格式与实例展示如下:
MVN:数据求反传送指令
MVN指令的主要作用如下:
-
向寄存器传送一个负数;
-
生成位掩码;
-
求一个数的反码;
MVN指令格式与实例展示如下:
其中上图中的0x4用二进制数(0x00000100)表示, 然后对其取反得到(0x11111011),可见取反后为负数,因此针对负数求其补码则为储存在R0中的值,先将负数最高位转换为正数(01111011)取反,得到(10000100),加1得到其补码,最后结果为(10000101),即结果为-5;
算法逻辑运算指令
算法逻辑运算涉及到加减乘除,位操作等操作,这些都是汇编语言经常会使用到指令,掌握这些基本指令对分析问题产生很多帮助。
ADD:加法指令
ADD指令顾名思义就是加法指令,目的就是为了实现两个操作数进行相加。
ADD指令格式与实例展示如下:
如上图所示,ADD指令就是将
SUB:减法指令
SUB指令就是为了实现两个操作数相减。
SUB指令格式与实例展示如下:
如上图所示,SUB指令就是从
当SUBS指令与跳转指令结合使用时,便可以实现成循环程序,这样就不需要CMP指令了。
RSB:逆向减法指令
RSB指令用于实现两个数相减。
RSB指令格式与实例展示如下:
如上图所示,RSB指令可以从
ADC:带位加法指令
ADC指令和ADD指令结合使用,可以实现两个64位的操作数相加。
ADC指令格式与实例展示如下:
SBC:带位减法指令
SBC指令与SUBS指令可以联合使用,来实现两个64位的操作数相减。
SBC指令格式与实例展示如下:
需要注意的是在SBCS指令中,如果发生了借位操作,CPSR寄存器中的C标志位设置为0;如果没有发生借位操作,CPSR寄存器中的C标志位设置为1。
RSC:带位逆向减法指令
RSC指令将
RSC指令格式与实例展示如下:
AND:逻辑与操作指令
AND指令就是将如下
AND指令格式与实例展示如下:
BIC:位清除指令
BIC指令就是将
BIC指令格式与实例展示如下:
EOR:逻辑异或操作指令
EOR指令就是将
EOR指令格式与实例展示如下:
ORR:逻辑或操作指令
ORR指令就是将
ORR指令格式与实例展示如下:
比较指令
CMP:比较指令
CMP指令就是从寄存器
CMP指令格式与实例展示如下:
CMN:基于相反数的比较指令
CMN指令是指将寄存器
CMN指令格式与实例展示如下:
TST:位测试指令
TST指令是将
TST指令格式与实例展示如下:
TST指令通常用于测试寄存器中某些位是1还是0,一般会与BEQ或者BNE指令配合使用完成条件判断跳转功能。
TEQ:相等测试指令
TEQ指令就是将
TEQ指令格式与实例展示如下:
TEQ指令通常用来判断两个数是否相等,但这种比较操作不会影响到CPSR寄存器中的V位跟C位;同时,TEQ指令也可用于比较操作数符合是否相同,该指令执行后,CPSR寄存器中的N位位两个操作数符号位做异或的结果。
ARM指令条件码
为提高代码密度,减少ARM指令的数量,几乎所有的ARM指令可以根据CPSR寄存器中的标志位,通过指令组合实现条件执行。
如无条件跳转指令B,我们在其后添加条件码就可组成BEQ,BNE组合指令。BEQ指令表示如何两个数比较,结果相等时则跳转,BNE指令则表示结果不相等时跳转了。
因此有必要将ARM指令条件码列举于此,方便大家及时查阅,及时了解指令的含义以及是否可以被执行。一般而言,条件执行经常出现在跳转或者循环的程序结构中。
————- END ————–
文末福利
-
为便于技术交流,创建了AUTOSAR技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入。
原文始发于微信公众号(ADAS与ECU之吾见):ARM汇编之数据处理指令