一、数据处理指令寻址方式
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条件标志位则用移出的位代替。