Les syntaxes AT&T et Intel#
La principale différence entre les syntaxes AT&T et Intel réside dans l’ordre des opérandes et leur notation. Pour une instruction de la forme <op> A, B :
Ordre des opérandes :
AT&T :
B <- B <op> A(destination à droite)Intel :
A <- A <op> B(destination à gauche)
Caractéristiques de la syntaxe AT&T :
Préfixe
$pour les valeurs immédiatesPréfixe
%pour les registresPréfixe
*pour les sauts/appels absolusSuffixe de taille sur l’instruction (
b,w,l,q)
Caractéristiques de la syntaxe Intel :
Pas de préfixes pour les valeurs immédiates et registres
Spécification de la taille des données mémoire via des préfixes (
byte ptr,word ptr, etc.)Notation plus simple pour les opérations de base
Les appels/sauts lointains :
AT&T :
lcalletljmpIntel :
call faretjump far
Sur AT&T les saut et appels absolu doivent être préfixés par ‘*’, Sans ‘*’, l’assembleur x86_64 utilise l’adressage relatif au RIP.
Exemple:
; Copier 42 dans eax
;AT&T:
movl $42, %eax ; B ← B op A
;Intel:
mov eax, 42 ; A ← A op B
Spécification de la taille#
AT&T utilise des suffixes sur l’instruction :
b: byte (8 bits)w: word (16 bits)l: long (32 bits)q: quad (64 bits)
Intel utilise des préfixes sur l’opérande pour spécifié la taille des données à lire/écrire en mémoire (voyez le comme le type d’un pointeur en C) :
byte ptr: 8 bitsword ptr: 16 bitsdword ptr: 32 bitsqword ptr: 64 bits
Exemple :
; Charger une valeur 16 bits depuis la mémoire
;AT&T:
movw (%ebx), %ax
;Intel:
mov ax, word ptr [ebx]
Caractéristique |
Intel |
AT&T |
Exemple Intel |
Exemple AT&T |
|---|---|---|---|---|
Ordre des opérandes |
Destination, Source |
Source, Destination |
|
|
Préfixe registre |
(aucun) |
% |
|
|
Préfixe immédiat |
(aucun) |
$ |
|
|
Taille opération |
Préfixe sur opérande |
Suffixe sur instruction |
|
|
Mode d’adressage |
|
|
|
|
Extensions de signe et de zéro#
Format AT&T : mov + s(sign)/z(zero) + source size (b,w,l) + destination size (w,l,q)
Exemples courants :
; Sign-extend byte vers long (32 bits)
;AT&T:
movsbl %al, %eax
;Intel:
movsx eax, al
; Zero-extend byte vers long
;AT&T:
movzbl %al, %eax
;Intel:
movzx eax, al
Pour résumer, les instructions d’extensions avec mov sont:
Opération |
Intel |
AT&T (variantes) |
|---|---|---|
sign-extend 8→16 bits |
|
|
sign-extend 8→32 bits |
|
|
sign-extend 8→64 bits |
|
|
sign-extend 16→32 bits |
|
|
sign-extend 16→64 bits |
|
|
sign-extend 32→64 bits |
|
|
zero-extend 8→16 bits |
|
|
zero-extend 8→32 bits |
|
|
zero-extend 8→64 bits |
|
|
zero-extend 16→32 bits |
|
|
zero-extend 16→64 bits |
|
|
Certaines instructions ont plusieurs noms équivalents en AT&T (par exemple
movsbl/movsxb/movsx) pour maintenir la compatibilité avec différentes conventions.
Il existe des instructions d’extension de signe specialement pour le registre a.
Description |
Intel |
AT&T |
|---|---|---|
byte(%al) → word(%ax) |
|
|
word(%ax) → dword(%eax) |
|
|
dword(%eax) → quad(%rax) |
|
|
word(%ax) → dword(%dx:%ax) |
|
|
dword(%eax) → quad(%edx:%eax) |
|
|
quad(%rax) → octuple(%rdx:%rax) |
|
|
Commentaires AT&T#
#: commentaire jusqu’à la fin de la ligne;: séparateur d’instructions/: commentaire (si –divide non activé)