Aide mémoire : ASM

 

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)

1001 1000 CBW

Conversion signée de AL (byte) dans AX (word). Le bit signe de AL est étendu dans AH.


CLC (Clear Carry flag)

1111 1000 CLC

Positionne le carry flag à 0.


CLD (Clear Direction flag)

1111 1100 CLD

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)

1001 1001 CWD

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)

1100 1111 IRET

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

1110 0010 LOOP   label

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

1001 1101 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

1001 1100 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)

1111 1001 STC

Positionne le carry flag à 1.


STD (Set Direction flag)

1111 1101 STD

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.


     

© Copyright Benjamin Fonzé 1999/2000