在(2)中基本上把ARM的存储访问指令过了一遍,今天搞搞其他类型的指令。
文章结构
(2)数据处理指令
数据处理指令大致可分为3类:
数据传送指令;
算术逻辑运算指令;
比较指令。
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。
① 数据传送指令-MOV,MVN
MOV指令将8位图立即数或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。
同类型的指令还有MVN,它可以实现数据的非传递,即把操作数取反后送至目标寄存器。
.MOV指令与LDR指令都是往目标寄存器中传送数据,但是它们有什么区别吗?
MOV指令用于将数据从一个寄存器传送到另一个寄存器中,或者将一个常数传送到一个寄存器中,但是不能访问内存。LDR指令用于从内存中读取数据放入寄存器中
② 算术逻辑运算指令;
算术逻辑运算指令包括“加/减”以及“与/或/异或”等指令,它们的格式如下:
③ 比较指令-不用加S标志位都会影响标志位,别的都不行
比较指令将两个数值进行的特定运算,根据运算结果影响CPSR的相关标志位,用于后面程序的条件执行,但是运算结果不予保存。
④ 乘法指令
对64位乘法指令而言,RdLo存储两个操作寄存器运算结果的低32位,RdHo存储高32位。另外,32位乘加指令的加操作数是通过一个寄存器另外给的,而64位乘加指令的加操作数是存储运算结果的两个操作数。
(3)ARM分支指令
在ARM中有两种方式可以实现程序的跳转:
1.直接向PC寄存器赋值实现跳转;
例: MOV PC,R14
2.使用分支指令直接跳转
① 分支指令“B”
B:分支指令,跳转目标地址基于PC的偏移量,为24位常数(4G),因为用来表示目标地址的位数有限,B指令无法实现4G范围内的任意跳转。
② 分支指令“BL”
带链接的分支指令——BL指令除了具有跳转功能,还能在跳转之前将下一条指令的地址拷贝到R14(即LR) 链接寄存器中,它适用于子程序调用(调用完之后还会返回,返回后可以直接读取跳转前的下一条指令)。跳转范围限制在当前指令的±32M字节地址内。指令格式如下:
在Addr1时进行跳转,同时将Addr2存入链接寄存器LR,使用 MOV PC LR,直接将链接寄存器存入PC,起到返回addr2的作用。很方便。
③ 分支指令“BX”
带状态切换的分支指令——BX指令除了具有跳转功能,还能在跳转的同时切换处理器状态。其跳转范围不受限制。指令格式如下:
(4)协处理器指令
ARM内核支持协处理器操作,协处理器的控制要通过协处理器命令实现。
① CDP——协处理器数据操作指令
ARM处理器通过CDP指令通知ARM协处理器执行特定的操作。协处理器数据操作完全是协处理器内部的操作,用于初始化ARM协处理器,完成协处理器寄存器的状态改变。
指令特点:
该操作由协处理器完成,即对命令参数的解释与协处理器有关,指令的使用取决于协处理器。
若协处理器不能成功地执行该操作,将产生未定义指令异常中断。
② LDC/STC——协处理器数据存/取指令
协处理器数据存/取指令从存储器读取数据装入协处理器寄存器,或将协处理器寄存器的数据存入存储器。
LDC——协处理器数据读取指令,LDC指令从某一连续的内存单元将数据读取到协处理器的寄存器中。进行协处理器数据的数据传送时,由协处理器来控制传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。