Próbuję zapoznać się z montażem x86 za pomocą wbudowanego asemblera GCC. Próbuję dodać dwie liczby (a
i b
) i zapisać wynik w c
. Mam cztery nieznacznie różne próby, z których trzy działają; ostatni nie daje oczekiwanego rezultatu.Dodawanie dwóch liczb
Pierwsze dwa przykłady wykorzystują rejestr pośredni, a oba działają dobrze. Trzecie i czwarte przykłady próbują dodać dwie wartości bezpośrednio bez rejestru pośredniego, ale wyniki różnią się w zależności od poziomu optymalizacji i kolejności dodawania wartości wejściowych. Co robię źle?
środowisko jest:
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
pierwsze zmienne są uznane w następujący sposób:
int a = 4;
int b = 7;
int c;
Przykład 1:
asm(" movl %1,%%eax;"
" addl %2,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
Przykład 2:
asm(" movl %2,%%eax;"
" addl %1,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
Przykład 3:
asm(" movl %2,%0;"
" addl %1,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=11
// output with -O3: a=4, b=7, c=14
Przykład 4:
// this one appears to calculate a+a instead of a+b
asm(" movl %1,%0;"
" addl %2,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=8
// output with -O3: a=4, b=7, c=11
rozwiązania.Matthew Slattery's answer jest poprawna. Przed, to starałem się ponowne eax
zarówno b
i c
:
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %eax
addl %eax, %eax
Z Mateusza sugerowane poprawki w miejscu, to teraz wykorzystuje ecx
trzymać c
oddzielnie.
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %ecx
addl %eax, %ecx
Działa dobrze dla mnie, z włączoną optymalizacją lub bez niej. Spróbuj skompilować z opcją -S, aby uzyskać listę języków asemblerowych. Wtedy możesz zobaczyć, które rejestry są używane. – TonyK
Zauważyłem, że otrzymuję różne wyniki w zależności od poziomu optymalizacji. Próbki kodu zaktualizowano o nowe dane wyjściowe. –
Co zawiera informacja o montażu? – TonyK