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.

questionAnswers(1)

yourAnswerToTheQuestion