11

我有几门涉及 ARMv8 汇编的课程,但是两位老师都以不同的方式描述了 LDUR/STUR 指令,现在我已经迷路了。有人可以帮忙澄清一下吗?

如果我有指示:

LDUR R3, [R1, #8]

我将把答案放在 R3 中,但我从 R1 中得到了什么,偏移量是如何运作的?这像是一个逻辑转变吗?ARM 手册将其描述为“字节偏移”,但没有描述该偏移如何在 R1 上起作用。我是要移动存储在 R1 中的值(比如 R1 中的值是 50),还是需要考虑 R1 之外的内存地址?其他消息来源说我需要以某种方式将 R1 视为一个数组?

4

3 回答 3

19

LDUR 是加载(未缩放)寄存器。它将一个值(32 位或 64 位)从地址加上偏移量加载到寄存器。unscaled意味着在机器代码中,偏移量不会像使用一样使用缩放的偏移量进行编码ldr,即不会将移位应用于立即偏移位。偏移量(simm有符号立即数)将被添加到基址寄存器Xn|SP

因此,可以使用不是 4 或 8 倍数的位移,ldurldr

这些是 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 的值。的值不会被修改。R18byte offsetR10x500x58R1


指令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(立即数)的一些偏移组合将产生相同的操作。

于 2018-10-24T16:02:45.747 回答
0

来自Arm® A64 指令集架构:Armv8,适用于 Armv8-A 架构配置文件

if HaveMTEExt() then
boolean is_load_store = MemOp_LOAD IN {MemOp_STORE, MemOp_LOAD};
SetNotTagCheckedInstruction(is_load_store && n == 31);

bits(64) address;
bits(datasize) data;

if n == 31 then
    CheckSPAlignment();
    address = SP[];
else
    address = X[n];

address = address + offset;

data = Mem[address, datasize DIV 8, AccType_NORMAL];
X[t] = ZeroExtend(data, regsize);

此伪代码显示了如何应用偏移量。

于 2020-12-25T16:50:12.137 回答
0

在无符号偏移模式下,LDR 的 imm 应该保持 4 字节或 8 字节对齐。

如果 imm % 4 == 0,则 stur Wt, [Xn|SP, #imm] 等于 A32 中的 str Wt, [Xn|SP, #imm]。

如果 imm % 8 == 0,则 stur Xt, [Xn|SP, #imm] 等于 A64 中的 str Xt, [Xn|SP, #imm]。

LDR 不能在保持基址寄存器不变的情况下逐字节寻址 -256 到 255。这就是 LDUR 所做的。

于 2021-04-19T01:34:38.673 回答