#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'constraint に適合するものなら何でも。
- "i" : 即値整数オペランド (定数値を持つオペランド) が許可されます。これには、アセンブリ時にのみ値がわかる記号定数が含まれます。
- "n" : 既知の数値を持つ即値整数オペランドが許可されます。多くのシステムは、1 ワード幅未満のオペランドのアセンブリ時定数をサポートできません。これらのオペランドの制約には、「i」ではなく「n」を使用する必要があります。
- "g" : 汎用レジスタではないレジスタを除き、任意のレジスタ、メモリ、または即値整数オペランドが許可されます。
その他の例やその他の制約については、サイトを参照してください。これが役に立ったことを願っています!:)