Liste des instructions assembleurs Intel x86
Un article de Haypo.
Sommaire |
[modifier] Syntaxe
Les caractères "{" et "}" délimitent un paramètre. Il peut être un registre, une zone mémoire ou une immédiate (une valeur, la plupard du temps c'est un nombre).
Le suffixe "[B/W/D]" terminant une instruction doit être remplacé soit par B, soit par W ou soit par D :
- "B" signifit que l'instruction est en 8 bits (utilise si nécéssaire le registre AL).
- "W" signifit que l'instruction est en 16 bits (utilise si nécéssaire AX).
- "D" signifit que l'instruction est en 32 bits (utilise si nécéssaire EAX).
[modifier] Opérations binaires
[modifier] AND
AND {destination},{masque}
Applique un « et logique » à {destination} par {masque}. Tout bit de {destination} est mis à 0 si le bit correspondant de {masque} vaut 0, et est inchangé si le bit correspondant vaut 1 :
0 AND 0 -> 0 0 AND 1 -> 0 1 AND 0 -> 0 1 AND 1 -> 1
- Equivalant en Turbo Pascal : "{destination} := {destination} and {masque}".
- Equivalant en C : "{destion} &= {masque}".
[modifier] NOT
NOT {destination}
Inverse les bits de {destination} :
NOT 1 -> 0 NOT 0 -> 1
- Equivalant en Turbo Pascal : "{destination} := not {destination}".
- Equivalant en C : "{destination} =~ {destination}".
[modifier] OR
OR {destination}, {masque}
Applique un "OU logique" à {destination} par {masque}.
Tout bit de {destination} est mis à 1 si le bit correspondant de {masque} vaut 1, et laissé inchangé si le bit correspondant vaut 0.
0 OR 0 -> 0 0 OR 1 -> 1 1 OR 0 -> 1 1 OR 1 -> 1
- Equivalant en Turbo Pascal : "{destination} := {destination} or {masque};".
- Equivalant en C : "{destination} |= {masque}".
[modifier] SHL
SHL {registre},{valeur}
Décalage binaire du {registre} de {valeur} vers la gauche (L = Left), les bits apparaissant à droite sont complétés par des zéros.
Exemple :
mov al, 3 shl al,2
Donne al = 12, car 3 = 0011 et son décalage 1100. En fait décaler de X revient à multiplier par 2^X (3*2^2 = 3*4 = 3*2*2 = 12).
- Equivalant en Pascal : « {destination} := {destination} shl {valeur}; »
- Equivalant en C : « {destination} <<= {valeur}; »
[modifier] SHR
SHR {registre},{valeur}
Décalage binaire du {registre} de {valeur} vers la droite (R = Right), les bits apparaissant à gauche sont complétés par des zéros.
Exemple :
mov al, 12 shr al,2"
Donne al = 3, car 12 = 1100 et son décalage 0011. En fait décaler de X revient à diviser par 2^X (12/(2^2)
= 12/4 = 3).
- Equivalant en Pascal : « {destination} := {destination} shr {valeur}; »
- Equivalant en C : « {destination} >>= {valeur}; »
[modifier] XOR
XOR {destination},{masque}
Applique un "ou exclusif" à {destination} par {masque}. Tout bit de {destination} est mis à 1 s'il diffère du bit correspondant de {masque}, et est mis à 0 s'il a la même valeur :
0 XOR 0 -> 0 0 XOR 1 -> 1 1 XOR 0 -> 1 1 XOR 1 -> 0
(c'est le même système que pour la multiplication de nombres relatifs : (+2)x(-3) = (-6), et (-3)x(-3)=9 par exemple)
XOR est utilisé en cryptographique car appliquer deux fois XOR à un même nombre avec le même "masque" redonne le nombre.
Exemple :
24 xor 3 -> 27 27 xor 3 -> 27
XOR {a},{a} : Met à la variable {a} à zéro, beaucoup plus rapidement que "MOV {a},0" car XOR est une instruction de base du processeur.
- Equivalant en Turbo Pascal : "{destination} := {destination} xor {masque}".
- Equivalant en C : "{destion} ^= {masque}".
[modifier] Tests logiques
[modifier] CMP
CMP {a}, {b}
Compare les deux variables {a} et {b}. Toujours suivit d'un saut conditionnel ("J[cas] {offset}", voir sa signification plus bas).
[modifier] CMPS
CMPS[B/D/W]
Compare l'octet/le mot/le double-mot DS:ESI à ES:EDI.
[modifier] SCASB, SCASW, SCASD
SCASB SCASW SCASD
Compare AL/AX/EAX à l'octet/le mot/le double-mot ES:EDI (permet de rechercher une valeur dans une chaine de caractères).
[modifier] TEST
TEST {source},{masque}
Teste si les bits {masque} de {source} sont posés ou non, et modifie ZF en conséquence (ZF posé si les bits de {source} sont posés, sinon ZF=0), ce qui sera exploitable avec [#Jcas "JZ" ou "JNZ"] par la suite. L'instruction permet de tester un bit particulier de {source}.
En particulier : TEST {a},{a} = Teste si la variable {a} est à zéro (pose ou non le drapeau ZF).
[modifier] Branchements
[modifier] CALL
CALL {adresse}
Appelle une procédure qui est à l'adresse {adresse}. Si une ou plusieurs instructions PUSH précèdent un CALL, ceux sont des paramètres qui sont stockés dans la pile. Dans ce cas la procédure commence par
push [e]bp mov [e]bp, [e]sp
et on peut trouver la lecture des paramètres avec des instructions du genre
mov {registre},[ebp-{valeur}]
Il ne faudra surtout pas oublier le
RET [valeur]
à la fin de la procédure (voir plus bas).
[modifier] IRET
IRET {valeur}
Quitte une interruption. Est uniquement utilisé pour les programmes résident comme le pilote de la souris par exemple.
[modifier] JMP
JMP {offset}
Va ("J" = Jump : Sauter) à l'adresse {offset}.
[modifier] J<cas>
J<cas> {offset}
Va à l'adresse {offset} si la condition <cas> est vérifie où <cas> est une condition relative aux "flags" (drapeaux), elle doit être traduite par « Si le résultat d'une opération logique ... » (je prends comme exemple "CMP {a},{b}") :
(non signée)
- JA : est supérieur (a > b), si CF=ZF=0.
- JAE ou JNB ou JNC : est supérieur ou égal (a => b), si CF=0.
- JB ou JC : est inférieur (a <b), si CF=1.
- JBE : est inférieur ou égal (a <= b), si CF=ZF=1.
(signée)
- JG : est supérieur (a > b), si SF=ZF=0.
- JGE : est supérieur ou égal (a => b), si SF=OF.
- JL : est inférieur (a < b), si SF<>OF.
- JLE : est inférieur ou égal (a <= b), si SF<>OF et ZF=1.
(égalité)
- JE ou JZ : est égal (a = b), si ZF = 1
- JNE ou JNZ : est différent (a <> b), si ZF = 0.
[modifier] RET
RET {valeur}
Quitte la procédure en cours. Si des paramètres ont été envoyés au CALL, [xxxx] est le nombre d'octets envoyés qui sont à sortir de la pile.
[modifier] Ports d'entrée/sortie
[modifier] IN
IN {destination},{port}
Lit une valeur 8 bits sur le port {port} (16 bits) et la stocke dans {destination}. Le seul registre autorisé pour {port} est DX.
[modifier] OUT
OUT {source},{port}
Ecrit la valeur {source} (8 bits) sur le port {port} (16 bits). Le seul registre autorisé pour {port} est DX.
[modifier] Accès mémoire et manipulation d'adresse mémoire
[modifier] LEA
LEA {destination},{source}
Ecrit l'adresse de {source} dans {destination}. Equivaut à "MOV {destination}, OFFSET {source}".
[modifier] LDS, LES, LFS, LGS
LDS {destination},{adresse} LES {destination},{adresse} LFS {destination},{adresse} LGS {destination},{adresse} LSS {destination},{adresse}
Copie l'adresse {adresse} en 32 bits dans le registre DS/ES/FS/GS/SS, son [#SegOfst segment], et dans {destination} (16 bits), son [#SegOfst offset].
[modifier] LODSB, LODSW, LODSD
LODSB LODSW LODSD
Copie l'octet/le mot/le double-mot ES:EDI dans AL/AX/EAX (instruction inverse de STOS[B/W/D])
[modifier] MOV
MOV {dst},{src}
Copie la valeur {src} dans {dst}.
[modifier] MOVSB, MOVSW, MOVSD
MOVSB MOVSW MOVSD
Copie l'octet/le mot/le double-mot DS:ESI dans ES:EDI.
[modifier] MOVZX
MOVZX {dst},{src}
Etend à 32 bits le nombre contenu dans {src} (8 bits) et transfert le résultat dans {dst} (16 ou 32 bits).
Exemple: MOVZX ax,al : Efface la partie haute de AX (AH).
[modifier] Calculs arithmétiques
Instructions non détaillées ici : DIV et ADC.
[modifier] ADD
ADD {variable}, {ajout}
Ajoute la valeur spécifiée (registre ou immédiate) à la varible spécifiée (variable ou registre).
[modifier] MUL
MUL {source}
Multiplie la destination explicite par {source}, les deux nombres sont considérés comme non signés. Utiliser "[#Jcas JC {adresse}]" pour tester le débordement. La destination est fonction de la taille de source :
- 8 bits : la destination est AX (le multiplicateur est AL)
- 16 bits : la destination est DX:AX, c'est à dire AX contient la partie basse et DX la partie haute (le multiplicateur est AX)
- 32 bits : la destination est EDX:EAX, c'est à dire EAX contient la partie basse et EDX la partie haute (le multiplicateur est EAX)
[modifier] SUB
SUB {variable}, {moins}
Soustrait valeur spécifiée (registre ou immédiate) à la varible spécifiée (variable ou registre).
[modifier] Manipulation de la pile
[modifier] PUSH
PUSH {valeur}
Met une [valeur] dans la pile.
[modifier] POP
POP {registre}
Sort une valeur de la pile et la stocke dans un [registre].
[modifier] Autres
[modifier] REP
REP {instruction}
REP est en fait un préfixe à une instruction : il répète l'instruction spécifiée ECX fois.
[modifier] STOSB, STOSW, STOSD
STOSB STOSW STOSD
Copie AL/AX/EAX dans l'octet/le mot/le double-mot ES:EDI (inverse de LODS[B/W/D]).