内联汇编代码错误

时间:2014-02-23 02:49:44

标签: c inline-assembly

#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 loop

仅当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;
}

1 个答案:

答案 0 :(得分:1)

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