您的位置:首页 > 其它

ARM 指令寻址方式

2012-07-15 16:03 399 查看
1.ARM指令的一般编码格式

comd 001 opcode S Rn Rd shifter_operand

opcode: 指令操作符编码。

cond : 指令执行到条件编码。

S: 决定指令到操作是否影响CPSR的值。

Rd:目标寄存器编码。

Rn: 包含第1个操作数的寄存器编码。

shifter_operand: 标识第二个操作数。

一条典型的ARM 指令语法格式: <opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>

<opcode> 是指令助记符,如ADD表示算术加指令

{<cond>} 表示指令执行到条件

{S} 表示指令操作是否影响CPSR的值

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

1.#<immediate>

31 28 27 25 24 21 20 19 16 15 12 11 8 7 0

rotate_imm=0 时,循环进位器到值为CPSR中到C条件标志位;rotate_imm != 0时,循环进位器的进位值为操作数<shifter_operandd>的最高位bit[31].

2.<Rm>

操作数<shifter_operand> 等于寄存器值,循环器的进位值为CPSR中的C条件标志位。

3.<Rm>,LSL #<shift_imm>

指令的操作数<shifter_operand>为寄存器Rm的数值逻辑左移shitf_imm位,移位范围0-31,进行移位后空位添0.shift_imm=0时,循环器进位值为CPSR中的C条件标志位;shitf_imm != 0,循环器进位值为操作数的最高位bit[31].

4.<Rm>,LSL > <Rs>

移位位数由Rs的最低8位bits[7:0]决定,当Rs[7:0] = 0时,指令的操作数<shiter_operand>为寄存器Rm的数值,循环器的进位值为CPSR中的C 标志位;当0<Rs[7:0]<32时,指令操作数<shifter_operand>为寄存器Rm中的值逻辑左移Rs[7:0]位,循环器进位值为Rm最后被移出的位Rm[32-Rs[7:0]]; Rs[7:0] = 32,指令操作数为0,循环器进位值等于Rm[0],Rs[7:0] > 32时,指令操作数为0,循环器进位值也等于0。

5.<Rm>,LSR #<shift_imm>

指令的操作数为Rm的数值逻辑右移shift_imm位,范围为0-31. 当shift_imm = 0,移位位数32,此时,操作数为0,循环器进位值等于R[31],其他情况下,<shifter_operand>等于Rm中的数值逻辑右移shift_imm位,循环器进位值为Rm最后移出的值。

6. <Rm>,LSR <Rs>

移位数值由Rs[7:0]决定,当Rs[7:0] = 0时,<shifter_operand> = Rm,循环器进位值为CPSR中到C标志位; 0<Rs[7:0] <32时,指令操作数等于Rm的数值逻辑右移Rs[7:0]位,循环器进位值等于Rm最后移出的到位Rm[Rs[7:0] -1]; Rs[7:0] = 32,指令操作数为0,循环进位器值为Rm[31];Rs[7:0] > 32,操作数为0,循环器进位值也为0.

7.<Rm>,ASR #<shift_imm>

操作数为寄存器Rm的数值算术右移shift_imm位,shift_imm :1-31. 当shift_imm = 0,移位位数为32,此时若Rm[31] = 0,操作数的值也为0,若Rm[31] = 1,则操作数值为: 0xFFFFFFF,其他情况下,操作数为Rm中的值算术右移shift_imm 位,循环器进位值为最后移出的值。
8.<Rm> ,ASR <Rs>

移位的位数由Rs[7:0] 决定,Rs[7:0] = 0时,操作数<shifter_operand> 等于Rm中的值,当Rs[7:0] >= 32时,将进行32次算术右移操作,若Rm[31] = 0,操作数为0,循环器进位值也为0,若Rm[31] = 1,操作数的值为:0xFFFFFFFF,循环器进位值为1.其他情况,操作数为Rm的值算术右移Rs[7:0]次,循环进位器的值等于Rm[Rs[7:0]].
9. <Rm>,ROR #<shift_imm>

shift_imm: 0-31. 当shift_imm = 0, 执行 <Rm>, RRX : 操作数右移移一位,并用CPSR中的C标志位补全,CPSR中的C条件标志则用移出位代替。,其他情况,操作数<shifter_operand> 循环右移shift_imm位,循环器进位值为最后从寄存器Rm中移出的值。
10.<Rm>,ROR <Rs>

Rs[7:0] = 0,操作数的值等于寄存器Rm的值,循环进位器为CPSR中的C条件标志位;若Rs[4:0] = 0时,操作数的值等于Rm的值,循环器进位值等于Rm[31],Rs[4:0]>0,指令操作数为寄存器Rm的数值循环右移Rs[4:0]位,循环器进位值等于:Rm[Rs[4:0] -1]
11.<Rm>,RRX

指令操作数<shifter_operand> 为寄存器Rm的数值右移一位,并用CPSR中到C条件标志位代替,C条件标志位用移出的位代替。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: