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.