[<Rn>,#+/-<offset_8>]
指令编码格式
内存地址计算方法
内存地址address为基址寄存器的值加上/减去offset_8。
当U = 1时,address = Rn + offset_8
当U = 0时,address = Rn - offset_8
指令中寻址方式的语法格式
[<Rn>, #+/-<offset_8>]
-- offset_8为地址偏移量,被编码成高4位immedH和低4位immedL。
伪代码如下:
offset_8 = (immedH << 4) OR immedL
if U==1 then
address = Rn + offset_8
else /*U == 0*/
address = Rn - offset_8
使用说明:
该寻址方式适合用在结构化数据的数据成员、参数存取以及栈中数据访问。当offset_8 = 0时,指令访问的即为Rn指向的内存数据单元。
B标志位用于控制指令操作的数据的类型,当B = 1时,指令访问的是无符号的字节数据;当B = 0时,指令访问的是字数据。
L标志位用于控制内存操作的方向。当L = 1时,指令执行Load操作;当L = 0时,指令执行Store操作。
S标志位用于控制半字访问时的数据类型。当S=1时,数据为带符号数;当S=0时,数据为无符号数。
当S=0且H=0时,表示无符号的字节数据。这种数据的寻址方式不属于现在讨论的这几种寻址方式。包含这种操作数的指令可能属于SWP/SWPB 指令,或者目前尚未实现的算术指令及Load/Store指令。
S=1且L=0表示带符号数的Store指令。目前尚未实现该指令。
当R15用作基址寄存器Rn时,内存基地址为当前指令地址加8字节偏移量。
示例:
LDRSB R0,[R1,#3] ;将内存单元(R1+3)中的有符号字节数据读取到R0中
;将R0中高24位设置成该字节数据的符号位。