#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;
}
答案 0 :(得分:1)
知道了,你忘了在addl
和cmpl
的操作数之间指定逗号:))花了很长时间才注意到,太困了也许