在汇编程序中进行间接调用

gnu*_*nce 0 compiler-construction x86 assembly

我正在为一个类编写一个编译器,而且我坚持使用GNU的语法进行间接调用.考虑这个简单的程序:

.text
.globl main
main:
  movl func, %eax
  call *%eax
  ret

func:
  movl $42, %eax
  ret
Run Code Online (Sandbox Code Playgroud)

使用gcc -m32 -O0并运行生成的程序会给我一个分段错误.谁能告诉我如何正确地进行通话?

谢谢.

文森特.

Dan*_*zar 5

call指令本身其实是不错的.:)

您的问题是您似乎忘记了AT&T语法的工作原理.你在这里做的movl func, %eax是将dword从标签的地址复制funceax寄存器.基本上,eax最终会得到函数实际代码的前4个字节.

AT&T的即时操作数以a为前缀$.func作为编译时常量的标签的值可以用作立即数,在这种情况下就是你想要的.因此,替换movl func, %eaxmovl $func, %eax,你会没事的.:)

lea在这里使用是多余的.当然,它可以工作,但由于它func是一个编译时常量,因此简单地将它作为一个直接的代码放在代码中而不是在运行时计算它会更有效.