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

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

指令编码格式:

内存地址计算方法:

指令使用基址寄存器Rn的值作为内存访问的地址。

当指令执行的条件满足时,将基址寄存器的值加上/减去偏移量offset,生成新的地址。

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

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

offset是由索引寄存器Rm的值通过移位(或循环移位)得到,具体计算方法参考前面操作数寻址方式。

最后将新的地址值写入基址寄存器Rn中。这种方式称为事后访问方式。

指令寻址方式的语法格式:

[<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]

伪代码:

address = Rn

case shift of 

    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

使用说明:

    

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

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

    当R15用作基址寄存器Rn或Rm时,会产生不可预期的结果。

    当Rn和Rm是同一个寄存器时,会产生不可预期的结果。

例子:

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

猜你喜欢

转载自blog.csdn.net/shuai532209720/article/details/88858910
今日推荐