Intel vs AT&T sintaksa ----------------------- (C) 2004 Igor Pozgaj *********************************************** Pri odabiru asemblera na Linuxu potrebno je obratiti pozornost na nekoliko stvari. Jedna od njih je sintaksa u kojoj zapisujemo mnemonicki program. Ukoliko ste programirali na nekom od asemblera na MS Windowsima, vjerojatno ste navikli na Intelovu sintaksu. Evo odlomka asemblerskog koda pisanog u Intelovoj sintaksi: mov ah, 10h xor bx, bx int 10h mov eax, 1 mov ebx, [esp+4] Ovakvu sintaksu koristi asembler NASM. Neki asembleri koriste drukciji nacin zapisa - AT&T. Pogledajmo kako prethodni odlomak koda izgleda u AT&T sintaksi: movb $0x10, %ah xorw %bx, %bx int $0x10 movl $1, %eax movl 4(%esp), %ebx Ovakvu sintaksu koristi GNU asembler (gas). Pogledajmo razlike izmedju Intelove i AT&T sintakse: 1. Oznaka registara i brojeva ------------------------------ Za razliku od Intelove sintakse gdje ispred imena registara ili brojeva nije potrebno pisati nikakve dodatne znakove, u AT&T sintaksi ispred imena registara dodajemo znak %, a ispred brojeva znak $. Dakle, registar eax u Intelovoj sintaksi postati ce %eax u AT&T sintaksi. Broj 666 u Intelovoj postati ce $666 u AT&T sintaksi. 2. Oznacavanje duljine operanada --------------------------------- U AT&T sintaksi potrebno je posebno naznaciti duljinu operanada sa kojima instrukcija radi. To postizemo dodavanjem sufiksa -b, -w, -l na bazno ime instrukcije, za 8, 16 i 32 bitni podatak (byte, word, long). Tako ce npr. instrukcija "push eax" po Intelovoj biti "pushl %eax" po AT&T sintaksi. 3. Poredak operanada --------------------- AT&T sintaksa koristi suprotan nacin zapisivanja operanada od nacina na koji se to radi u Intelovoj sintaksi. U intelovoj sintaksi format instrukcija koje zahtjevaju dva operanda je sljedeci: INSTRUKCIJA ODREDISTE, IZVOR U AT&T sintaksi format instrukcije sa dva operanda je sljedeci: INSTRUKCIJA IZVOR, ODREDISTE Pogledajmo sada na nekim primjerima razlike ove dvije sintakse (ne zaboravimo na prethodno navedene razlike u zapisu brojeva, imena registara i oznacavanju duljine operanada!): Intel AT&T mov al, bl movb %bl, %al mov ax, dx movw %dx, %ax push eax pushl %eax 4. Ostale razlike ------------------ Jos jedna od razlika izmedju dviju sintaksa je zapis offset odmaka na bazni registar. Pogledajmo razliku na primjerima: Intel AT&T mov eax, [esp+2] movl 2(%esp), %eax mov cx, [bp+4] movw 4(%bp), %cx Dakle, u AT&T sintaksi offset odmak oznacavamo brojem ispred okrugle zagrade koja sadrzi ime bazog registra, tj. registra koji sadrzi osnovnu adresu na koju racunamo odmak.