LDUR 是加载(未缩放)寄存器。它将一个值(32 位或 64 位)从地址加上偏移量加载到寄存器。unscaled
意味着在机器代码中,偏移量不会像使用一样使用缩放的偏移量进行编码ldr
,即不会将移位应用于立即偏移位。偏移量(simm有符号立即数)将被添加到基址寄存器Xn|SP。
因此,可以使用不是 4 或 8 倍数的位移,ldur
与ldr
这些是 LDUR 的原型:
-- loads a 32-bit value
LDUR <Wt>, [<Xn|SP>{, #<simm>}]
-- loads a 64-bit value
LDUR <Xt>, [<Xn|SP>{, #<simm>}]
STUR 是存储(未缩放)寄存器,工作方式相同,但它将寄存器中的值存储到内存中。
这些是 STUR 的原型:
-- stores a 32-bit register
STUR <Wt>, [<Xn|SP>{, #<simm>}]
-- stores a 64-bit register
STUR <Xt>, [<Xn|SP>{, #<simm>}]
LDUR/STUR 允许访问未与操作数大小对齐的32/64 位值。例如,存储在地址 0x52 的 32 位值。
在你的例子中,
LDUR R3, [R1, #8]
该指令将加载到plus字节R3
所指向的值。这就是 ARM 参考手册中的. 因此,如果 持有该值,这将加载存储在 address 的值。的值不会被修改。R1
8
byte offset
R1
0x50
0x58
R1
指令LDR R3, [R1, #8]
(LDR (立即)无符号偏移变体)产生相同的操作,但是原型不同:
-- loads a 32-bit value
LDR <Wt>, [<Xn|SP>{, #<pimm>}]
-- loads a 64-bit value
LDR <Xt>, [<Xn|SP>{, #<pimm>}]
直接偏移pimm不同,LDUR使用simm。这意味着偏移量以不同的方式解释。第一个 ( pimm ) 是正偏移量,其范围对于 32 位变体和 64 位变体是不同的。
在 32 位版本中:
- 取值范围为 0 到 16380,只能是 4 的倍数
在 64 位版本中:
- 取值范围为 0 到 32760,只能是 8 的倍数
这意味着 LDUR 和 LDR(立即数)的一些偏移组合将产生相同的操作。