2009-10-24 16 views
26

Musisz mi wybaczyć, jestem nowy w montażu x86 i montażu w ogóle.Znaczenie (% eax) w składni AT & T?

Więc moje pytanie jest, mam coś takiego:

addl %edx,(%eax) 

% eax jest rejestr, który posiada wskaźnik do jakiejś liczby całkowitej. Nazwijmy to xp

Czy to oznacza, że ​​mówi: *xp = *xp + %edx? (%edx jest liczbą całkowitą)

Jestem po prostu zdezorientowany, gdzie addl zapisze wynik. Jeśli %eax jest wskaźnikiem do int, to wtedy wartość rzeczywistą tego int powinna być równa (%eax). Czy zatem addl zapisze wynik %edx+(%eax) w *xp? Bardzo bym chciał, żeby ktoś mi to wyjaśnił!

Naprawdę doceniam każdą pomoc!

Odpowiedz

50

Tak, ta instrukcja robi dokładnie to, co myślisz, że robi.

Większość instrukcji arytmetycznych x86 przyjmuje dwa argumenty: źródło i cel. W składni AT & T miejsce docelowe jest zawsze prawym operandem. Więc z instrukcją jak:

addl %edx, %eax 

wartości w edx i eax są sumowane, a wynik jest przechowywany w eax. Jednak w twoim przykładzie, (%eax) jest operandem pamięci; to właśnie nawiasy oznaczają w AT & T składni (podobnie jak nawiasy kwadratowe w składni NASM).

Oznacza to, że eax jest traktowany jako wskaźnik, więc prawy argument jest pobierany z adresu wskazywanego przez eax, a wynik jest zapisywany na tym samym adresie.

+0

+1 prosta prosta odpowiedź. –

+0

'(% eax)' jest "rejestr pośredni", jeśli chcesz [nazwać różne tryby adresowania] (https://stackoverflow.com/questions/46257018/do-terms-like-direct-indirect-addressing-mode- actual-exists-in-the-intel-x86-man) w ogóle. Adresowanie "pamięci pośredniej" ma miejsce, gdy procesor ładuje adres z pamięci, a następnie odbiera *, że * (x86 nie obsługuje adresowania pamięci pośredniego). https://en.wikipedia.org/wiki/Addressing_mode#Memory_indirect –

Powiązane problemy