GCCインラインアセンブリエラー:エラー:式の後のジャンク `(%esp)'
私はgccインラインアセンブリを研究しています。私の環境はWin732ビット、mingw-gcc4.6.1です。
'm'制約について問題があります。これが私のc関数コードです:
static int asm_test(int a, int b)
{
int c = 0;
__asm__ __volatile__(".intel_syntax\n"
"mov eax, %1\n" //error
"mov edx, %2\n" //error
"add eax, edx\n"
"mov %0, eax\n" //error
".att_syntax"
:"=m"(c)\
:"m"(a),"m"(b)\
:"eax","edx"
);
return c;
}
at&tコードの場合、次のようになります。
static int asm_test(int a, int b)
{
int c = 0;
__asm__ __volatile__(
"movl %1, $eax\n" //error
"movl %2, $edx\n" //error
"addl $edx, $eax\n"
"movl $eax, %0\n" //error
:"=m"(c)\
:"m"(a),"m"(b)\
:"eax","edx"
);
return c;
}
入出力オペランドを操作する3行のそれぞれについて、gccはコンパイル時にエラーを生成します。次のように読みます。
C:\ Users \ farta \ AppData \ Local \ Temp \ cc99HxYj.s:22:エラー:式の後のジャンク `(%esp)'
入出力制約に「r」を使用すると、コードは機能します。しかし、なぜそれが機能するのか、そしてエラーが何を意味するのか理解できません。誰か教えてもらえますか?私の知る限り、「m」はgccにレジスタを割り当てないように指示しているだけで、インラインasmコードが入力/出力オペランドにアクセスしようとした場合にメモリ内のレジスタに直接アクセスします。これは正しいです?
どうもありがとう。