Appendice B.   Confronto tra sintassi AT&T e sintassi Intel

Vediamo un confronto sommario tra la sintassi AT&T e la sintassi Intel che è maggiormente usata essendo adottata da un numero maggiore di tipi di assembly.

Fra questi citiamo:

Segnaliamo che non tutti gli assembly sono case sensitive come GAS; alcuni lo sono (NASM), altri no (MASM).

Notiamo inoltre che, nel caso della sintassi Intel, solo le etichette istruzioni sono seguite da «:» mentre in GAS tale simbolo segue qualunque etichetta.

Vediamo adesso le altre differenze più rilevanti tra i due tipi di sintassi riferendosi, per quella Intel, all'assembly NASM.

Come abbiamo visto, nella sintassi AT&T i nomi dei registri sono preceduti dal simbolo «%», mentre i valori immediati sono preceduti dal simbolo «$»; questo non avviene invece nella sintassi Intel.

Sappiamo che il simbolo «$» nella sintassi AT&T può precedere anche un nome di etichetta e in quel caso serve a riferirsi al suo indirizzo in memoria; per lo stesso scopo, nella sintassi Intel, basta usare il nome dell'etichetta.

Con la sintassi Intel i valori esadecimali si indicano inserendo il suffisso «h» e il prefisso «0» se iniziano con una lettera, oppure utilizzando il prefisso «0x» (come nella sintassi AT&T).

Nella sintassi Intel non ci sono i suffissi delle istruzioni; allo stesso scopo, esistono le direttive byte ptr, word ptr, dword ptr, ma sono poco usate in quanto è la dimensione degli operandi a stabilire la natura dell'istruzione usata.

Ribadiamo che anche anche GAS si comporta in modo simile permettendo l'omissione del suffisso che poi viene assegnato in automatico dall'assemblatore in base alla natura degli operandi; ciò però è possibile solo se nell'operazione non sono coinvolte locazioni di memoria ed inoltre è sempre consigliabile usare i suffissi per aumentare la leggibilità dei sorgenti.

Per riassumere le differenze appena illustrate usiamo la tabella B.1 in cui sono inserite istruzioni equivalenti, scritte secondo le regole di sintassi delle due tipologie di assembly.

Tabella B.1

Intel AT&T
mov eax, 5 movl $5, %eax
mov ecx, 0ffh movl $0xff, %ecx
int 80h int $0x80
mov cl, dh movb %dh, %cl
mov ax, bx movw %bx, %ax
mov ebx, dword ptr [ecx] movl (%ecx), %ebx

Come si evince dagli esempi della tabella precedente, il ruolo degli operandi è opposto nei due casi: si scrive prima la destinazione nella sintassi Intel e prima la sorgente nella sintassi AT&T.

Nella sintassi Intel i commenti si inseriscono in una sola maniera: facendoli precedere dal carattere «;».

Quando si fa riferimento a locazioni di memoria, nella sintassi Intel si usano le parantesi quadre invece che quelle tonde della sintassi AT&T.

Nella tabella B.2 vediamo alcuni esempi a tale proposito.

Tabella B.2

Intel AT&T
mov eax, [ebx] ; commento movl (%ebx), %eax # commento
mov ecx, dato movl $dato, %ecx
mov eax, [ebx+3] movl 3(%ebx), %eax

Nel primo caso si muove nel registro eax il contenuto della cella puntata da ebx; nel secondo caso si muove in ecx l'indirizzo dell'etichetta dato; il terzo è un caso particolare dell'indirizzamento base + index * scale + disp (base + indice * scala + scostamento) di cui daremmo qualche cenno nel paragrafo 3.17: si sposta in eax il contenuto della cella il cui indirizzo è dato dal valore di ebx più tre.