【发布时间】:2017-01-21 20:06:50
【问题描述】:
我想知道是否可以编码如下指令:
添加 rax,[地址]
其中
是指向 64 位值的完整 64 位地址。 NASM 似乎只是截断地址并将其编码为 32 位地址。唯一可行的 64 位寻址(使用直接地址)形式是:mov rax,[qword 地址]
由 NASM 使用 REX.W=1 和带有直接寻址的 MOV 的特殊操作码进行编码。将 REX.W 与 add 指令一起使用只会使其将目标地址解释为包含 64 位值,但不允许指定 64 位地址。但是我很好奇是否还有其他方法。
(顺便说一句,由于这个问题,我现在使用 RIP 相对寻址)。
谁能确认直接 64 位寻址形式是不可能的?
【问题讨论】:
-
指令集参考可以确认,不是来自互联网的陌生人;)
-
小丑,我看过指令集参考。但是很难排除可能有一种方法,特别是因为我不习惯阅读它。指令集参考列出了一个选项“[REX.W + 03 /r] ADD r64, r/m64”,但基于实验和您的回答(以及有关 MOD R/M 字节的表格)我得出结论,这是指添加 64 - 存储在 32 位指定内存地址的位值(除了使用更多指令之外,不可能将地址扩展到 64 位)。
-
@Morty 普通的寻址模式集不包括具有 64 位处置或绝对的模式。只有某些特殊指令提供这种寻址模式。
-
“第 2.2.1.3 节位移 ModR/M 和 SIB 位移大小不会改变。它们保持 8 位或 32 位,并且符号扩展为 64 位。”和“2.2.1.4 直接内存偏移 MOV 在 64 位模式下,MOV 指令的直接内存偏移形式被扩展为指定 64 位立即绝对地址。”