Vous avez sans doute remarqué que les
instructions Assembleur possèdent des noms assez barbares. Pour mieux vous y retrouver,
voici quelques instructions de base (ASM 8088).
ADC (Add with Carry)
| 0001 00dw md,reg,r/m dépl |
ADC reg, reg |
| 0001 00dw md,reg,r/m dépl |
ADC mem, reg |
| 0001 00dw md,reg,r/m dépl |
ADC reg, mem |
| 1000 00sw md,010,r/m dépl data |
ADC reg8, imm8 |
| 1000 00sw md,010,r/m dépl data |
ADC mem8, imm8 |
| 1000 00sw md,010,r/m dépl data |
ADC reg16, imm8 |
| 1000 00sw md,010,r/m dépl data |
ADC mem16, imm8 |
| 1000 00sw md,010,r/m dépl data |
ADC reg16, imm16 |
| 1000 00sw md,010,r/m dépl data |
ADC mem16, imm16 |
| 0001 010w data |
ADC accu, imm |
Addition de 2 opérandes et du Carry
flag. Le résultat de l'addition est transféré dans la première opérande.
ADD
| 0000 00dw md,reg,r/m dépl |
ADD reg, reg |
| 0000 00dw md,reg,r/m dépl |
ADD mem, reg |
| 0000 00dw md,reg,r/m dépl |
ADD reg, mem |
| 1000 00sw md,000,r/m dépl data |
ADD reg8, imm8 |
| 1000 00sw md,000,r/m dépl data |
ADD mem8, imm8 |
| 1000 00sw md,000,r/m dépl data |
ADD reg16, imm8 |
| 1000 00sw md,000,r/m dépl data |
ADD mem16, imm8 |
| 1000 00sw md,000,r/m dépl data |
ADD reg16, imm16 |
| 1000 00sw md,000,r/m dépl data |
ADD mem16, imm16 |
| 0000 010w data |
ADD accu, imm |
Addition de 2 opérandes. Le résultat
de l'addition est transféré dans la première opérande.
AND
| 0010 00dw md,reg,r/m dépl |
AND reg, reg |
| 0010 00dw md,reg,r/m dépl |
AND mem, reg |
| 0010 00dw md,reg,r/m dépl |
AND reg, mem |
| 1000 00sw md,100,r/m dépl data |
AND reg8, imm8 |
| 1000 00sw md,100,r/m dépl data |
AND mem8, imm8 |
| 1000 00sw md,100,r/m dépl data |
AND reg16, imm8 |
| 1000 00sw md,100,r/m dépl data |
AND mem16, imm8 |
| 1000 00sw md,100,r/m dépl data |
AND reg16, imm16 |
| 1000 00sw md,100,r/m dépl data |
AND mem16, imm16 |
| 0010 010w data |
AND accu, imm |
Opérateur logique permettant de
positionner des bits de l'opérande 1 à 0, si les bits correspondants de l'opérande 2 (
= le masque) sont à 0. Les bits à 1 du masque n'ont aucun effet sur l'opérande 1.
Exemple : op1 = 0101 et op2 = 0011. Après un
AND op1, op2 l'op1 est devenu 0001
CALL
| 1110 1000 dépl |
CALL label
; (near) |
| 1001 1010 offset(16) segment(16) |
CALL label
; (far) |
| 1111 1111 md,010,r/m dépl |
CALL reg16
; (indirect near) |
| 1111 1111 md,010,r/m dépl |
CALL mem16
; (indirect near) |
| 1111 1111 md,011,r/m dépl |
CALL mem32
; (indirect far) |
Appelle une procédure. Lors de
l'exécution du CALL, l'adresse de retour de la procédure ( = adresse de l'instruction
suivant le CALL) est sauvegardée sur la pile, afin de retourner au programme dès la fin
de la procédure (terminée par un RET)
CBW (Convert Byte to Word)
Conversion signée de AL (byte) dans AX
(word). Le bit signe de AL est étendu dans AH.
CLC (Clear Carry flag)
Positionne le carry flag à 0.
CLD (Clear Direction flag)
Positionne le Direction flag à 0.
CMP (Compare)
| 0011 10dw md,reg,r/m dépl |
CMP reg, reg |
| 0011 10dw md,reg,r/m dépl |
CMP mem, reg |
| 0011 10dw md,reg,r/m dépl |
CMP reg, mem |
| 1000 00sw md,111,r/m dépl data |
CMP reg8, imm8 |
| 1000 00sw md,111,r/m dépl data |
CMP mem8, imm8 |
| 1000 00sw md,111,r/m dépl data |
CMP reg16, imm8 |
| 1000 00sw md,111,r/m dépl data |
CMP mem16, imm8 |
| 1000 00sw md,111,r/m dépl data |
CMP reg16, imm16 |
| 1000 00sw md,111,r/m dépl data |
CMP mem16, imm16 |
| 0011 110w data |
CMP accu, imm |
Compare 2 opérandes au moyen d'une
soustraction (op1 - op2) qui n'affecte aucune opérande mais dont le seul but est de
positionner les flags. Le CMP est principalement utilisé avant un JMP conditionnel.
CWD (Convert Word to Double)
Conversion signée de AX (word) dans DX:AX (double).
Le bit signe de AX est étendu dans le registre DX.
DEC (Décrementation)
| 1111 111w md,001,r/m dépl |
DEC reg8 |
| 1111 111w md,001,r/m dépl |
DEC mem8,16 |
| 0100 1reg |
DEC reg16 |
Décrémente de 1 l'opérande spécifié.
DIV (Division non
signée)
| 1111 011w md,110,r/m dépl |
DIV reg8,16 |
| 1111 011w md,110,r/m dépl |
DIV mem8,16 |
Divise 2 nombres. Le diviseur est la seule
opérande. Le dividande implicite doit être placé dans l'accumulteur + l'extension. Le
quotient sera fourni dans l'accumulateur et le reste dans l'extension.
| Diviseur |
Dividande |
Quotient |
Reste |
| 8 bits |
AX |
AL |
AH |
| 16 bits |
DX:AX |
AX |
DX |
IDIV (Division signée)
| 1111 011w md,111,r/m dépl |
IDIV reg8,16 |
| 1111 011w md,111,r/m dépl |
IDIV mem8,16 |
Respecte les mêmes règles que DIV.
IMUL (Multiplication
signée)
| 1111 011w md,101,r/m dépl |
IMUL reg8,16 |
| 1111 011w md,101,r/m dépl |
IMUL mem8,16 |
Multiplie 2 nombres. Le multiplicateur est la
seule opérande. Le multiplicande implicite doit être placé dans l'accumulteur. Le
produit sera fourni dans l'accumulateur + l'extension.
| Multiplicateur |
Multiplicande |
Produit |
| 8 bits |
AL |
AX |
| 16 bits |
AX |
DX:AX |
INC (Increment)
| 1111 111w md,000,r/m dépl |
INC reg8 |
| 1111 111w md,000,r/m dépl |
INC mem8,16 |
| 0100 0reg |
INC reg16 |
Incrémente de 1 l'opérande spécifié.
INT (call Interrupt)
| 1100 1100 data |
INT 3 |
| 1100 1101 data |
INT imm8 |
Appelle une interruption du DOS. L'immédiat 8
correspond au numéro de l'interruption à appeler. Les adresses logiques des
interruptions sont situées dans le vecteur d'interruptions (à l'offset 0000:0000). Un
INT 33 provoque donc un sauvetage de CS:IP, puis un JMP
FAR (car les interruptions ne sont pas dans le même segment que votre programme) à la
33e adresse du vecteur.
IRET (Interrupt return)
Signale la fin d'une interruption et retourne au
programme en restaurant CS:IP.
Jcond (conditionnal JMP)
| 0111 0111 depl |
JA label |
; CF = 0 et ZF = 0 |
| 0111 0011 depl |
JAE label |
; CF = 0 |
| 0111 0010 depl |
JB label |
; CF = 1 |
| 0111 0110 depl |
JBE label |
; CF = 1 ou ZF = 1 |
| 0111 0010 depl |
JC label |
; CF = 1 |
| 0111 0100 depl |
JE label |
; ZF = 1 |
| 0111 1111 depl |
JG label |
; ZF = 0 et SF = OF |
| 0111 1101 depl |
JGE label |
; SF = OF |
| 0111 1100 depl |
JL label |
; SF <> OF |
| 0111 1110 depl |
JLE label |
; ZF = 1 ou SF <> OF |
| 0111 0110 depl |
JNA label |
; CF = 1 ou ZF = 1 |
| 0111 0010 depl |
JNAE label |
; CF = 1 |
| 0111 0011 depl |
JNB label |
; CF = 0 |
| 0111 0111 depl |
JNBE label |
; CF = 0 et ZF = 0 |
| 0111 0011 depl |
JNC label |
; CF = 0 |
| 0111 0101 depl |
JNE label |
; ZF = 0 |
| 0111 1110 depl |
JNG label |
; ZF = 1 ou SF <> OF |
| 0111 1100 depl |
JNGE label |
; SF <> OF |
| 0111 1101 depl |
JNL label |
; SF = OF |
| 0111 1111 depl |
JNLE label |
; ZF = 0 et SF = OF |
| 0111 0001 depl |
JNO label |
; OF = 0 |
| 0111 1011 depl |
JNP label |
; PF = 0 |
| 0111 1001 depl |
JNS label |
; SF = 0 |
| 0111 0101 depl |
JNZ label |
; ZF = 0 |
| 0111 0000 depl |
JO label |
; OF = 1 |
| 0111 1010 depl |
JP label |
; PF = 1 |
| 0111 1010 depl |
JPE label |
; PF = 1 |
| 0111 1011 depl |
JPO label |
; PF = 0 |
| 0111 1000 depl |
JS label |
; SF = 1 |
| 0111 0100 depl |
JZ label |
; ZF = 1 |
Effectue un jump si la condition est
vérifiée.
JMP (jump)
| 1110 1011 dépl |
JMP label
;
(direct short) |
| 1110 1001 dépl |
JMP label
;
(direct near) |
| 1110 1010 offset(16) segment(16) |
JMP label
; (direct
far) |
| 1111 1111 md,100,r/m dépl |
JMP reg16/mem16 ; (indirect
near) |
| 1111 1111 md,101,r/m dépl |
JMP mem32
; (indirect far) |
Effectue un jump (modification de l'IP).
L'adresse de retour n'est pas sauvée.
LOOP
L'instruction LOOP décrémente la valeur de CX et
effectue un JNZ (jump si CX <> 0). LOOP est donc utilisé pour effectuer une boucle
(ah bon ! je comprends mieux...) de CX itérations.
MOV (move)
| 1000 10dw md,reg,r/m dépl |
MOV reg,reg |
| 1000 10dw md,reg,r/m dépl |
MOV mem,reg |
| 1000 10dw md,reg,r/m dépl |
MOV reg,mem |
| 1010 00dw dépl |
MOV mem,accu ;
adressage direct |
| 1010 00dw dépl |
MOV accu,mem ;
adressage direct |
| 1100 011w md,000,r/m |
MOV mem,imm |
| 1011 wreg data |
MOV reg,imm |
| 1000 11d0 md,sreg,r/m dépl |
MOV sreg,reg16/mem16 |
| 1000 11d0 md,sreg,r/m dépl |
MOV reg16/mem16,sreg |
Copie l'opérande 2 dans l'opérande 1.
Le MOV n'affecte pas l'opérande 2.
MUL (Multiplication non signée)
| 1111 011w md,100,r/m dépl |
MUL reg8,16 |
| 1111 011w md,100,r/m dépl |
MUL mem8,16 |
Respecte les mêmes règles que IMUL.
NEG (Negation)
| 1111 011w md,011,r/m dépl |
NEG reg8,16 |
| 1111 011w md,011,r/m dépl |
NEG mem8,16 |
L'opérande spécifié reçoit son opposé.
POP
| 0101 1reg |
POP reg16 |
| 1000 1111 md,000,r/m dépl |
POP mem16 |
| 000,sreg,111 |
POP sreg |
Restaure dans l'opérande spécifié le word placé
au sommet de la pile,à l'adresse SS:SP. (SP est ensuite incrémenté de 2)
POPF
Restaure les flags à partir du word placé à
l'adresse SS:SP (SP est ensuite incrémenté de 2)
PUSH
| 0101 0reg |
PUSH reg16 |
| 1111 1111 md,110,r/m dépl |
PUSH mem16 |
| 000,sreg,110 |
PUSH sreg |
Place sur la pile (adresse SS:SP) l'opérande16
spécifié et décrémente SP de 2.
PUSHF
Sauvegarde sur la pile l'état actuel des flags
(flags registre) à l'adresse SS:SP et décrémente SP de 2.
RCL (Rotate Left with Carry)
| 1101 000w md,010,r/m dépl |
RCL reg(8,16)/mem(8,16),1 |
| 1101 001w md,010,r/m dépl |
RCL reg(8,16)/mem(8,16),CL |
Effectue une rotation des bits de l'opérande
spécifié en faisant participer la valeur initiale du carry flag. Tous les bits subissent
un décalage d'une (ou de CL) position(s) vers la gauche, le bit le plus faible reçoit la
valeur du carry, le carry reçoit le bit le plus fort.
RCR (Rotate Right with Carry)
| 1101 000w md,011,r/m dépl |
RCR reg(8,16)/mem(8,16),1 |
| 1101 001w md,011,r/m dépl |
RCR reg(8,16)/mem(8,16),CL |
Effectue une rotation des bits de l'opérande
spécifié en faisant participer la valeur initiale du carry flag. Tous les bits subissent
un décalage d'une (ou de CL) position(s) vers la droite, le bit le plus fort reçoit le
carry, le carry reçoit le bit le plus faible.
SAL ou SHL (Shift Left)
| 1101 000w md,100,r/m dépl |
SHL reg(8,16)/mem(8,16),1 |
| 1101 001w md,100,r/m dépl |
SHL reg(8,16)/mem(8,16),CL |
Effectue un décalage de 1 (ou de CL) position(s)
vers la gauche. Le carry reçoit le bit le plus fort et le bit le plus faible de
l'opérande devient 0.
SHR (Shift Right)
| 1101 000w md,101,r/m dépl |
SHR reg(8,16)/mem(8,16),1 |
| 1101 001w md,101,r/m dépl |
SHR reg(8,16)/mem(8,16),CL |
Effectue un décalage de 1 (ou de CL) position(s)
vers la droit. Le carry reçoit le bit le plus faible et le bit le plus fort de
l'opérande devient 0.
STC (Set Carry flag)
Positionne le carry flag à 1.
STD (Set Direction flag)
Positionne le direction flag à 1.
SUB
| 0010 10dw md,reg,r/m dépl |
SUB reg, reg |
| 0010 10dw md,reg,r/m dépl |
SUB mem, reg |
| 0010 10dw md,reg,r/m dépl |
SUB reg, mem |
| 1000 00sw md,000,r/m dépl data |
SUB reg8, imm8 |
| 1000 00sw md,101,r/m dépl data |
SUB mem8, imm8 |
| 1000 00sw md,101,r/m dépl data |
SUB reg16, imm8 |
| 1000 00sw md,101,r/m dépl data |
SUB mem16, imm8 |
| 1000 00sw md,101,r/m dépl data |
SUB reg16, imm16 |
| 1000 00sw md,101,r/m dépl data |
SUB mem16, imm16 |
| 0010 110w data |
SUB accu, imm |
Soustrait l'opérande 2 à l'opérande
1. Le résultat de la soustraction est transféré dans la première opérande.
XCHG
| 1000 011w md,reg,r/m dépl |
XCHG reg, reg |
| 1000 011w md,reg,r/m dépl |
XCHG mem, reg |
| 1000 011w md,reg,r/m dépl |
XCHG reg, mem |
| 1001 0reg |
XCHG AX,reg16 ou XCHG
reg(16),AX |
Inverse la valeur des 2 opérandes.
|