将标签移入64位寄存器 - 内联汇编(GCC / CLANG)

3
我试图将标签的地址移动到一个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位寄存器中,那么我该如何实现呢?
谢谢。

你可以使用计算跳转(computed gotos)来避免汇编代码,即使用标签作为值的 GCC 扩展。具体请参考 Labels-as-Values - Basile Starynkevitch
你试过将它移动到eax吗?我认为它的意思就是字面上的意思。你现在使用的是Mac OS X,对吧?我想在Mac上所有64位代码都必须是rip相对的。绝对地址不被支持,所以你不能在寄存器中加载一个绝对地址。 - Gene
如所述,我能够编译此代码而没有错误。您需要提供更多的细节/上下文。另外,您知道“asm语句可能不会跳转到其他asm语句”(https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html),对吗?也许您应该描述一下您实际想要做什么,这样就可以提供更有用的答案了。 - David Wohlferd
1个回答

2
尝试使用以下两个汇编语句之一:

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

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

然而,正如David Wohlferd所指出的那样,您的代码可能无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接