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

标签 c linux gcc assembly x86

在 x86 的 gcc 内联汇编中,如何移动寄存器中标签的地址。它应该是什么而不是 $label 在这里,因为汇编器给出了错误 undefined reference to label

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

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

最佳答案

你可以这样做:

register unsigned long eax __asm__("eax");  // See [1]
eax = &&label;  // See [2]

label:
  // some code

但是,请注意:GCC 可以自由地对优化后的代码重新排序,因此 C 标签 可能与您期望的位置不完全相同。

如果您需要精确放置 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

关于c - 如何移动寄存器中标签的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973728/

相关文章:

python - 是否可以在独立的 C 中实现 Python yield 功能?

linux - 在不使用 "mv"(shell 脚本)的情况下,将当前目录中的新 TAR 文件创建到新目录

c - 升级后 gcc 编译失败 - 找不到共享文件对象 (libmpc.so.2)

c - C中的函数指针转换

c - Gcc 填充结构列表

c++ - Linux中的信号处理和中断函数调用?

linux - 为什么我不能从 setopt 中 grep zle?

gcc - 创建一个无需 gnat-tools 即可链接的静态 Ada-Library

C 程序使用 strtok 在字符串中查找单个单词

linux - Windows Azure Linux VM 缓慢重启