Vous êtes sur la page 1sur 12

UAMB M1 ELT/ER

Faculté de Technologie UEM 111


Dpt . de Génie électrique

Rappel sur la programmation en assembleur 8086


en utilisant l’émulateur « Emu8086 »
Comment déclarer les données :
Pour la déclaration des données, l’Emu8086 supporte deux types de variables :
DB : Pour « Define Byte » pour un octet (8 bits).
DW : Pour « Define Word » pour mot (16 bits).
La syntaxe utilisée est la suivante :
Var1 DB valeur
Var2 DW valeur
- Var1 et Var2 représentent les noms des variables.
- « Valeur » représente une valeur numérique dans n’importe quel système de
numération (décimal, binaire, hexa …) ou encore le symbole « ? » pour une
variable non initialisée.
Les tableaux de données :
Pour déclarer un tableau de valeurs, on utilise la syntaxe suivante :
tab DB valeur1, valeur2, valeur3, …
- tab représente le nom du tableau.
- valeur1, valeur2, valeur3, … représentent des valeurs numériques dans
n’importe quel système de numération (décimal, binaire, hexa …) ou encore le
symbole « ?, ?, ?, … » pour un tableau non initialisé.
Exemple 1:
a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h
48h 65h 6Ch 6Ch 6Fh 00h …
a[0] a[1] a[2] a[3] a[4] a[5]

a[0]... a[5] sont les adresses mémoire des éléments du tableau.


Le tableau peu comporter aussi une chaîne de caractères. Dans un tel cas la
syntaxe suivante est utilisée :
B DB ’E’,’a’, 'Hello'

1
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Le compilateur convertit cette chaîne de caractères en un ensemble d’octets


équivalent.
Dans le cas d’une répétition d’un même octet (ou une chaîne d’octets), la
déclaration des variables peut être simplifiée en utilisant la syntaxe suivante :
c DB 5 DUP(9)
Qui est équivalente à : c DB 9, 9, 9, 9, 9
Ou encore :
d DB 5 DUP(1, 2)
Qui est équivalente à : d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2

Remarque :
ORG 100h est une directive de compilation, Elle indique au compilateur que le
fichier exécutable sera chargé à l'offset 100h.

Exemple 2:
#make_com#
ORG 100h ; cette partie est générée automatiquement dès l’ouverture
; du nouveau fichier
var1 db 7 ; déclaration des données
var2 dw 1234h
tab1 db 1,2,3,4,5
tab2 db 5 dup(2)
ret ; arrêter le programme
- Après la saisie du programme, cliquer sur ‘émuler’ puis ‘exécuter’.
- Essayer de vérifier le résultat dans la partie mémoire.
L’instruction MOV :
Avant de voir les différentes méthodes d’accès à la mémoire, on doit savoir
utiliser une instruction très puissante du langage assembleur qui est l’instruction
MOV.
MOV destination, source ; Copier la deuxième opérande (source) dans la
; première opérande (destination).

2
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

L'opérande source peut être une valeur immédiate, un registre d'usage général ou
un emplacement mémoire. Le registre de destination peut être un registre
d'usage général ou un emplacement mémoire et dans tous les cas, les deux
opérandes doivent avoir la même taille. Les combinaisons possibles sont les
suivantes :
MOV REG, mémoire
MOV mémoire, REG
MOV REG, REG
MOV mémoire, immédiate
MOV REG, immédiate
avec :
REG : AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
mémoire : [BX], [BX+SI+7], variable, etc.
immédiate : 5, -24, 3Fh, 10001101b, etc.
Dans le cas où l’une des opérandes est un registre de segment (DS, ES, CS, SS),
seules les combinaisons suivantes sont supportées :
MOV SREG, mémoire
MOV mémoire, SREG
MOV REG, SREG
MOV SREG, REG
avec :
SREG : DS, ES, SS, et uniquement en tant que deuxième opérande pour : CS.
REG : AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
mémoire : [BX], [BX+SI+7], variable, etc.
Remarque :
L'instruction MOV ne peut pas être utilisée pour copier la valeur du registre IP.

3
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Exemple 3: Utilisation de l’instruction MOV :


#make_com# ; Demande au compilateur de générer un fichier COM.
ORG 100h ; Directive requise pour un programme COM.
MOV AX, 0B800h ; Placer dans AX la valeur hexadécimale B800h.
MOV DS, AX ; Copier la valeur de AX dans DS.
MOV CL, 'A' ; Placer dans CL le code ASCII du caractère 'A', qui est 41h.
MOV CH, 01011111b ; Placer dans CH une valeur binaire.
MOV BX, 15Eh ; Placer dans BX, 15Eh.
MOV [BX], CX ; Copier le contenu de CX dans la mémoire à l'adresse B800:015E.
RET ; Retourne au système d'exploitation.

- Exécuter ce programme pas à pas et observer les contenus des registres.

Différentes méthodes d’accès à la mémoire :


Pour accéder à la mémoire nous pouvons utiliser les quatre registres suivants :
BX, SI, DI, BP.
En combinant ces registres à l'intérieur des symboles [ ], nous pouvons obtenir
différentes zones de mémoire. Les combinaisons possibles sont résumées par le
tableau suivant :
BX SI
BP DI Déplacement

Exemples de combinaisons : [BX], [BX+ DI], [BX+SI+25], [BX+DI+25], …

Exemple 4:
Pour charger la valeur 1Ah à l’adresse (0B800 : 015Eh) on écrit :
MOV AX, 0B800h ; choisir le segment
MOV DS, AX ; pointer le registre de segment de données DS
MOV BX, 015Eh ; choisir le déplacement dans le segment
MOV [BX], 1Ah ; charger la valeur 1Ah à l’adresse 0B800h : 015E h

- Émuler le programme et vérifier le résultat.

4
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Pour l’Emu8086, on peut accéder à un élément d’un tableau de valeur ‘tab’


comme suite :
MOV destination, tab[indice]
avec : indice = 0,1, 2, ….
Exemple 5:
tab DB 8h, 65h, 6Ch, 3Ch, 6Fh, 0E0h
MOV AL, tab[3] ; pour accéder au quatrième élément et le charger dans AL
Ou bien en utilisant les registres d’indexe BX, SI, DI, BP, par exemple :
MOV SI, 3 ; pointer SI à l’adresse du quatrième élément.
MOV AL, , tab[SI] ; charger le contenu de tab[SI]dans AL
- Ecrire et exécuter ces instructions avec l’émulateur.
Adresse mémoire d’une variable
Pour obtenir l’adresse mémoire d’une variable, l’instruction LEA est utilisée.
Syntaxe : LEA destination, source
L’instruction LEA transfère l’adresse effective référencée par l’opérande source
dans le registre cité par l’opérande destination.
Exemple 6:
#make_com#
ORG 100h
LEA AX, m ; charger l’adresse de la variable m dans AX
RET
m DW 1234h

Les autres instructions de l’assembleur du µp8086 :

Instructions arithmétiques et logiques :


La plupart des opérations arithmétiques et logiques affectent le registre
d’état (16 bits) qui contient les indicateurs (flags) suivants :
- Carry Flag (CF) (ou Indicateur de retenue) : Ce flag est à 1 lorsque lors d'un
débordement non signé. Par exemple lorsque vous ajoutez dans un octet
« 255 + 1 » (le résultat n'est pas compris entre 0 et 255). Lorsqu'il n'y a pas
débordement ce flag reste à 0.

5
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

- Zero Flag (ZF) (ou Indicateur de zéro) : Ce flag est à 1 lorsque le résultat est
zéro. Lorsque le résultat est autre que zéro, ce flag reste à 0.
- Sign Flag (SF) (ou Indicateur de signe) : Ce flag est à 1 lorsque le résultat est
négatif. Lorsque le résultat est positif, le flag restr à 0. Ce flag prend la valeur
du bit le plus significatif.
- Overflow Flag (OF) (ou Indicateur de débordement) : Ce flag est à 1 lorsqu'un
débordement signé a lieu. Par exemple, il y a débordement, lorsque dans l'octet,
vous ajoutez 100 + 50 (le résultat n'est pas compris entre -128 et 127).
- Parity Flag (PF) (ou Indicateur de parité) : Ce flag est à 1 lorsque le résultat
est un nombre pair de bits, ce flag est à 0 lorsque le résultat est un nombre
impair de bits. Même si le résultat est un Word (mot), uniquement les 8 bits de
poids faible sont analysés.
- Auxiliary Flag (AF) (ou Indicateur auxiliaire) : Ce flag est à 1 lorsqu'un
débordement non signé a lieu sur les 4 bits de poids faible.
- Interrupt enable Flag (IF) (ou Indicateur d'interruption) : Lorsque ce flag est
à 1, le processeur réagit aux interruptions des dispositifs externes.
- Direction Flag (DF) (ou Indicateur de direction) : Ce flag est utilisé par
quelques instructions pour traiter les chaînes de données, Lorsque cet indicateur
est placé à 0, la chaîne est traitée octet par octet en incrémentant, lorsque cet
indicateur est placé à 1, la chaîne est traitée octet par octet en décrémentant.
On peut deviser l’ensemble des instructions arithmétiques et logiques en trois
groupes :
Premier groupe : ADD, SUB,CMP, AND, TEST, OR, XOR
- ADD : Ajoute le deuxième opérande au premier.
- SUB : Soustrait le deuxième opérande du premier.
- CMP : Soustrait le deuxième opérande du premier pour les flags uniquement.
- AND : Compare par un AND (ET) logique tous les bits des deux opérandes
- TEST : Idem à AND mais pour les flags uniquement.
- OR : Effectue un OR (OU) logique entre tous les bits des deux opérandes.
- XOR : Effectue un XOR logique (OR (OU) exclusif) entre tous les bits des
deux opérandes
Ces types d'opérandes sont supportés :
REG, mémoire
mémoire, REG
REG, REG
mémoire, immédiat
REG, immédiat
Ces instructions affectent uniquement les flags suivants : CF, ZF, SF, OF, PF,
AF.

6
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Exemple 7:
MOV AL,05h
MOV BL,02h
ADD AL, BL
SUB AL, 01h
-Emuler et dire que fait ce programme. Vérifier les flags.

Deuxième groupe : MUL, IMUL, DIV, IDIV


- MUL - Multiplication non signée :
Lorsque l'opérande est un byte (octet) : AX = AL * opérande.
Lorsque l'opérande est un word (mot) : (DX AX) = AX * opérande.
- IMUL - Multiplication signée :
Lorsque l'opérande est un byte (octet) : AX = AL * opérande.
Lorsque l'opérande est un word (mot) : (DX AX) = AX * opérande.
- DIV - Division non signée :
Lorsque l'opérande est un octet :AL = AX /opérande=quotient et AH = reste.
Lorsque l'opérande est un mot : AX = (DX AX) / opérande et DX = reste.
- IDIV - Division signée :
Lorsque l'opérande est un octet : AL = AX / opérande et AH = reste (module).
Lorsque l'opérande est un mot : AX = (DX AX) / opérande et DX = reste.

Les types d'opérandes suivants sont supportés :


REG
mémoire

Les instructions MUL et IMUL affectent uniquement les flags suivants : CF, OF
Lorsque le résultat est plus grand que la taille de l'opérande ces flags sont placés
à 1, lorsque la taille de l'opérande est ajustée ces flags sont placés à 0.
Pour DIV et IDIV les flags ne sont pas définis.

Exemple 8:
MOV AX, 0010 h
MOV BX,0002 h
MUL BX
MOV BX,0003 h
DIV BX
- Emuler et dire que fait ce programme. Vérifier les flags.

7
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Troisième groupe : INC, DEC, NOT, NEG

- INC : incrémente le contenu de l’opérande


- DEC : décrémente le contenu de l’opérande
- NOT : Inverse chaque bit de l'opérande.
- NEG : Effectue un complément à 2 sur l'opérande négatif.

Les types d'opérandes suivants sont supportés :


REG
mémoire

Les instructions INC, DEC affectent uniquement les flags suivants : ZF, SF,
OF, PF, AF.
L'instruction NOT n'affecte aucun flag.
L'instruction NEG affecte uniquement les flags suivants : CF, ZF, SF, OF, PF,
AF.

Exemple 9:
MOV AX, 0005h
INC AX
NEG AX
NOT AX
ADD AX,0001h
- Emuler et commenter ce programme.

Instructions de branchement :
Ces instructions permettent le contrôle du programme, faire des
branchements (sauts) conditionnels à des instructions comportant une étiquette.

Exemple 10:
JMP étiquette ; saut inconditionnel à étiquette.

Les autres instructions du même type sont :


-Instructions de saut qui testent simplement un flag ;
- Instructions de saut pour les nombres signés ;
- Instructions de saut pour les nombres non signés.

8
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Instructions de saut qui testent simplement un flag

Condition
Instruction
Instruction Description Flag(s)
inverse
testé(s)

JZ Saut si zéro. JNZ


ZF = 1
JE Saut si égal. JNE

JC Saut si Retenue (inférieur). JNC


JB Saut si inférieur. CF = 1 JNB
JNAE Saut si ni supérieur ni égal. JAE

JS Saut si signe négatif. SF = 1 JNS

JO Saut si débordement. OF = 1 JNO

JPE Saut si parité paire.


PF = 1 JPO
JP Saut si parité.

JNZ Saut si pas zéro. JZ


ZF = 0
JNE Saut si différent. JE

JNC Saut si pas de retenue. JC


JNB Saut si pas inférieur. CF = 0 JB
JAE Saut si supérieur ou égal. JNAE

JNS Saut si aucun signe (positif). SF = 0 JS

JNO Saut si pas de débordement. OF = 0 JO

JPO Saut si parité impaire. JPE


PF = 0
JNP Saut si pas de parité. JP

9
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

- Instructions de saut pour les nombres signés

Condition
Instruction
Instruction Description Flag(s)
inverse
testé(s)

JE Saut si égal (=). JNE


ZF = 1
JZ Saut si zéro. JNZ

JNE Saut si pas égal (<>). JE


ZF = 0
JNZ Saut si pas zéro. JZ

ZF = 0
JG Saut si supérieur (>). JNG
et
JNLE Saut si ni inférieur ni égal (non <=). JLE
SF = OF

JL Saut si inférieur (<). SF <> JNL


JNGE Saut si ni supérieur ni égal (non >=). OF JGE

JGE Saut si supérieur ou égal (>=). JNGE


SF = OF
JNL Saut si pas inférieur (non <). JL

ZF = 1
JLE Saut si inférieur ou égal (<=). ou JNLE
JNG Saut si pas supérieur (non >). SF <> JG
OF

- Instructions de saut pour les nombres non signés

Condition
Instruction
Instruction Description Flag(s)
inverse
testé(s)

JE Saut si égal (=). JNE


ZF = 1
JZ Saut si zéro. JNZ

JNE saut si non égal (<>). JE


ZF = 0
JNZ Saut si non zéro. JZ

CF = 0
JA Saut si supérieur (>). JNA
et
JNBE Saut si ni inférieur ni égal (non <=). JBE
ZF = 0

10
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Saut si inférieur (<).


JB JNB
Saut si ni supérieur ni égal (non
JNAE CF = 1 JAE
>=).
JC JNC
Saut si retenue.

JAE Saut si supérieur ou égal (>=). JNAE


JNB Saut si pas inférieur (non <). CF = 0 JB
JNC Saut si pas retenue.

CF = 1
JBE Saut si inférieur ou égal (<=). JNBE
ou
JNA Saut si pas inférieur (non >). JA
ZF = 1

Exemple 11:
MOV AX, 0001h
MOV BX, 0005h
etq: INC AX
CMP AX,BX
JNE etq
INT 20h
- Emuler et commenter ce programme.

La pile :
La pile est une zone de la mémoire pour conserver provisoirement des données.
PUSH - stocke une valeur 16 bits sur la pile.
POP - récupère une valeur 16 bits de la pile.
Syntaxe pour l'instruction PUSH :
PUSH REG
PUSH SREG
PUSH mémoire
PUSH immédiate
Syntaxe pour l'instruction POP :
POP REG
POP SREG
POP mémoire

Remarque :
- PUSH et POP travaillent uniquement avec des valeurs de 16 bits.
- La pile utilise l'algorithme LIFO (dernier entré, premier sorti),

11
UAMB M1 ELT/ER
Faculté de Technologie UEM 111
Dpt . de Génie électrique

Exemple 12:
MOV AX, 1234h
PUSH AX
MOV AX, 5678h
POP AX
RET
- Emuler et commenter ce programme.
Remarque :
Pour les autres instructions de l’assembleur du µp8086, se référer au cours ou à
la rubrique d’aide de l’Emu8086

Les interruptions :
Les vecteurs d’interruption sont des sous-programmes prédéfinis. Chaque
interruption est destinée à réaliser une tâche bien définie. Il existe en tout 256
interruptions pour la famille des µp8086 dont 224 peuvent être logicielles.

Exemple 13 :
Lecture d’un caractère à partir d’un clavier :
MOV AX,01
INT 21h
INT 20 h
Ce programme permet de charger le code ASCII du caractère dans AL. Dans le
cas où le touche tapée est un caractère spécial, AL est remis à zéro et AH
contient le code ASCII de ce dernier.

La mémoire vidéo :
Pour travailler en mémoire vidéo, le registre de segment DS doit être pointé à
partir du segment : 0B800h, cela est utile pour les programmes d’affichage et
d’utilisation de l’écran en général.
Exemple 14 :
MOV AX, 0B800h
MOV DS, AX
; afficher ‘HELLO’ sur l’écran
MOV [02h], 'H'
MOV [04h], 'E'
MOV [06h], 'L'
MOV [08h], 'L'
MOV [0Ah], 'O'
RET
- Copier et exécuter ce programme avec l’émulateur Emu8086.

12

Vous aimerez peut-être aussi