GCC 内联汇编错误:错误:表达式后出现垃圾 `(%esp)'
我正在研究 gcc 内联汇编。我的环境是Win 7 32bit,mingw-gcc 4.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;
}
对于操作输入/输出操作数的三行中的每一行,gcc 在编译时都会产生错误,如下所示:
C:\Users\farta\AppData\Local\Temp\cc99HxYj.s:22: Error: junk `(%esp)' after expression
如果我将“r”用于输入/输出约束,则代码将起作用。但我无法理解它为什么起作用以及错误代表什么。谁能告诉我?据我所知,'m' 只是告诉 gcc 不要分配寄存器,而是直接在内存中访问它们,如果内联 asm 代码尝试访问输入/输出操作数。这个对吗?
非常感谢。