#include <stdio.h>
#include <stdlib.h>
unsigned sadd32(unsigned a, unsigned b)
{
unsigned c = 0;
__asm__ ("movl %2, %%eax\n\t"
"addl %1, %%eax\n\t"
"movl %%eax, %0\n\t"
:"=r"(c)
:"r"(a),"r"(b)
:"%eax"
);
return c;
}
int main()
{
unsigned int a=3,b=5;
printf("The sum of %u and %u is %u\n",a,b,sadd32(a,b));
return 0;
}
参考:http ://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
据我所知,您的代码有一些缺陷::
unsigned sadd32(unsigned a, unsigned b)
{
unsigned c = 0;
__asm__("movl %%eax, %0" : "=a"(a));
__asm__("addl %%eax, %0" : "=b"(b));
__asm__("movl %edx, 0xffffffff"); /* this here, you are specifying a manual location, may not be accessible or valid */
__asm__("cmovc %eax, %edx"); /* resulting in its error */
__asm__("movl %0, %%eax" : "=c"(c));
return c;
}
另外,我相信您不了解“=$”的概念。据我所知,您只是在那里写变量名,但这不是它的工作方式。从该站点来看,约束约束(众所周知)如下:
- "m" :允许使用内存操作数,机器通常支持的任何类型的地址。
- "o" :允许使用内存操作数,但前提是地址是可偏移的。即,向地址添加一个小的偏移量会给出一个有效的地址。
- "V" :不可偏移的内存操作数。换句话说,任何符合
m’
constraint but not the
o'约束的东西。
- "i" :允许立即整数操作数(具有常数值的操作数)。这包括符号常量,其值仅在汇编时才知道。
- "n" :允许使用具有已知数值的立即整数操作数。许多系统不支持小于一个字宽的操作数的汇编时间常数。这些操作数的约束应该使用“n”而不是“i”。
- "g" :允许任何寄存器、内存或立即整数操作数,但不是通用寄存器的寄存器除外。
有关更多示例和其他限制,请参阅该站点。希望这有帮助!:)