内联汇编代码错误
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】:
知道了,你忘了在addl
和cmpl
的操作数之间指定逗号:)) 花了太长时间才注意到,可能太困了
【讨论】:
以上是关于内联汇编代码错误的主要内容,如果未能解决你的问题,请参考以下文章