【问题标题】:Assembler Error for GCC inline assembly for x86_64 machine(at&t syntax)x86_64 机器的 GCC 内联汇编的汇编错误(at&t 语法)
【发布时间】:2014-01-05 14:20:20
【问题描述】:

我正在尝试使用具有默认 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 机器编写的。

谢谢

【问题讨论】:

    标签: linux gcc assembly inline-assembly


    【解决方案1】:

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

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

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

    【讨论】:

    • 我错了,这是一个可怕的错误
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2016-05-19
    • 2012-11-12
    • 2012-10-20
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多