作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几门涉及 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 位变体是不同的。
关于assembly - ARM v8 中的 LDUR 和 STUR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894765/
我有几门涉及 ARMv8 汇编的类(class),但是两位老师都以不同的方式描述了 LDUR/STUR 指令,现在我已经迷路了。有人可以帮忙澄清一下吗? 如果我有指示: LDUR R3, [R1, #
我是一名优秀的程序员,十分优秀!