Erro de montagem inline do GCC: Erro: lixo `(% esp) 'após a expressão
Erro de montagem inline do GCC: Erro: lixo `(% esp) 'após a expressão
Estou estudando a montagem inline do gcc. Meu ambiente é Win 7 32bit, mingw-gcc 4.6.1.
Eu tenho um problema com a restrição 'm'. Aqui está o meu código de função 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;
}
Para o código at & t, é assim:
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;
}
Para cada uma das três linhas que operam operandos de entrada / saída, o gcc gera um erro ao compilar, leia assim:
C: \ Usuários \ farta \ AppData \ Local \ Temp \ cc99HxYj.s: 22:Erro: lixo `(% esp) 'após a expressão
Se eu usar 'r' para restrição de entrada / saída, o código funcionará. Mas não consigo entender por que funciona e qual é o erro. Alguém pode me dizer? Tanto quanto eu sei, 'm' é apenas dizer ao gcc para não alocar registradores, mas acessá-los diretamente na memória, se o código in-line tentar acessar os operandos de entrada / saída. Isso está correto?
Muito obrigado.