Asembler w kodzie linuxa | ||
---|---|---|
<<< Wstecz | Dalej >>> |
W opisie składni asemblerowej AT&T bedziemy używali porównań ze składnią Intela, być może niektórym już znaną. W każdym razie zakładam, że czytelnik miał już do czynienia z jakimś asemblerem.
Podstawową zasadą wspólną dla wszystkich komend dwuargumentowych w składni AT&T jest umieszczanie źródła po lewej, a celu po prawej stronie - czyli odwrotnie niż w Intel-u. Tak więc umieszczenie liczby 1000 w rejestrze eax (właściwie %eax) będzie wyglądać następująco:
movl $1000, %eax |
Możemy od razu dokonać kilku spostrzeżeń: nazwy rejestrów poprzedzane są znakiem '%', stałe poprzedzane są '$', rozmiar wykonywanej operacji oznacza się odpowiednią literą w nazwie. Litery b w l oznaczają kolejno bajt, word - dwa bajty, long - cztery bajty.
W składni Intela liczba 32 bitowa oznaczana jes przez d (double word). W AT&T używa się oznaczenia l, zaś d oznacza liczbę 64 bitową zapisaną w dwóch rozszerzonych rejestrach (%edx:%eax)
Stałe w systemie szestnastkowym poprzedza sie ciągiem $0x np. $0x1a (co oznacza dziesiętne 26).
Procesor 80386 potrafi konwertować liczby umieszczone w rejestrze %eax do innych formatów:
cbtw - bajt ze znakiem w %al do word w %ax
cwtl - word ze znakiem w %ax do long w %eax
cltd - long ze znakiem w %ax do double w %edx:%eax
Umieszczenie litery oznaczającej rozmiar operacji nie jest niezbędne, jednak jej brak może prowadzić do błędów - asembler as używany przez gcc próbuje rozpoznać rozmiar po nazwie używanego rejestru, podczas gdy skłądnia AT&T mówi, że brak oznaczenia powinien być interpretowany jako l.
Pełną listę instrukcji procesora Intel 80386 można znależć w internecie, np. na stronie www.iro.umontreal.ca/~feeley/cours/ift224/doc
<<< Wstecz | Spis treści | Dalej >>> |
Rejestry | Adresowanie pamięci (wirtualnej) |