在x86的gcc内联汇编中,如何在寄存器中移动标签的地址。这应该是什么,而不是$ label,因为汇编程序给出错误对标签的未定义引用。
请注意,标签位于 asm 块之外,即在正常的C代码中。
__asm__ __volatile__ ("movl $label, %eax;");
label:
.....
答案 0 :(得分:2)
你可以这样做:
register unsigned long eax __asm__("eax"); // See [1]
eax = &&label; // See [2]
label:
// some code
但是,请注意:GCC可以自由地对优化下的代码进行重新排序,因此C label
可能不会完全符合预期。
如果您需要label
的精确放置(例如,因为某些汇编代码会跳转到它),您最好在汇编中编写整个代码。
[1] http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html#Local-Reg-Vars
答案 1 :(得分:0)
我知道了,标签也应该包装在装配块中,就像这样......
__asm__ __volatile__ ("label:");