2011-11-01 77 views
2

在x86的gcc内联程序集中,如何移动标签在寄存器中的地址。它应该是什么,而不是$标签在这里,因为汇编程序错误未定义的参考标签如何在寄存器中移动标签的地址

请注意,该标签在asm块之外,即在正常的C代码内。

 __asm__ __volatile__ ("movl $label, %eax;"); 
label: 
     ..... 
+1

是什么错误? – ughoavgfhw

+1

你在用什么汇编语言? gcc内联汇编?加油站 ? nasm? –

回答

0

我得到了它,标签也应被包裹在一个组装块,像这样...

__asm__ __volatile__ ("label:"); 
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

[2] http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html