ARM指令寻址方式之: 内存访问指令寻址
2.[Rn,±Rm]
(1)编码格式
指令的编码格式如图4.25所示。
图4.25 杂项内存访问指令——寄存器偏移寻址编码格式
内存访问地址为基址寄存器Rn的值加(或减)偏移寄存器Rm的值。
该寻址方式适合使用指针访问数组中的单个数据成员。
(2)语法格式
LDR|STR{cond>}H|SH|SB|D Rd>,[Rn>,±Rm>]
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· Rm>为偏移地址寄存器,包含内存访问地址偏移量。
(3)操作伪代码
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
(4)说明
如果Rn被指定为程序计数器r15,其值为当前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的执行结果不可预知。
3.[Rn,#± offset_8>]!
(1)编码格式
指令的编码格式如图4.26所示。
图4.26 杂类内存访问指令——前索引立即数偏移寻址编码格式
内存地址为基址寄存器Rn加/减立即数offset_8的值。当指令执行的条件cc>满足时,生成的地址写回基址寄存器Rn中。
该寻址方式适合访问数组自动进行数组下标的更新。
(2)语法格式
LDR|STR{cond>}H|SH|SB|D Rd>,[Rn>,±offset_8>] !
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· offset_8>为8位立即数,内存访问地址偏移量,在指令编码格式中被拆为immedH和immedL两部分;
· !设置指令编码中的W位,更新指令基址寄存器。
(3)操作伪代码
offset_8 = (immedH) 4 OR immedL
If U == 1 then
Address = Rn + offset_8
Else
Address = Rn – offset_8
If ConditionPassed{cond} then
Rn = address
(4)说明
① 如果指令中没有指定立即数,使用[Rn>],编译器按[Rn>,#0] ! 形式编码。
② 如果Rn被指定为程序计数器r15,指令的执行结果不可预知。
评论