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

时间:2014-09-01 05:06:46

标签: gcc assembly inline-assembly

) 我正在尝试将标签的地址移动到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位寄存器,我该如何实现呢?

感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

然而,正如David Wohlferd所说,你的代码不太可行。