这篇笔记记录了第二类Load/Store指令,即操作数为16位半字和有符号字节数据的Load/Store指令。
助记符 | 说明 |
---|---|
LDRH | 半字数据读取指令 |
STRH | 半字数据写入指令 |
LDRSB | 有符号字节数据读取指令 |
LDRSH | 有符号半字数据读取指令 |
寻址方式
这类指令拥有一致的寻址方式,具体介绍见这里。
语法 | 说明 | |
---|---|---|
1 | [<Rn>, #+/-<offset_8>] | 立即数偏移量寻址 |
2 | [<Rn>, +/-<Rm>] | 寄存器偏移量寻址 |
3 | [<Rn>, #+/-<offset_8>]! | 立即数事先更新寻址 |
4 | [<Rn>, #+/-<Rm>]! | 寄存器事先更新寻址 |
5 | [<Rn>], #+/-<offset_8> | 立即数事后更新寻址 |
6 | [<Rn>], +/- | 寄存器事后更新寻址 |
LDRH(半字数据读取指令)
LDR{<cond>}H <Rd>, <address_mode>
if CondPassed(cond) then
if address[0] == 0 then
data = Mem[address, 2]
else
data = 未知
Rd = data
可见,该指令要求地址必须是半字对齐的。
STRH(半字数据写入指令)
STR{<cond>}H <Rd>, <address_mode>
if CondPassed(cond) then
if address[0] == 0 then
data = Rd[15:0]
else
data = 未知
Mem[address, 2] = data
同样,该指令要求地址必须是半字对齐的。
LDRSB(有符号字节数据读取指令)
LDRSB从内存中读取一个字节数据保存在目标寄存器的低8位,然后按照符号位填充目标寄存器的高24位,如此生成最后的32位数。
LDR{cond}SB <Rd>, <address_mode>
if CondPassed(cond) then
data = Mem[address, 1]
Rd = SignExtend(data)
LDRSH(有符号半字数据读取指令)
LDRSH从内存中读取一个半字数据保存在目标寄存器的低16位,然后按照符号位填充目标寄存器的高16位,如此生成最后的32位数。
LDR{<cond>}SH <Rd>, <address_mode>
if CondPassed(cond) then
if address[0] == 0 then
data = Mem[address, 2]
else
data = 未知
Rd = SignExtend(data)
同样,该指令要求地址必须是半字对齐的。