ARM体系结构与编程学习笔记2

1:ARM指令分类
1:ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器(PSR)传输指令,load/Store指令,协处理指令和异常中断产生指令
2:ARM指令集字长为固定的32位,一条典型的ARM指令编码格式如下
在这里插入图片描述
在这里插入图片描述
opcode:指令助记符; 如ADD表示算法加操作指令
cond:执行条件;
S:是否影响CPSR寄存器的值;
Rd:目标寄存器;
Rn:第1个操作数的寄存器;
operand2:第2个操作数;
大多数时候可以根据CPSR的条件标志位觉得是否该执行指令。当条件满足时才执行,否则不执行。

条件码16个,指令的条件码
在这里插入图片描述

2.2.1 数据处理指令的操作数寻址方式

ASR :算术右移
LSL:逻辑左移
LSR :逻辑右移
ROR:循环右移
RRX:扩展的循环右移

MOV R0,R1,LSL,#3; R0=R1*(23);
ADD R0,R1,R1,LSL #3; R0=R1+R1*(2
3);
SUB R0,R1,R2,LSR #4 ;R0=R1-R2/(2**4)
MOV R0,R1,ROR,R2 ;R0=R1 循环右移动R2位。

**2.2.2、立即数方式,**必须遵循规则:每一个立即数由一个8位的常数循环右移偶数位得到。公式表达为:立即数 =8位常数循环右移24位二进制数 即immediate=const_8 ROR 2bin_4。
比如,0x104为合法的立即数,而0x101 不是合法的立即数。是不允许在指令中使用的。
2.2.3、寄存器方式,操作数即为寄存器里的数值
2.2.4 寄存器移位方式,操作数是寄存器里的数值移位而得到,有如下移位操作:ASR,LSR,LSL,ROR,RRX等。
2.2.5、根据寻址方式的地址计算方法和地址偏移量可知第二个操作数的内存地址共有如下9种格式
在这里插入图片描述
以第一种格式为例说明第二个操作数的内存地址的计算方法:
[, #+/- ]表示基址寄存器Rn值加或减偏移量,它的指令编码为:
在这里插入图片描述
使用偏移量方法计算内存地址,它的伪代码表示为:

if U == 1 then
    address = Rn + offset_12
else /*U = 0*/
    address = Rn - offset_12    

4、杂类Load/Store指令的寻址方式
4.1、指令的语法格式如下:
这里写图片描述

4.2、指令中内存单元的寻址方式有以下6种:
在这里插入图片描述

offset_8 = (immedH << 4) OR immedL
if U == 1 then
    address = Rn + offset_8
else /*U = 0*/
    address = Rn - offset_8
if ConditionPassed(cond) then
    Rn = address

5、批量Load/Store指令的寻址方式
5.1、指令功能是实现在一组寄存器和一块连续的内存单元之间传输数据
5.2、它的语法格式和指令编码格式如下
在这里插入图片描述
P位表示基址寄存器Rn所指的内存单元是否包含在指令使用的内存块中。
U位表示地址变化的方向
W位表示指令执行后,基址寄存器Rn的值是否更新
L位表示操作的类型
5.3、address_mode表示地址变化方式,有四种,如下所示:
在这里插入图片描述
以(DA)事后递减(U=0)方式 为例说明内存地址的计算方法
DA指令编码格式如下: 以(DA)事后递减(U=0)方式 为例说明内存地址的计算方法
DA指令编码格式如下:
在这里插入图片描述

start_address = Rn-(Number_Of_Set_Bits_In(register_list)*4)+4
end_address =Rn
if ConditionPassed(cond) and W == 1 then
    Rn = Rn - (Number_Of_Set_Bits_In(register_list) * 4)

猜你喜欢

转载自blog.csdn.net/qq_35989861/article/details/84181999