assembly - ARM v8 中的 LDUR 和 STUR

我有几门涉及 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(立即数)的一些偏移组合将产生相同的操作。

    https://stackoverflow.com/questions/52894765/

    相关文章:

    authentication - Kubernetes 基于 LDAP 的用户身份验证

    sas - 对SAS中的动态列数进行排名

    powershell - 在 Powershell 中实现装饰器模式

    azure - 如何通过 Azure Logic App 和 Outlook 发送 html 电子邮

    jsf-2 - ResponseWriter.writeAttribute() 中 'name' 和

    performance - Julia - 具有属性的可变结构,它是一个函数和@code_warnt

    apache - 使用 ApacheDS 创建新的架构 LDAP

    d3.js - 按最近时间交叉过滤 JSON 数据

    react-native - 如何在不影响内部 View 元素的情况下应用阴影来 react 原生

    abap - 没有 BY 的 SORT 在标准内部表上的行为?安全吗?