内联汇编代码错误

Posted

技术标签:

【中文标题】内联汇编代码错误【英文标题】:Inline assembly code error 【发布时间】:2014-02-23 02:49:44 【问题描述】:
#include <stdio.h>
#include <stdlib.h>


int asm_sum(int x, int y)

        int ret = 0;

        __asm__ __volatile__(   "loop:\t\n"
                                "addl %0 %1\t\n"
                                "incl %1\t\n"
                                "cmpl %1 %2\t\n"
                                "jle loop"
                                :"=r"(ret)
                                :"r"(x), "r"(y)
                            );
        return ret;


int main()

        int x = 4;
        int y = 9;

        printf("asm_sum(%d, %d) return %d\n", x, y, asm_sum(x,y));


        return 0;

上面是gcc内联汇编代码,我觉得很简单,但是编译的时候报错

addup.c: Assembler messages:
addup.c:10: Error: junk `%eax' after register
addup.c:12: Error: junk `%edx' after register

有人知道发生了什么吗????

编辑:

永远不要忘记操作数之间的逗号......还有

cmp op1 op2 jle循环

只有当 op2 小于或等于 op1 时才会跳转到循环。

这是有效的代码:

int asm_sum(int x, int y)

    int ret = 0;

    __asm__ __volatile__(   "loop:\t\n"
                            "   addl %1, %0\n\t"
                            "   inc %1\n\t"
                            "   cmp %2, %1\n\t"
                            "   jle loop"
                            :"=r"(ret)
                            :"r"(x), "r"(y)
                         );
    return ret;

【问题讨论】:

在我看来,您正在编译的文件不是您认为正在编译的文件。 但是ret在循环过程中没有被修改 你是什么意思?@keshlam 是的。它应该是 addl %1 %0 但仍然得到错误@mangusta @Jianchen你为什么不加x到ret,然后加y到ret,"addl %1 %0\t\n" "addl %2 %0\t\n" 【参考方案1】:

知道了,你忘了在addlcmpl 的操作数之间指定逗号:)) 花了太长时间才注意到,可能太困了

【讨论】:

以上是关于内联汇编代码错误的主要内容,如果未能解决你的问题,请参考以下文章

简单 g++ 内联汇编程序中的错误

gnu 内联汇编错误

扩展内联汇编 gcc - 计算二次公式根

GCC 内联汇编中的标签

SSE 内联汇编和可能的 g++ 优化错误

初学者内联汇编分段错误