概述
[<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指令寻址方式六所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复