【问题标题】:Moving a label into 64bit register - inline assembly (GCC / CLANG)将标签移动到 64 位寄存器 - 内联汇编 (GCC / CLANG)
【发布时间】:2014-09-01 05:06:45
【问题描述】:

) 我正在尝试将标签的地址移动到 64 位寄存器中,但它不会让我这样做。

我得到一个:

fatal error: error in backend: 32-bit absolute addressing is not supported in 64-bit mode

这是我正在尝试做的一个例子:

asm ("mov $label, %rax"); // Tried movq, movl (No difference)
...
asm volatile("label:");
...

为什么不让我?它是否允许将标签仅移动到 32 位寄存器中? 我必须将该标签的地址插入到 64 位寄存器中,那我该如何实现呢?

谢谢

【问题讨论】:

  • 你可能可以避免使用计算 goto 的汇编代码,即labels as values GCC 扩展。
  • 您是否尝试将其移至eax?我认为这就是它所说的意思。你在 Mac OS X 中对吗?我认为 Mac 上的所有 64 位代码都必须是 rip 相对的。不支持绝对地址,因此您不能在寄存器中加载一个。
  • 正如所写,我能够正确编译这段代码。您将需要提供更多详细信息/上下文。此外,您确实知道“asm 语句可能不会跳转到其他 asm 语句”(gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html),对吧?也许您应该描述您实际尝试做的事情,以便提供更有用的答案。

标签: gcc assembly inline-assembly


【解决方案1】:

尝试以下两种 asm 语句之一:

asm ("movabs $label, %rax");
asm ("lea label(%rip), %rax");

第一个使用 64 位立即操作数(因此是 64 位绝对重定位),而第二个使用 RIP 相对寻址。第二种选择可能是最好的,因为它更短,但它要求 label 在 2^31 字节内。

但是,正如 David Wohlferd 所指出的,您的代码不太可能工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2011-04-23
    • 2018-03-05
    相关资源
    最近更新 更多