gpt4 book ai didi

assembly - ARM v8 中的 LDUR 和 STUR

转载 作者:行者123 更新时间:2023-12-01 10:20:50 26 4
gpt4 key购买 nike

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

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

最佳答案

LDUR 是加载(未缩放)寄存器。它将一个值(32 位或 64 位)从地址加上偏移量加载到寄存器。 unscaled表示在机器码中,偏移量将 不是 使用像 ldr 这样的缩放偏移量进行编码使用,即不会对立即偏移位应用移位。偏移量(simm 有符号立即数)将被添加到基址寄存器 Xn|SP。
因此,ldur 可以使用不是 4 或 8 倍数的位移。 ,与 ldr 不同
这些是 LDUR 的原型(prototype):

    -- loads a 32-bit value
LDUR <Wt>, [<Xn|SP>{, #<simm>}]

-- loads a 64-bit value
LDUR <Xt>, [<Xn|SP>{, #<simm>}]
STUR 是存储(未缩放)寄存器,工作方式相同,但它将寄存器中的值存储到内存中。
这些是 STUR 的原型(prototype):
    -- 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]
该指令将加载到 R3 R1 指向的值加 8字节。这就是 ARM 引用手册 byte offset 的意思。 .
所以如果 R1持有值 0x50 ,这将加载存储在地址 0x58 的值. R1 的值不会被修改。

指令 LDR R3, [R1, #8] (LDR(立即)无符号偏移变体)产生相同的操作,但是原型(prototype)不同:
-- 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(立即数)的一些偏移组合将产生相同的操作。

    关于assembly - ARM v8 中的 LDUR 和 STUR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894765/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com