我有几门涉及 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 是存储(未缩放)寄存器,工作方式相同,但它将寄存器中的值存储到内存中。 -- 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 位变体是不同的。https://stackoverflow.com/questions/52894765/
相关文章:
authentication - Kubernetes 基于 LDAP 的用户身份验证
powershell - 在 Powershell 中实现装饰器模式
azure - 如何通过 Azure Logic App 和 Outlook 发送 html 电子邮
jsf-2 - ResponseWriter.writeAttribute() 中 'name' 和
performance - Julia - 具有属性的可变结构,它是一个函数和@code_warnt
apache - 使用 ApacheDS 创建新的架构 LDAP