我是靠谱客的博主 大方枕头,最近开发中收集的这篇文章主要介绍刘帅嵌入式系统-Load/Store指令寻址方式六,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

内存地址计算方法:

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

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

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

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

当指令执行的条件满足时,生成的地址address将写入基址寄存器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]!

-- ! 用来设置W为,更新基址寄存器的内容。

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

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

 

 

if ConditionPassed(cond) then

    Rn = address

使用说明:

    

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

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

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

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

 

例子:

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

最后

以上就是大方枕头为你收集整理的刘帅嵌入式系统-Load/Store指令寻址方式六的全部内容,希望文章能够帮你解决刘帅嵌入式系统-Load/Store指令寻址方式六所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部