Błąd montażu wbudowanego GCC: Błąd: śmieciowe (% esp) po wyrażeniu

Błąd montażu wbudowanego GCC: Błąd: śmieciowe (% esp) po wyrażeniu

Studiuję montaż inline gcc. Moje środowisko to Win 7 32bit, mingw-gcc 4.6.1.

Mam problem z ograniczeniem „m”. Oto mój kod funkcji 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;
}

Dla kodu at & t wygląda to tak:

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;
}

Dla każdej z trzech linii, które obsługują operandy wejścia / wyjścia, gcc generuje błąd podczas kompilacji, czytaj tak:

C: Użytkownicy farta AppData Lokalna pomoc cc99HxYj.s: 22:Błąd: śmieciowe (% esp) po wyrażeniu

Jeśli użyję 'r' dla ograniczenia wejścia / wyjścia, kod zadziała. Ale nie mogę zrozumieć, dlaczego to działa i co oznacza błąd. Czy ktoś może mi powiedzieć? O ile mi wiadomo, 'm' po prostu mówi gcc, aby nie przydzielał rejestrów, ale ma bezpośredni dostęp do nich w pamięci, jeśli kod inline asm próbuje uzyskać dostęp do argumentów wejścia / wyjścia. Czy to jest poprawne?

Wielkie dzięki.

questionAnswers(1)

yourAnswerToTheQuestion