ARM 指令寻址方式


1.ARM指令的一般编码格式


   comd   001   opcode   S   Rn   Rd      shifter_operand

   opcode:  指令操作符编码。

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

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

   Rd:目标寄存器编码。

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

  shifter_operand: 标识第二个操作数。

  一条典型的ARM 指令语法格式:  {}{S},,


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

  {}  表示指令执行到条件

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

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

    1.#

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

   

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

      2.

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

     3.,LSL #

     

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

    4.,LSL >

 

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


  5.,LSR #

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

 6. ,LSR

 移位数值由Rs[7:0]决定,当Rs[7:0] = 0时, = Rm,循环器进位值为CPSR中到C标志位; 0 32,操作数为0,循环器进位值也为0.


 7.,ASR #

   

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

  8. ,ASR

  

  移位的位数由Rs[7:0] 决定,Rs[7:0] = 0时,操作数 等于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. ,ROR #

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

10.,ROR

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.,RRX

  指令操作数 为寄存器Rm的数值右移一位,并用CPSR中到C条件标志位代替,C条件标志位用移出的位代替。


你可能感兴趣的:(ARM 指令寻址方式)