如何在寄存器中移动标签的地址

时间:2011-11-01 22:28:02

标签: c linux gcc assembly x86

在x86的gcc内联汇编中,如何在寄存器中移动标签的地址。这应该是什么,而不是$ label,因为汇编程序给出错误对标签的未定义引用

请注意,标签位于 asm 块之外,即在正常的C代码中。

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

2 个答案:

答案 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

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

答案 1 :(得分:0)

我知道了,标签也应该包装在装配块中,就像这样......

__asm__ __volatile__ ("label:");