【问题标题】:Is 64-bit direct memory operand possible on x86-64?x86-64 上是否可以使用 64 位直接内存操作数?
【发布时间】: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 位立即绝对地址。”

标签: assembly x86-64


【解决方案1】:

除某些特殊情况外,amd64 架构没有 64 位位移的寻址模式。相反,请使用rip 相对寻址,如果您的二进制文件大小小于 2 GB,这应该没问题。

【讨论】:

  • 正如 OP 正确所说的那样 is mov rax, moffs64 所以不需要你的解决方法。您应该使用不同的寄存器来说明您的观点;)
  • @Jester 哦,是的。
  • 好的,很高兴确认无法使用直接 64 位地址进行 加法(而不仅仅是移动)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2012-05-09
  • 2011-06-01
  • 1970-01-01
  • 2010-12-11
相关资源
最近更新 更多