ARM 指令寻址方式

ARM 75浏览


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条件标志位用移出的位代替。