刘帅嵌入式系统-Load/Store指令寻址方式三

[<Rn>,+/-<Rm>, <shift>#<shift_imm>]

指令编码格式:

内存地址计算方法:

内存地址address为基址寄存器Rn的值加上/减去一个地址偏移量(offset)。

当U = 1时,address = Rn + offset。

当U = 0时,address = Rn - offset。

offset 是 Rm 通过移位(或者循环移位)得到。具体的计算方法和操作数寻址方式一样。

指令中寻址方法的语法格式如下:

[<Rn>, +/-<Rm>,<shift> #<shift_imm>]

根据<shift>的不同,具体有如下5种格式:

[<Rn>, +/-<Rm>,LSL #<shift_imm>]

[<Rn>, +/-<Rm>,LSR #<shift_imm>]

[<Rn>, +/-<Rm>,ASR #<shift_imm>]

[<Rn>, +/-<Rm>,ROR #<shift_imm>]

[<Rn>, +/-<Rm>,RRX]

计算内存实际地址的伪代码如下:

case shift of  // bit[6:5]

    0b00  //LSL

    index = Rm Logic_Shift_Left shift_imm

    0b01 //LSR

    if shift_imm == 0 then  //LSR #32

        index = 0

    else

        index = Rm Logic_Shift_Right shift_imm

    0b10 //ASR    

    if shift_imm == 0 then  //ASR #32

        if Rm[31] == 1 then

            index =0xFFFFFFFF

        else

            index = 0

    else

        index = Rm Arithmetic_Shift_Right shift_imm

    0b11 //ROR  or RRX    

    if shift_imm == 0 then  //RRX

       index = (C Flag Logic_Shift_Left 31) OR (Rm Logic_Shift_Right 1)

    else  //ROR

        index = Rm Rotate_Right shift_imm

end case

if U == 1 then

    address = Rn + index

else  //U == 0

    address = Rn - index

使用说明:

    当数组种的数据成员长度大于1哥字节时,使用该寻址方式可高效率地访问数组的数据成员。

    B标志位用于控制指令操作的数据的类型,当B = 1时,指令访问的是无符号的字节数据;当B = 0时,指令访问的是字数据。

    L标志位用于控制内存操作的方向。当L = 1时,指令执行Load操作;当L = 0时,指令执行Store操作。

    当R15用作基址寄存器Rn时,内存基地址为当前指令地址加8字节偏移量。

    当R15用作索引寄存器Rm时,会产生不可预期的结果。

例子:

    LDR R0, [R1,R2, LSL #2]    ;将地址单元(R1+R2*4)中的字读取到R0寄存器中

猜你喜欢

转载自blog.csdn.net/shuai532209720/article/details/88729086