这篇笔记记录了第二类Load/Store指令的寻址方式,这类指令是指1)操作数为半字(包括有符号和无符号)的Load/Store指令;2)有符号字节数据的Load/Store指令;3)双字的Load/Store指令。
上述指令的语法格式如下:
LDR|STR{<cond>}H|SH|SB|D <Rd>, <address_mode>
这些指令有如下寻址方式:
语法 | 说明 | |
---|---|---|
1 | [<Rn>, #+/-<offset_8>] | 立即数偏移量寻址 |
2 | [<Rn>, +/-<Rm>] | 寄存器偏移量寻址 |
3 | [<Rn>, #+/-<offset_8>]! | 立即数事先更新寻址 |
4 | [<Rn>, #+/-<Rm>]! | 寄存器事先更新寻址 |
5 | [<Rn>], #+/-<offset_8> | 立即数事后更新寻址 |
6 | [<Rn>], +/- | 寄存器事后更新寻址 |
立即数偏移量寻址
[<Rn>, #+/-<offset_8>]
# 8位立即数是按照高4位和低4位分开编码的
offset_8 = (immedH << 4) | immedL
if U == 1 then
address = Rn + offset_8
else
address = Rn - offset_8
寄存器偏移量寻址
[<Rn>, +/-<Rm>]
if U == 1 then
address = Rn + Rm
else
address = Rn - Rm
立即数事先更新寻址
[<Rn>, #+/-<offset_8>]!
offset_8 = (immedH << 4) | immedL
if U == 1 then
address = Rn + offset_8
else
address = Rn - offset_8
if CondPassed then
Rn = address
寄存器事先更新寻址
[<Rn>, #+/-<Rm>]!
if U == 1 then
address = Rn + Rm
else
address = Rn - Rm
if CondPassed then
Rn = address
立即数事后更新寻址
[<Rn>], #+/-<offset_8>
address = Rn
offset_8 = (immedH << 4) | immedL
if CondPassed then
if U == 1 then
Rn = Rn + offset_8
else
Rn = Rn - offset_8
寄存器事后更新寻址
[<Rn>], +/-<Rm>
address = Rn
if CondPassed then
if U == 1 then
Rn = Rn + Rm
else
Rn = Rn - Rm