第3章 ARM指令集寻址方式—数据处理指令寻址方式

一、数据处理指令寻址方式

1、数据处理指令第二操作数的构成方式

数据处理指令第二操作数operand2的构成有三种格式:

1)立即数方式

每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即

<immediate>=immed_8进行32位循环右移(2*rotate_4)位

规则:当立即数值在0~0xff范围时,令immed_8=immediate,rotate_4=0;在其他情况下,汇编编译器选择使rotate_4数值最小的编码方式。

2)寄存器方式

操作数即为寄存器的数值,例如:

MOV R3, R2                         ; R3=R2

ADD R0, R1, R2                   ; R0 = R1+R2

3)寄存器移位方式

操作数为寄存器的数值做相应的移位而得到。

在ARM指令中移位操作包括逻辑左移(LSL)、逻辑右移(LSR)、算术左移(ASL)、算术右移(ASR)、循环右移(ROR)和带扩展的循环右移(RRX),这些操作的功能如图3-1所示。

LSL 逻辑左移:空出的最低有效位用0填充。

LSR 逻辑右移:空出的最高有效位用0填充。

ASL 算术左移:同LSL。

ASR 算术右移:空出的最高有效位用“符号位”填充。

ROR 循环右移:移出的最低有效位依次填入空出的最高有效位。

RRX 带扩展的循环右移:将寄存器内容循环右移1位,空位用原来的C标志位填充,移出的最低有效位填入C标志位。备注:C标志位为bit[29]。

2、具体寻址类型

数据处理指令寻址方式具体可分为5种类型,分别介绍。

1)第二操作数为立即数

汇编语法格式:

#<immediate>

立即数以“#”为前缀,16进制数值时以“0x”表示。

指令编码格式如下:

cond(bit[31:28]):指令执行的条件码。备注:N、Z、C、V。

type(bit[27:26]):指令类型码,00代表数据处理指令及杂类Load/Store指令。

I(bit[25]):第二操作数类型标志码。在数据处理指令里I=1时表示第二操作数是立即数。

opcode(bit[24:21]):指令操作码。

S(bit[20]):决定指令的操作结果是否影响CPSR。

Rn(bit[19:16]):包含第一个操作数的寄存器编码。

Rd(bit[15:12]):目标寄存器编码。

operand2(bit[11:0]):指令第二个操作数。

其中由一个8位的常数immed_8进行32位循环右移rotate_4的2倍位得到的立即数immediate作为数据处理指令的第二操作数。例如:

MOV R0, #0xFC0           ;R0=0xFC0

2)第二操作数为寄存器

汇编语法格式:

<Rm>

指令编码格式如下:

cond(bit[31:28]):指令执行的条件码。备注:N、Z、C、V。

type(bit[27:26]):指令类型码,00代表数据处理指令及杂类Load/Store指令。

I(bit[25]):第二操作数类型标志码。在数据处理指令里I=0时表示第二操作数是寄存器。

opcode(bit[24:21]):指令操作码。

S(bit[20]):决定指令的操作结果是否影响CPSR(当前程序状态寄存器)。

Rn(bit[19:16]):包含第一个操作数的寄存器编码。

Rd(bit[15:12]):目标寄存器编码。

operand2(bit[11:0]):指令第二个操作数。

例如:

ADD R0, R1, R2                           ;R0=R1+R2

3)第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数

汇编语法格式:

<Rm>, <shift> #<shift_imm>

指令编码格式如下:

cond(bit[31:28]):指令执行的条件码。备注:N、Z、C、V。

type(bit[27:26]):指令类型码,00代表数据处理指令及杂类Load/Store指令。

I(bit[25]):第二操作数类型标志码。在数据处理指令里I=0时表示第二操作数是寄存器移位形式。

opcode(bit[24:21]):指令操作码。

S(bit[20]):决定指令的操作结果是否影响CPSR(当前程序状态寄存器)。

Rn(bit[19:16]):包含第一个操作数的寄存器编码。

Rd(bit[15:12]):目标寄存器编码。

operand2(bit[11:0]):指令第二个操作数。

其中:

shift_amount表示移位数量。

shift表示移位类型编码,bit[5]用H表示,bit[6]用S表示,其描述如表3-3所示。

指令的操作数<operand2>为寄存器Rm的数值按某种移位方式移动shift_amount位,这里shift_amount范围是0~31,当shift_amount=0时,移位位数为32,则移位数范围为1~32。

例如:

MOV R0, R0, LSL #n                  ;R0=R0*(2^n) (n=0~31)                   MOV数据传送指令

4)第二操作数为寄存器移位方式,且移位数值放在寄存器中

汇编语法格式:

<Rm>, <shift> <Rs>

指令编码格式如下:

cond(bit[31:28]):指令执行的条件码。备注:N、Z、C、V。

type(bit[27:26]):指令类型码,00代表数据处理指令及杂类Load/Store指令。

I(bit[25]):第二操作数类型标志码。在数据处理指令里I=0时表示第二操作数是寄存器移位形式。

opcode(bit[24:21]):指令操作码。

S(bit[20]):决定指令的操作结果是否影响CPSR(当前程序状态寄存器)。

Rn(bit[19:16]):包含第一个操作数的寄存器编码。

Rd(bit[15:12]):目标寄存器编码。

operand2(bit[11:0]):指令第二个操作数。

其中:

寄存器Rs中存放着要移位的数量。

shift表示移位类型编码,其描述如表3-3所示。

指令的操作数<operand2>为寄存器Rm的数值进行移位得到。移位的数由Rs的低8位bit[7:0]决定。

注意事项:

当R15(PC)用做Rn、Rm、Rd、Rs任一个时,指令会产生不可预知的结果。

例如:

ANDS R1, R1, R2, LSL R3   ;R2的值左移R3位,然后和R1相“与”操作,结果放入R1

5)第二操作数为寄存器进行RRX(带扩展的循环右移)移位得到

汇编语法格式:

<Rm>, RRX

指令编码格式如下:

cond(bit[31:28]):指令执行的条件码。备注:N、Z、C、V。

type(bit[27:26]):指令类型码,00代表数据处理指令及杂类Load/Store指令。

I(bit[25]):第二操作数类型标志码。在数据处理指令里I=0时表示第二操作数是寄存器移位形式。

opcode(bit[24:21]):指令操作码。

S(bit[20]):决定指令的操作结果是否影响CPSR(当前程序状态寄存器)。

Rn(bit[19:16]):包含第一个操作数的寄存器编码。

Rd(bit[15:12]):目标寄存器编码。

operand2(bit[11:0]):指令第二个操作数。

指令的操作数<operand2>为寄存器Rm中的数值进行带扩展的循环右移一位,并用CPSR中的C条件标志位填补空出的位,CPSR中的C条件标志位则用移出的位代替。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值