用于x86_64机器的GCC内联汇编的汇编程序错误(at& t语法)

时间:2014-01-05 14:20:20

标签: linux gcc assembly inline-assembly

我正在尝试使用带有默认at&t语法的gcc内联汇编从堆栈读取值。 我的代码是

unsigned int ret_val;
__asm volatile(
            "movq %%rbp %0;\n"
            :"=r"(ret_val)
            );

我收到错误:

Assembler messages:
Error: junk `%eax' after register

此错误的含义是什么?如何摆脱这个错误。 我已经在SO question上阅读了一些类似的问题,但没有得到他们的帮助。 我更感兴趣的是了解错误背后的原因以及正确的方法。

代码是为x86_64 ubuntu机器编写的。

由于

1 个答案:

答案 0 :(得分:3)

有两个问题。首先 - 你需要在mov命令中的寄存器之间使用逗号:

"movq %%rbp, %0;\n"

其次,您需要64位变量来保存%rbp的值。 {x 1}在x86_64 linux上是32位的。您可以使用int或最好使用long