Liste des instructions assembleurs Intel x86

Un article de Haypo.

Retour à la page précédente Retour à l'assembleur

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]).