文章结构
2.ARM微处理器的指令系统
ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
ARM微处理器的指令集可以分为六大类 :
跳转指令
数据处理指令
程序状态寄存器(PSR)处理指令
加载/存储指令
协处理器指令
异常产生指令
(1)ARM指令格式
ARM指令的基本格式如下:
其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下:
(2)第二操作数的灵活使用
第二个操作数有很大的灵活性,灵活的使用它能够提高代码效率。它有如下形式
① #immed_8r——常数表达式;
该常数必须对应8位位图(32位中只能有八位有效位,剩下的左右侧都为0),即必须是一个8位的常数通过循环右移偶数位可以得到的数。(注意三个条件,移位前只能有8位,必须移动偶数位)
Why?–整个指令只有32位,一个数字不能占用太多,因此数字必须在8位,移动偶数位是规定的。
② Rm——寄存器方式;
在寄存器方式下,操作数即为寄存器的数值。
例如:
SUB R1,R1,R2
MOV PC,R0
③ Rm,shift——寄存器移位方式;
将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下:
逻辑左移:logic,left,LSL:寄存器中字的低端空出的位补0
逻辑右移:LSR:寄存器中字的高端空出的位补0
ASR:移位过程中保持符号位不变;
ROR:由字的低端移出的位填入字的高端
RRX:操作数右移1位,高端空出的位用原C(程序状态字)标志值填充,C标志值用移出的最低位填充
(3)条件码
使用条件码“cond”可以实现高效的逻辑操作,提高代码效率。
绝大部分的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。
(4)ARM指令种类
① 存储器访问指令
ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。
② 单寄存器存取
通过添加后缀实现各种方式的存取
i.地址形式
.这些地址应该如何表示出来呢?R0:基址寄存器
注意他们的形式,中括号出现的位置很重要。感叹号的意思是,将RN+OX04传送过后,给RN的内容加上这个值。没有感叹号的话,Rn本身的内容不要更改。
③ 多寄存器存取
多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。
他也可以搭配不同的指令实现不同的地址增长方式。
IA:increase after IB:increase before 传送前增加,传送后增加
DA:decrease after
ii.传输实例
IB,DB在数据传输前进行地址的加减,因为一个存储单元32位,4字节,因此每次+or-4.相反,IA,DA在数据传输完成后进行地址的加减。
注意无论是LDM还是STM,改变地址值的都是R1,装载时R1的地址不断增加,每增加一次将内容传入到其中一个目的寄存器。而在STM中,R1每增加一次,就将一个源寄存器的值装载到R1当前的地址上。
iii.多寄存器存取与堆栈操作指令
FD:FULL Decrease ED:empty decrease
由于是压栈操作,我们先存储LR,再存储R7-R0,存储顺序与列表顺序恰好相反。STM指令使用了FD后缀,full increase,full代表了,堆栈指针指向堆栈的最顶部元素,D代表了每次操作结束,SP指向的地址值-4.因此会产生如下的结果