Vous êtes sur la page 1sur 42

Notes de Cours : Calculateurs & Interfaçage Chapitre03

25
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Chapitre 03 : Le microprocesseur INTEL 8086


I. Description physique du 8086:
Le microprocesseur Intel 8086 est apparu en 1978. Ce fut le premier
microprocesseur 16 bits et le premier de la famille Intel 80x86 (8086, 80186,
80286, 80386, 80486, Pentium, ...). Il se présente sous la forme d’un boîtier
DIP (Dual In-line Package) à 40 broches alimenté par une alimentation 5V. Il
possède un bus multiplexé adresse/donnée de 20 bits organisé comme suit :
Le bus de donnée occupe 16 bits ce qui permet d'échanger des mots de
2 octets
Le bus d'adresse occupe 20 bits ce qui permet d'adresser 1 Moctets
(220)
Il est entièrement compatible avec le 8088, le jeu d'instruction est
identique. La seule différence réside dans la taille du bus de données,
celui du 8088 fait seulement 8 bits. Les programmes tourneront donc
un peu plus lentement sur ce dernier puisqu'il doit échanger les mots
de 16 bits en deux étapes.
Tous les registres sont de 16 bits, mais pour garder la compatibilité
avec le 8085/8088, certains registres sont découpés en deux et on peut
accéder séparément à la partie haute et à la partie basse.

Fig. 3.1. Description du microprocesseur INTEL 8086

II. Schéma fonctionnel du 8086:


Le schéma fonctionnel du processeur est comme suit :

26
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Fig. 3.2. Schéma fonctionnel du INTEL 8086

III. Description des signaux du 8086:


CLK : entrée du signal d’horloge qui cadence le fonctionnement du

microprocesseur. Ce signal provient d’un générateur d’horloge : le 8284.


RESET : entrée de remise à zéro du microprocesseur. Lorsque cette entrée est
mise à l’état haut pendant au moins 4 périodes d’horloge, le microprocesseur
est réinitialisé : il va exécuter l’instruction se trouvant à l’adresse FFFF0H
(adresse de bootstrap). Le signal de RESET est fourni par le générateur
d’horloge.
READY : entrée de synchronisation avec la mémoire. Ce signal provient
également du générateur d’horloge.
TEST : entrée de mise en attente du microprocesseur d’un événement
extérieur.
MX/MX : entrée de choix du mode de fonctionnement du microprocesseur :
Mode minimum (MX/MX = 1) : le 8086 fonctionne de manière
autonome, il génère lui-même le bus de commande (RD, WR, ...) ;
Mode maximum (MX/MX = 0) : ces signaux de commande sont produits
par un contrôleur de bus, le 8288. Dans ce mode on arrive à réaliser
des systèmes multiprocesseurs.
27
Notes de Cours : Calculateurs & Interfaçage Chapitre03
NMI et INTR : entrées de demande d’interruption. INTR : interruption
normale, NMI (Non Maskable Interrupt) : interruption prioritaire.
INTA : Interrupt Acknowledge, indique que le microprocesseur accepte
l’interruption.
HOLD et HLDA : signaux de demande d’accord d’accès direct à la mémoire
(DMA).
S0 à S7 : signaux d’état indiquant le type d’opération en cours sur le bus.
A16/S3 à A19/S6 : 4 bits de poids fort du bus d’adresses, multiplexés avec 4
bits d’état.
AD0 à AD15 : 16 bits de poids faible du bus d’adresses, multiplexés avec 16
bits de données. Le bus A/D est multiplexé (multiplexage temporel) d’où la
nécessité d’un démultiplexage pour obtenir séparément les bus d’adresses et
de données :
16 bits de données (microprocesseur 16 bits) ;
20 bits d’adresses, d’où 220 = 1 Mo d’espace mémoire adressable par le
8086.
Chronogramme du bus A/D :

Fig. 3.4. Chronogramme du bus A/D

Le démultiplexage des signaux AD0 à AD15 (ou A16/S3 à A19/S6) se fait en


mémorisant l’adresse lorsque celle-ci est présente sur le bus A/D, à l’aide
d’un verrou (latch), ensemble de bascules D. La commande de mémorisation
de l’adresse est générée par le microprocesseur : c’est le signal ALE, Address
Latch Enable.
La figure ci-dessous nous permet de voir comment se fait le démultiplexage :
28
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Fig. 3.5. Démultiplexage du bus A/D

Fonctionnement :
Si ALE = 1, le verrou est transparent (Q = D) ;
Si ALE = 0, mémorisation de la dernière valeur de D sur les sorties Q;
les signaux de lecture (RD) ou d’écriture (WR) ne sont générés par le
microprocesseur que lorsque les données sont présentes sur le bus
A/D.

Fig. 3.6. Circuit intégré 8282 comportant 8 bascules D

RD : Read, signal de lecture d’une donnée.


WR : Write, signal d’écriture d’une donnée.
M/IO : Memory/Input-Output, indique si le 8086 adresse la mémoire (M/IO =
1) ou les entrées/sorties (M/IO = 0).
DEN : Data Enable, indique que des données sont en train de circuler sur le
bus A/D (équivalent de ALE pour les données).
DT/R : Data Transmit/Receive, indique le sens de transfert des données :

29
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Fig. 3.7. Chronogramme du bus DT/R

DT/R = 1 : données émises par le microprocesseur (écriture) ;


DT/R = 0 : données reçues par le microprocesseur (lecture).
Les signaux DEN et DT/R sont utilisés pour la commande de tampons de bus
(buffers) permettant d’amplifier le courant fourni par le microprocesseur sur
le bus de données.

Fig. 3.8. Circuit intégré 8286 circuit transmetteur bidirectionnel

BHE : Bus High Enable, signal de lecture de l’octet de poids fort du bus de
données. Le 8086 possède un bus d’adresses sur 20 bits, d’où la capacité
d’adressage de 1 Mo ou 512 K.mots de 16 bits (bus de données sur 16 bits).
Le méga-octet adressable est divisé en deux banques de 512 Ko chacune : la
banque inférieure (ou paire) et la banque supérieure (ou impaire).

30
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Fig. 3.9. Division de la mémoire en deux banques distinctes

Ces deux banques sont sélectionnées par :


A0 pour la banque paire qui contient les octets de poids faible ;
BHE pour la banque impaire qui contient les octets de poids fort.
Seuls les bits A1 à A19 servent à désigner une case mémoire dans chaque
banque de 512 Ko. Le microprocesseur peut ainsi lire et écrire des données
sur 8 bits ou sur 16 bits :

A0 Octets transférés

0 0 Les deux octets complets


0 1 Octet fort (adresse impaire)
1 0 Octet faible (adresse paire)
1 1 Aucun octet

Le 8086 ne peut lire une donnée sur 16 bits en une seule fois, uniquement si
l’octet de poids fort de cette donnée est rangé à une adresse impaire et l’octet
de poids faible à une adresse paire (alignement sur les adresses paires), sinon
la lecture de cette donnée doit se faire en deux opérations successives, d’où
une augmentation du temps d’exécution du transfert dû à un mauvais
alignement des données.
Réalisation des deux banques avec plusieurs boîtiers mémoire :

31
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Fig. 3.9. Division de la mémoire en deux banques distinctes

Fig. 3.10. Schéma de bus système du 8086

32
Notes de Cours : Calculateurs & Interfaçage Chapitre03
IV. Organisation interne du 8086:
Le 8086 est constitué de deux unités fonctionnant en parallèle :
L’unité d’exécution (EU : Execution Unit) ;
L’unité d’interface de bus (BIU : Bus Interface Unit).
Ces deux unités ont pour rôle :

 L’unité d’interface de bus (BIU) recherche les instructions en mémoire


et les range dans une file d’attente ;
 L’unité d’exécution (EU) exécute les instructions contenues dans la file
d’attente.
 Les deux unités fonctionnent simultanément, (fonctionnement selon le
principe du pipe-line).

Fig. 3.11. Organisation interne de microprocesseur Intel 8086

33
Notes de Cours : Calculateurs & Interfaçage Chapitre03
Le microprocesseur 8086 contient 14 registres répartis en 4 groupes :

a) Registres généraux
Ce sont des registres généraux mais ils peuvent être utilisés pour des
opérations particulières. Les registres généraux participent aux opérations
arithmétiques et logiques ainsi qu'à l'adressage. Ils sont au nombre de 4. Ils
peuvent être également considérés comme 8 registres sur 8 bits. Le 8086 peut
donc effectuer des opérations 8 bits d'une façon compatible avec le 8080.
AX = (AH, AL): Accumulateur
 Usage général,
 Obligatoire pour la multiplication et la division,
 Ne peut pas servir pour l'adressage.
BX = (BH, BL): Base
 Usage général,
 Adressage, (Par défaut, son offset est relatif au segment DS).
CX = (CH, CL): Comptage et calcul
 Usage général,
 Utilisé par certaines instructions comme compteur de répétition,
 Ne peut pas servir pour l'adressage.
DX = (DH, DL): Data
 Usage général,
 Dans la multiplication et la division 16 bits, il sert comme extension au
registre AX pour contenir un nombre 32 bits,
 Ne peut pas servir pour l'adressage.
b) Registres de pointeurs et d’index :
Ils sont au nombre de 4 de 16 bits chacun. Ils permettent l’adressage d’un
opérande à l’intérieur d’un segment de mémoire de 64 Ko.
SP : (Stack pointer) Pointeur de Pile

 Utilisé pour l'accès à la pile. Pointe sur la tête de la pile,


 Par défaut, son offset est relatif à SS.
BP : (Base pointer)Pointeur de Base

 Adressage comme registre de base, (Par défaut, son offset est relatif à
SS),
 Utilisé pour adresser les données sur la pile et pour usage général.
SI : (Source index) Registre d'index (source)

 Adressage comme registre d’index, (Par défaut, son offset est relatif à
DS),
34
Notes de Cours : Calculateurs & Interfaçage Chapitre03
 Certaines instruction de déplacement de donnés l'utilise comme index
de l'opérande source. L'opérande destination étant indexé par DI,
 Usage général.
DI : (Destination index) Registre d'index (destination)

 Adressage comme registre d’index, (par défaut, son offset est relatif à
DS),
 Certaines instruction de déplacement de donnés l'utilise comme index
de l'opérande destination, l'opérande destination étant indexé par SI.
c) Registres de commande (pointeur d’instruction IP et registre
d’état « flags »)
Deux registres sur 16 bits chacun :
Pointeur d’instructions IP :
Contient l’adresse de la prochaine instruction à exécuter.
Registre d’état (flags)
Composé de Neuf bits. Six résument les résultats des opérations
arithmétiques ou logiques et les trois restants participent au contrôle du
processeur.

CF : (Carry) indique le dépassement de capacité de 1 sur une opération 8


bits ou 16 bits. Ce flag peut être utilisé par des instructions de saut
conditionnel, des calculs arithmétique en chaîne ou dans des opération de
rotation.
PF : (Parité) indique que le nombre de 1 est un nombre pair. Ce flag est
utilisé avec certains sauts conditionnels.
AF : (retenue Arithmétique) indique une retenue sur les 4 bits (digit) de
poids faible. Par exemple quand la somme des 2 digits de poids faible
dépasse F (15)
ZF : (Zéro) Indique que le résultat d'une opération arithmétique ou logique
est nul. Il est utilisé dans plusieurs instructions de sauts conditionnels.
SF : (Signe) reproduit le bit de poids fort d'une quantité signée sur 8 bits
ou sur 16 bits. L'arithmétique signée fonctionne en complément à 2. S=0 :
positif, S=1 : négatif. Ce flag sert lors de sauts conditionnels.
OF : (Overflow) indique un dépassement de capacité quand on travaille
avec des nombres signés. Comme par exemple si la somme de 2 nombres
positifs donne un nombre négatif ou inversement. (40h + 40h = 80h et
O=1)
35
Notes de Cours : Calculateurs & Interfaçage Chapitre03
TF : (Trap) met le CPU en mode pas à pas pour faciliter la recherche des
défauts d'exécution.
IF : (Interruption) autorise ou non la reconnaissance des interruptions
I = 0  Interruptions autorisées,
I = 1  Interruptions non autorisées.
DF : (Direction) fixe la direction de l'auto-inc/décrémentation de SI et DI
lors des instructions de manipulation de chaînes.
D = 0  Incrémentation des index,
D = 1  décrémentation des index.

d) Registres de segments :
Ces registrent sont combiné avec les registres d’offset pour former les
adresses. Une case mémoire est repérée par une adresse de la forme RS:RO.
On place le registre segment au début d’une zone mémoire de de 64Ko,
ensuite on fait varier le registre d’offset qui précise l’adresse relative par
rapport à cette position.
CS : Code Segment
Définit le début de la mémoire programme. Les adresses des différentes
instructions du programme sont relatives à CS.
DS : Data Segment
Début de la mémoire de données dans laquelle sont stockées toutes les
données traitées par le programme.
SS : Stack Segment
Début de la pile.
La pile est une zone mémoire gérée d’une façon particulière. Elle est organisée
comme une pile d’assiettes. On pose et on retire les assiettes toujours sur le
haut de la pile. Un seul registre d’adresse suffit donc pour la gérer, c’est le
stack pointer SP. On dit que c’est une pile LIFO (Last IN, First Out).
 Empiler une donnée : sauvegarder une donnée sur (le sommet) de la
pile.
 Dépiler une donnée : retirer une donnée (du sommet) de la pile.
ES : Extra Segment
Début d'un segment auxiliaire pour données.

V. Gestion de la mémoire par le 8086:


Le 8086 possède 20 bits d'adresse, il peut donc adresser 220 octets soit 1 Mo.

36
Notes de Cours : Calculateurs & Interfaçage Chapitre03
L'adresse de la première case mémoire est 00000H et la dernière est de
FFFFFH. Le problème qui se pose est La solution adoptée par Intel a été la
suivante :
 Puisque avec 16 bits en peut adresser 216 octets = 65535 octets = 64
ko, La mémoire totale adressable de 1 Mo est fractionnée en plages de
64 ko appelés segments.
 On utilise alors deux registres pour adresser une case mémoire:
o Un registre pour adresser le segment qu'on appelle registre
segment,
o Un autre registre pour adresser à l'intérieur du segment qu'on
désignera par registre d'adressage ou offset.
 Une adresse se présente toujours sous la forme segment:offset appelée
adresse logique.
 Exemple : procédons au découpage de la mémoire en 16 segments qui
ne se chevauche pas :

Segment Adresse début Adresse fin Pointeur segment


Segment 0 00000 0FFFF 00000

Segment 1 10000 1FFFF 10000

Segment 2 20000 1FFFF 10000

Segment 3 30000 1FFFF 10000

… …. …. ….

Segment 15 F0000 FFFFF F0000

Cette méthode de gestion de la mémoire est appelée segmentation de la


mémoire.

Fig. 3.12. Segmentation de la mémoire

37
Notes de Cours : Calculateurs & Interfaçage Chapitre03
L’adresse d’une case mémoire donnée sous la forme d’une quantité sur 20
bits (5 digits hexa) est appelée adresse physique car elle correspond à la
valeur envoyée réellement sur le bus d’adresses A0 - A19.
La figure 13 nous donne une correspondance entre l’adresse logique et
l’adresse physique.
Ainsi, l’adresse physique se calcule par l’expression :

adresse physique = 16 × segment + offset

Fig. 3.13. Calcul d’une adresse physique dans le 8086

car le fait d’injecter 4 zéros en poids faible du segment revient à effectuer un


décalage de 4 positions vers la gauche, c.-à-d. une multiplication par 24 = 16.
Exemple : Soit l’adresse logique d’une case mémoire donnée par : 2000 : 350.
Son adresse physique est :

Segment
2 0 0 0

3 5 0 Offset

2 0 3 5 0 Adresse physique

Fig. 3.14. Exemple de calcul d’une adresse physique

A un instant donné, le 8086 a accès à 4 segments dont les adresses se


trouvent dans les registres de segment CS, DS, SS et ES. Le segment de code
contient les instructions du programme, le segment de données contient les
données manipulées par le programme, le segment de pile contient la pile de
sauvegarde et le segment supplémentaire peut aussi contenir des données.

38
Notes de Cours : Calculateurs & Interfaçage Chapitre03

Fig. 3.14. Vue de la mémoire et le pointeur d’instruction IP

Le registre CS est associé au pointeur d’instruction IP, ainsi la prochaine


instruction à exécuter se trouve à l’adresse logique CS : IP.
De même, les registres de segments DS et ES peuvent être associés à un
registre d’index. Exemple : DS : SI, ES : DI. Le registre de segment de pile
peut être associé aux registres de pointeurs : SS : SP ou SS : BP.
Mémoire accessible par le 8086 à un instant donné :

Fig. 3.15. Vue des segments de la mémoire

Les zones réservées aux segments ne sont pas exclusives, elles peuvent se
chevaucher. La seule règle à respecter lors du choix d'un segment est que le
39
Notes de Cours : Calculateurs & Interfaçage Chapitre03
digit de plus faible poids soit nul. Nous pouvons donc commencer un segment
tous les 16 octets.
Après un RESET du microprocesseur les segments prennent les valeurs
suivantes :
IP = 0000H, CS = FFFFH, DS = 0000H, ES = 0000H, SS = 0000H

Fig. 3.16. segmentation de la mémoire avec chevauchement

Puisque CS contient la valeur FFFFH et IP la valeur 0000H, la première


instruction exécutée par le 8086 se trouve donc à l’adresse logique
FFFFH:0000H, correspondant à l’adresse physique FFFF0H (bootstrap). Cette
instruction est généralement un saut vers le programme principal qui
initialise ensuite les autres registres de segment.

VI. Le microprocesseur INTEL 8088 :


Le microprocesseur 8088 est identique au 8086 sauf que son bus de données
externe est sur 8 bits au lieu de 16 bits, le bus de données interne restant sur
16 bits.
Le 8088 a été produit par Intel après le 8086 pour assurer la compatibilité
avec des circuits périphériques déjà existant, fabriqués pour les
microprocesseurs 8 bits 8080 et 8085.
Différences avec le 8086 :
 Les broches AD8 à AD15 deviennent A8 à A15 (bus de données sur 8
bits),
 La broche BHE n’existe pas dans le 8088 car il n’y a pas d’octet de
poids fort sur le bus de données,
 La broche M/IO devient IO/M pour la compatibilité avec d’anciens
circuits d’E/S.
Au niveau de l’architecture interne, pas de différences avec le 8086 sauf que
la file d’attente des instructions passe de 6 à 4 octets.

40
Notes de Cours : Calculateurs & Interfaçage Chapitre04

41
Notes de Cours : Calculateurs & Interfaçage Chapitre04

Chapitre 04 : L’assembleur du microprocesseur


INTEL 8086
I. Généralités :
Chaque microprocesseur reconnait un ensemble d’instructions appelé jeu
d’instructions (Instruction Set) fixé par le constructeur. Pour les
microprocesseurs classiques, le nombre d’instructions reconnues varie entre
75 et 150 (microprocesseurs CISC : Complex Instruction Set Computer). Il
existe aussi des microprocesseurs dont le nombre d’instructions est très
réduit (microprocesseurs RISC : Reduced Instruction Set Computer) : entre
10 et 30 instructions, permettant d’améliorer le temps d’exécution des
programmes.
Une instruction est définie par son code opératoire, valeur numérique binaire
difficile à manipuler par l’être humain. On utilise donc une notation
symbolique pour représenter les instructions : les mnémoniques. Un
programme constitué de mnémoniques est appelé programme en assembleur.

II. Les modes d’adressage :


Définissons d’abord les abréviations suivantes qu’on utilisera pour la suite:
INST : instruction, Off : Offset de l’adresse
R : Registre quelconque, Im : donnée (constante)
Rseg : Registre Segment Dep : déplacement (constante)
Roff : Registre d’offset Op : Opérande
Adr : Adresse Os : Opérande source
[ adr] : contenu Mémoire Od : opérande destination

La structure la plus générale d’une instruction est la suivante :


INST Opérande1, Opérande2
L’opération est réalisée entre les 2 opérandes et le résultat est toujours
récupéré dans l’opérande « 1 » (celle de gauche).
Il y a aussi des instructions qui agissent sur un seul opérande.
Les opérandes peuvent être des registres, des constantes ou le contenu de
cases mémoire, on appelle ça le mode d’adressage.

a) Adressage registre (R):


L'opération se fait sur un ou 2 registres
INST R , R INST R

Exemples :
INC AX : incrémente le registre AX.

42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
MOV AX, BX : charge le contenu du registre BX dans le registre AX.

b) Adressage immédiat (IM):


Un des opérandes est une constante (valeur) :
INST R , im INST taille [adr] , im

Exemples :
MOV AX, 243 : charge le registre AX par le nombre décimal 243 ;
ADD AX, 243h : additionne le registre AX avec le nombre hexadécimal 243 ;
MOV AX, 0xA243 : Quand le chiffre de gauche du nombre hexadécimal est
une lettre, on utilise le préfix 0x pour l'hexadécimal ;
MOV AL, 'a' : Charge le registre AL par le code ASCII du caractère 'a' ;
MOV AX, 'a' : Charge le registre AH par 00 et le registre AL par le code ASCII
du caractère 'a' ;
MOV AX,'ab' : Charge AH par le code ASCII du caractère 'a' et AL par le code
ASCII du caractère 'b'.

c) Adressage direct (DA) :


Un des deux opérandes se trouve en mémoire. L’adresse de la case mémoire
ou plus précisément son Offset est précisé directement dans l’instruction.
L’adresse Rseg:Off doit être placée entre [ ], si le segment n’est pas précisé,
DS est pris par défaut,
INST R , [adr] INST taille [adr] , im
INST [adr] , R

Exemples :
MOV BL,[1200 H] : Copie l’octet contenu dans la case mémoire se trouvant
dans le Data Segment d’offset 1200H dans le registre BL,

Fig. 4.1. Exemple d’adressage direct


MOV[ES :1200 H],BL : Copie l’octet contenu dans le registre BL dans la case
mémoire se trouvant dans le Extra Segment d’offset 1200H,

42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
MOV [243],AX : Copie le contenu de AX dans la mémoire d'adresse DS:243,

d) Adressage indirect (IR) :


Un des deux opérandes se trouve en mémoire. L’offset de l’adresse n’est pas
précisé directement dans l'instruction, il se trouve dans l’un des 4 registres
d’offset BX, BP, SI ou DI et c’est le registre qui sera précisé dans l’instruction
: [Rseg : Roff]. Si Rseg n'est pas spécifié, le segment par défaut sera utilisé.
INST R , [Rseg : Roff] INST taille [Rseg : Roff] , im
INST [Rseg : Roff] , R

Exemples:
MOV AX, [BX] ; Charge AX par le contenu de la mémoire d'adresse DS:BX
MOV AX, [BP] ; Charge AX par le contenu de la mémoire d'adresse SS:BP
MOV AX, [SI] ; Charge AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [DI] ; Charge AX par le contenu de la mémoire d'adresse DS:DI
MOV AX, [ES:BP] ; Charge AX par le contenu de la mémoire d'adresse ES:BP

L’adressage indirect est divisé en 3 catégories selon le registre d’offset utilisé.


On distingue ainsi, l’adressage Basé, l’adressage indexé et l’adressage basé
indexé,

i. Adressage basé (BA) :


L’offset se trouve dans l’un des deux registres de base BX ou BP. On
peut préciser un déplacement qui sera ajouté au contenu de Roff pour
déterminer l’offset,
INST R , [Rseg : Rb+dep] INST taille [Rseg : Rb+dep] , im
INST [Rseg : Rb+dep] , R

Exemples :
MOV AL, [BX] : Charge AL par le contenu de la mémoire DS:BX,
MOV AL, [BP] : Charge AL par le contenu de la mémoire SS:BX,

Fig. 4.2. Exemple d’adressage indirect


MOV AX, [BX+5] : Charge AX par le contenu de la mémoire DS:BX+5,
MOV AX, [ES:BP-200] : Charge AX par le contenu de la mémoire
d'adresse ES:BP-200.
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
ii. Adressage indexé (X) :
L’offset se trouve dans l’un des deux registres d’index SI ou DI. On peut
préciser un déplacement qui sera ajouté au contenu de Ri pour
déterminer l’offset,
INST R , [Rseg : Ri+dep] INST taille [Rseg : Ri+dep] , im
INST [Rseg : Ri+dep] , R

Exemples :
MOV AX, [SI] ; Charge AX par le contenu de la mémoire DS:SI,
MOV AX, [SI+500] ; Charge AX par la mémoire d'adresse DS:SI+500,
MOV AX, [DI-8] ; Charge AX par la mémoire d'adresse DS:DI-8,
MOV AX, [ES:SI+4] ; Charge AX par la mémoire d'adresse ES:SI+4.

iii. Adressage basé indexé (BXI) :


L'offset de l’adresse de l'opérande est la somme d'un registre de base,
d'un registre d'index et d'un déplacement optionnel.
Si Rseg n'est pas spécifié, le segment par défaut du registre de base est
utilisé :
INST R , [Rseg : Rb+Ri+dep] INST taille [Rseg:Rb+Ri+dep], im
INST [Rseg : Rb+Ri+dep] , R

Exemples :
MOV AX,[BX+SI] ; AX est chargé par la mémoire d'adresse DS:BX+SI,
MOV AX,[BX+DI+5] ; AX est chargé par la mémoire d'adresse
DS:BX+DI+5,
MOV AX,[BP+SI-8] ; AX est chargé par la mémoire d'adresse SS:BP+SI-8
MOV AX,[BP+DI] ; AX est chargé par la mémoire d'adresse SS:BP+DI.

III. Les tailles des échanges :


La mémoire est organisée en octets. Quand on fait une instruction entre un
registre et une donnée qui se trouve en mémoire, c’est le registre qui
détermine la taille de l’opération.
Si le registre est un registre simple (8 bits), l’opération se fera avec une seule
case mémoire.

MOV [adresse], AL adresse AL

42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Si le registre est un registre double (2 octets), l’opération se fera avec deux
cases mémoires

AL
MOV [adresse], AX adresse
AH

Remarquer que c'est la partie basse du registre qui est traitée en


premier, et ceci dans les deux sens
Quand on fait une opération entre une constante et une case mémoire, il y a
ambiguïté, le processeur ne sait pas s’il faut considérer la constante sur 8
bits ou sur 16 bits. Il faut utiliser les préfixes BYTE et WORD pour préciser le
nombre d’octets á écrire :

MOV BYTE [adresse], 4A H adresse 4A

MOV WORD [adresse], 4A H adresse 4A


4A  adresse 00
00  adresse +1

IV. Les instructions du 8086 :


Les instructions peuvent être classées en groupes :
Instructions de transfert de données ;
Instructions arithmétiques ;
Instructions logiques ;
Instructions de branchement ...

a) Les instructions de transfert :


Elles permettent de déplacer des données d’une source vers une destination :
 Registre vers mémoire;
 Registre vers registre;
 Mémoire vers registre.
Remarque : le microprocesseur 8086 n’autorise pas les transferts de mémoire
vers mémoire (pour ce faire, il faut passer par un registre intermédiaire).

42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
L es syn ta xes :

MOV destination, source


Il existe différentes façons de spécifier l’adresse d’une case mémoire dans une
instruction : par les différents modes d’adressage vu dans le paragraphe
précédent.
 MOV R1 , R2 : copie le contenu d’un registre dans un autre,
 MOV R , M : copie le contenu d’une case mémoire dans un registre,
 MOV M , R : copie le contenu d’un registre dans une case mémoire,
 MOV R , im : copie une constante dans un registre,
 MOV taille M , im : copie une constante dans une case mémoire.

PUSH Op
Cette instruction agit comme suit :
 PUSH R16
 PUSH word [adr]
 Empiler l’opérande Op
 Décrémente SP de 2.
 Copie Op dans la mémoire pontée par SP.
 L’opérande doit être sur 16 bits

POP Op
Cette instruction effectue l’opération inverse de l’instruction POP :
 Dépiler dans l’opérande Op,
 Copie les deux cases mémoire pointée par SP dans l'opérande Op,
 Incrémente SP de 2
 POP R16
 POP word M
 Tout comme l’instruction précédente l’opérande de l’instruction POP
doit être sur 16 bits.

Fig. 4.3. Fonctionnement d’une pile


a) Situation de la pile après empilement des registres AX, BX et CX ;
b) Situation de la pile après empilement du registre DX ;
43
Notes de Cours : Calculateurs & Interfaçage Chapitre04
c) Situation de la pile après un dépilement. On remarquera que DX reste
dans la mémoire mais s'il ne fait plus partie de la pile. La pile s'arrête à
son sommet qui est pointé par le pointeur de pile ;
d) Situation de la pile après empilement du registre BP. On remarque que
la valeur BP écrase la valeur DX dans la mémoire.

PUSHA
Empile tous les registres généraux et d’adressage dans l'ordre suivant :
AX, CX, DX, BX, SP, BP, SI, DI

POPA
Dépile tous les registres généraux et d’adressage dans l'ordre inverse de
PUSHA afin que chaque registre retrouve sa valeur. La valeur dépilée de SP
est ignorée.
Remarque : Les deux instructions PUSHA et POPA ne sont pas reconnues par
le 8086. Elles ont été introduites à partir du 80186. Nous avons jugé bon de
les introduire dans ce cours car elles sont très utiles et comme nous
travaillons sur des Pentium, on peut les utiliser sans problème.

XCHG OD , OS
Echange l'opérande Source avec l'opérande Destination. Impossible sur
segment.
XCHG R1 , R2
XCHG [adr] , R
XCHG R , [adr]
L’instruction XCHG ne permet pas l’échange des contenues de deux cases
mémoires.

b) Les instructions arithmétiques :


Le 8086 permet d'effectuer les Quatre opérations arithmétiques de base,
l'addition, la soustraction, la multiplication et la division.
Les opérations peuvent s'effectuer sur des nombres de 8 bits ou de 16 bits
signés ou non signés. Les nombres signés sont représentés en complément à
2. Des instructions d'ajustement décimal permette de faire des calculs en
décimal (BCD).

i. Addition :
ADD Od , Os
L’opération effectuée est : Od  Od + Os.
Exemples :
ADD ah, [1100H] : ajoute le contenu de la case mémoire d’offset 1100H à
l’accumulateur AH (adressage direct) ;

44
Notes de Cours : Calculateurs & Interfaçage Chapitre04
ADD ah, [bx]: ajoute le contenu de la case mémoire pointée par BX à
l’accumulateur AH (adressage basé) ;
ADD byte ptr [1200H], 05H: ajoute la valeur 05H au contenu de la case
mémoire d’offset 1200H (adressage immédiat).

ADC Od , Os
Additionne l'opérande source, l'opérande destination et le curry avec résultat
dans l'opérande destination : Od  Od + Os+ C.

INC Op
Incrémente l’opérande Op : Op  Op + 1.
Attention, l’indicateur « C » n’est pas positionné quand il y a débordement,
C'est l’indicateur « Z » qui permet de détecter le débordement.
Pour incrémenter une case mémoire, il faut préciser la taille :
INC byte [ ] ou INC word [ ]
A p p lic a t io n :
En partant à chaque fois de la situation illustrée par la
figure. Quelle est la situation après chacune des instructions
suivantes :
INC byte ptr [4000h]
INC word ptr [4000h]

En partant à chaque fois de la situation illustrée par la


figure.Quelle est la situation après chacune des
instructions suivantes :
INC byte ptr [4000h]
INC word ptr [4000h]

ii. Soustraction :
SUB Od, Os
Soustrait l'opérande source et l'opérande destination avec le résultat dans
l'opérande destination : Od  Od - Ds.

SBB Od, Os
Soustrait l'opérande source et la retenue de l'opérande destination avec le
résultat dans l'opérande destination : Od  Od – Ds - C.

DEC Op
Décrémente l’opérande Op : Op  Op - 1.

NEG Op
Donne le complément à 2 de l'opérande Op
45
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Remplace Op par son négatif : Op  Cà2(Op).

CMP Od, Os
Compare (soustrait) les opérandes Os et Od et positionne les drapeaux en
fonction du résultat. L’opérande Od n’est pas modifié. Elle effectue une
soustraction sur le même principe que la ferait SUB, mais elle ne stocke pas
le résultat. Les drapeaux peuvent ensuite être testés pour effectuer par
exemple des branchements conditionnels.

iii. Multiplication :
MUL Op
C’est une instruction à un seul opérande. Elle effectue une multiplication non
signée entre l'accumulateur (AL ou AX) et l'opérande Op. Le résultat de taille
double est stocké dans l'accumulateur et son extension (AH:AL ou DX:AX).
MUL Op8 : opération effectuée AX  AL x Op8.
MUL Op16 : opération effectuée DX:AX  AX x Op16.
L'opérande Op ne peut pas être une donnée, c’est soit un registre soit une
position mémoire, dans ce dernier cas, il faut préciser la taille (byte ou word).
La partie haute du produit est AH pour la multiplication 8 bits et DX pour la
multiplication 16 bits.
Les drapeaux C et O sont positionnés si la partie haute du résultat est non
nulle. La partie haute est AH pour la multiplication 8 bits et DX pour la
multiplication 16 bits.
Exemple :
MOV AL,52 MOV AX,4352
MOV BL,31 MOV BX,1631
MUL BL ; AX  52 x 31 MUL BX ; DX:AX  1631 x 4352

MOV AL,52 MOV AX,4352


MOV byte ptr [1200h],31 MOV word ptr [1200h],1631
MUL byte ptr [1200h] ; AX  52 x 31 MUL word ptr [1200h];
DX:AX  1631 x 4352

Application
Tracer le programme ci-dessous en indiquant à chaque fois la valeur des
indicateurs C et O :
MOV AL,64h
MOV BL,2
MOV BL
MOV AL,64h
MOV CL,3
MOV CL

46
Notes de Cours : Calculateurs & Interfaçage Chapitre04
A éviter :
MUL im MUL AX,R MUL AX, im
IMUL Op (Integer Multiply )
Identique à MUL excepté qu'une multiplication signée est effectuée.
iv. Division :
DIV Op
Effectue la division AX/Op8 ou (DX|AX)/Op16 selon la taille de Op qui doit
être soit un registre soit une mémoire. Dans le dernier cas il faut préciser la
taille de l’opérande.
Résultat : si l’opérande est sur 1 octet, alors AL = quotient et AH = reste ; si
l’opérande est sur 2 octets, alors AX = quotient et DX = reste.
Exemple :
MOV AX,35 MOV DX, 0
MOV BL,10 MOV AX, 1234
DIV BL : AL  3 AH  5 MOV BX, 10
DIV BX : AX  123 DX  4
A éviter :
DIV im DIV AX,R DIV AX, im

IDIV Op (Integer Division)


Identique à DIV excepté qu'une multiplication signée est effectuée.

Parmi les autres instructions on trouve aussi les instructions de conversion :


CBW (Convert Byte to Word)
Effectue une extension de AL dans AH. On écrit le contenu de AL dans AX en
respectant le signe :
Si AL contient un nombre positif, On complète par des 0 pour obtenir la
représentation sur 16 bits : +5 = 0000 0101  0000 0000 0000 0101.
Si AL contient un nombre négatif, On complète par des 1 pour obtenir
la représentation sur 16 bits : -5 = 1111 1011  1111 1111 1111 1011.
CWD (Convert Word to Double-Word)
Effectue une extension de AX dans DX en respectant le signe. On écrit AX
dans le registre 32 bits obtenu en collant DX et AX :
DX AX

c) Les instructions logiques :


Ce sont des instructions qui permettent de manipuler des données au niveau
des bits. Les opérations logiques de base sont :
NON ;
ET ;
OU ;
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
OU exclusif ;
Complément à 1 ;
Complément à 2 ;
Décalages et rotations.
NOT op
Complément à 1 de l'opérande Op : Op  Op
NEG op
Complément à 2 de l'opérande Op : Op  Op + 1
AND Od , Os
ET logique Od  Od ET Os
OR Od , Os
OU logique Od  Od OU Os
XOR Od , Os
OU exclusif logique Od  Od XOR Os
Exemples :
MOV AL, 10010110B AL = 1 0 0 1 0 1 1 0
MOV AL, 11001101B AB = 1 1 0 0 1 1 0 1
AND AL, BL AL = 1 0 0 0 0 1 0 0

MOV AL, 10010110B AL = 1 0 0 1 0 1 1 0


MOV AL, 11001101B AB = 1 1 0 0 1 1 0 1
XOR AL, BL AL = 0 1 0 1 1 0 1 1
TEST Od , Os
Similaire à AND mais ne retourne pas de résultat dans Od, seuls les
indicateurs sont positionnés.
Application :
Faire un programme qui fait AX  BX sans utiliser la fonction XOR du 8086.

Les masques :
Le 8086 ne possède pas d'instructions permettant d'agir sur un seul bit. Les
masques logiques sont des astuces qui permettent d'utiliser les instructions
logiques vues ci-dessus pour agir sur un bit spécifique d'un octet out d'un
WORD.
a- Forcer un bit à 0 :
Pour forcer un bit à 0 sans modifier les autres bits, on utilise l'opérateur
logique AND et ces propriétés :
X AND 0 = 0 (0 = élément absorbant de AND)
X AND 1 = X (1 = élément neutre de AND)
On fait un AND avec une valeur contenant des 0 en face des bits qu'il faut
forcer à 0 et des 1 en face des bits qu'il ne faut pas changer.

42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
XXXXXXXX
AND 1 1 1 0 1 1 0 1
XXX0XX0X
b- Forcer un bit à 1 :
Pour forcer un bit à 1 sans modifier les autres bits, on utilise l'opérateur
logique OR et ces propriétés :
X OR 1 = 1 (1 = élément absorbant de OR)
X OR 0 = X (0 = élément neutre de OR)
On fait un OR avec une valeur contenant des 1 en face des bits qu'il faut
forcer à 1 et des 0 en face des bits qu'il ne faut pas changer.
XXXXXXXX
OR 0 0 1 0 0 0 0 0
XX1XXXXX
c- Inverser un bit :
Pour inverser la valeur d'un bit sans modifier les autres bits, on utilise
l'opérateur logique XOR et ces propriétés :
X XOR 1 = X
X XOR 0 = X (0 = élément neutre de XOR)
Donc, on fait un XOR avec une valeur contenant des 1 en face des bits
qu'il faut inverser et des 0 en face des bits qu'il ne faut pas changer.
XXXXXXXX
OR 0 0 1 0 0 0 0 0
XXXXXXXX

Instructions de décalages et de rotations : ces instructions déplacent d’un


certain nombre de positions les bits d’un mot vers la gauche ou vers la droite.
Dans les décalages, les bits qui sont déplacés sont remplacés par des zéros. Il
y a les décalages logiques (opérations non signées) et les décalages
arithmétiques (opérations signées).
Dans les rotations, les bits déplacés dans un sens sont réinjectés de l’autre
côté du mot.
SHR Op, n : Décalage logique vers la droite (Shift Right)
Cette instruction décale l’opérande de n positions vers la droite. Si le nombre
de bits à décaler est supérieur à 1, ce nombre doit être placé dans le registre
CL ou CX.
E x e m p le s :
MOV AL, 10010110B
MOV CL, 3
SHR AL, 1
SHR AL, CL
SHL Op, n : Décalage logique vers la gauche (Shift Left)
Identique à la précédente, cette instruction décale l’opérande de n positions
vers la gauche.
43
Notes de Cours : Calculateurs & Interfaçage Chapitre04
E x e m p le s :
MOV AL, 10010110B
MOV CL, 3
SHL AL, 1
SHL AL, CL
SAR Op, n : Décalage arithmétique vers la droite (Shift Right)
Ce décalage conserve le bit de signe bien que celui-ci décalé.
E x e m p le s :
MOV AL, 11001011B
SAR AL, 1

L e b it d e s ig n e e s t c o n s e r v é
SAL Op, n : Décalage arithmétique vers la gauche (Shift Left)
Identique au décalage logique vers la gauche, car il n’y a pas de signe à
préserver.
E x e m p le s :
MOV AL, 11001011B
MOV CL, 5
SAL AL, CL : AL  01100000 B
ROR Op, n : Rotation vers la droite (Rotate Right)
Cette instruction décale l’opérande de n positions vers la droite et réinjecte
par la gauche les bits sortant.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
ROR AL, 1
ROR AL, CL
R é in je c t io n d u b it s o r t a n t q u i e s t c o p ié d a n s l’in d ic a t e u r d e r e t e n u e C F .
ROL Op, n : Rotation vers la gauche (Rotate Left)
Cette instruction décale l’opérande de n positions vers la droite et réinjecte
par la droite les bits sortant.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
ROL AL, 1
ROL AL, CL
R é in je c t io n d u b it s o r t a n t q u i e s t c o p ié d a n s l’in d ic a t e u r d e r e t e n u e C F .

44
Notes de Cours : Calculateurs & Interfaçage Chapitre04
RCR Op, n : Rotation vers la droite avec passage par le « CF » (Rotate Right
through carry)
Cette instruction décale l’opérande de n positions vers la droite en passant
par l’indicateur de retenue CF.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
RCR AL, 1
RCR AL, CL
Le bit sortant par la droite est copié dans l’indicateur de retenue « CF » et la
valeur précédente de CF est réinjectée par la gauche.
RCL Op, n : Rotation vers la gauche avec passage par le « CF » (Rotate Left
through carry)
Cette instruction décale l’opérande de n positions vers la gauche en passant
par l’indicateur de retenue CF.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
RCL AL, 1
RCL AL, CL
Le bit sortant par la gauche est copié dans l’indicateur de retenue CF et la
valeur précédente de CF est réinjectée par la droite.

A p p lic a t io n (a ):

Ecrire le programme en assembleur qui permet de calculer le quotient et le


reste de la division de 111 par 8 sans faire de division.

I n s t r u c t io n s a g is s a n t s u r le s in d ic a t e u r :

CLC (CLear Carry) positionne le drapeau C à 0


STC (Set Carry) positionne le drapeau C à 1
CMC Complémente le drapeau C
CLD Positionne le Drapeau D à 0
STD Positionne le Drapeau D à
CLI Positionne le Drapeau I à 0
STI Positionne le Drapeau I à 1
LAHF :Copier l'octet bas du registre d'état dans AH
Après l'opération, on a :

45
Notes de Cours : Calculateurs & Interfaçage Chapitre04
SAHF Opération inverse de LAHF : Transfert AH dans l'octet bas du registre
d'état.
PUSHF : Empile le registre d'état,
POPF Dépile le registre d'état,
A p p lic a t io n (b ):
1- Ecrire un programme qui positionne l’indicateur P à 0 sans modifier les
autres indicateurs.
2- Ecrire un programme qui positionne l’indicateur O à 1 sans modifier les
autres indicateurs.
d) Les instructions de contrôle de boucle :
LOOP XYZ : L'instruction LOOP fonctionne automatiquement avec le registre
CX (compteur).
Quant le processeur rencontre une instruction LOOP, il décrémente le
registre CX. Si le résultat n'est pas encore nul, il reboucle à la ligne portant
l'étiquette xyz, sinon il continue le programme à la ligne suivante :

Remarque sur l'étiquette :


L'étiquette est une chaîne quelconque qui permet de repérer une ligne. Le
caractère ':' à la fin de l'étiquette n'est obligatoire que si l'étiquette est seule
sur la ligne.
LOOPZ XYZ (Loop While Zero) Décrémente le registre CX (aucun flag n'est
positionné) on reboucle vers la ligne XYZ tant que CX est différent de zéro et
le flag Z est égal à 1. La condition supplémentaire sur Z, donne la possibilité
de quitter une boucle avant que CX ne soit égal à zéro.
LOOPNZ XYZ Décrémente le registre CX et reboucle vers la ligne XYZ tant
que CX est différent de zéro et le flag Z est égal à 0. Fonctionne de la même
façon que LOOPZ,
JCXZ XYZ branchement à la ligne XYZ si CX = 0 indépendamment de
l'indicateur Z
A p p lic a t io n s (c ):
1- Faire un programme qui ajoute la valeur 3 au contenu des 100 cases
mémoire du segment DATA dont l'adresse (offset) commence à 4000h.
2- Faire un programme qui multiplie par 3 les 100 words contenu dans le
segment DATA à partir de l'offset 4000h. On suppose que les résultats
tiennent dans 16 bits (< 65536).

46
Notes de Cours : Calculateurs & Interfaçage Chapitre04
e) Les instructions de branchement :
Les instructions de branchement (ou saut) permettent de modifier l’ordre
d’exécution des instructions du programme en fonction de certaines
conditions. Il existe 3 types de saut :
 Saut inconditionnel ;
 Sauts conditionnels ;
 Appel de sous-programmes.
i. Branchements inconditionnels :
JMP XYZ Provoque un saut sans condition à la ligne portant l'étiquette xyz.
CALL XYZ Appel d'une procédure (sous programme) qui commence à la ligne
XYZ. La position de l'instruction suivant le CALL est empilée pour assurer
une poursuite correcte après l'exécution du sous programme.
RET Retour de sous programme. L'exécution du programme continue à la
position récupérée dans la pile.
INT n appel à l’interruption logicielle n° n

ii. Branchements conditionnels :


Les branchements conditionnels sont conditionnés par l'état des indicateurs
(drapeaux) qui sont eux même positionnés par les instructions précédentes.
Dans la suite nous allons utiliser la terminologie :
 supérieur ou inférieur pour les nombres non signés ;
 plus petit ou plus grand pour les nombres signés ;
 + pour l'opérateur logique OU.
JE/JZ XYZ (Jump if Equal or Zero ) Aller à la ligne XYZ si résultat nul ou si
égalité. C'est-à-dire si Z=1
JNE/JNZ XYZ (Jump if Not Equal or Not Zero ) Aller à la ligne XYZ si résultat
non nul ou si différent. C'est-à-dire si Z=0
JA XYZ (Jump if Above ) aller à la ligne XYZ si supérieur (non signé). C'est-à-
dire si C + Z = 0
JAE XYZ (Jump if Above or Equal ) aller à la ligne XYZ si supérieur ou égal
(non signé). C'est-à-dire si C = 0

47
Notes de Cours : Calculateurs & Interfaçage Chapitre04
JB XYZ (Jump if Bellow) Branche si inférieur (non signé). C'est-à-dire si C = 1
JBE XYZ (Jump if Bellow or Equal ) aller à la ligne XYZ si inférieur ou égal
(non signé). C'est-à-dire si C + Z = 1
JC XYZ (Jump if CArry ) aller à la ligne XYZ s'il y a retenu. C'est-à-dire si C=1
JNC XYZ (Jump if No CArry) aller à la ligne XYZ s'il n'y a pas de retenu. C'est-
à-dire si C = 0
JG XYZ (Jump if Grater) aller à la ligne XYZ si plus grand (signé). C'est-à-dire
si (S  O) + Z = 1
JGE XYZ (Jump if Grater or Equal ) aller à la ligne XYZ si plus grand ou égal
(signé). C'est-à-dire si S  O = 0
JL XYZ (Jump if Less) aller à la ligne XYZ si plus petit (signé). C'est-à-dire si
SO=1
JLE XYZ (Jump if Less or Equal) aller à la ligne XYZ si plus petit ou égal
(signé). C'est-à-dire si (S  O) + Z = 1
JO XYZ (Jump if Overflow) aller à la ligne XYZ si dépassement. C'est-à-dire si
O=1
JNO XYZ (Jump if No Overflow) aller à la ligne XYZ s'il n'y a pas de
dépassement O = 0
JP/JPE XYZ (Jump if Parity or Parity Even) aller à la ligne XYZ si parité
paire. C'est-à-dire si P = 1
JNP/JPO XYZ (Jump if No Parity or if Parity Odd) aller à la ligne XYZ si parité
impaire. C'est-à-dire si P = 0
JS XYZ (Jump if Sign) aller à la ligne XYZ si signe négatif. C'est-à-dire si S = 1
JNS XYZ (Jump if No Sign) aller à la ligne XYZ si signe positif. C'est-à-dire si
S=0
Application (d):
1- Faire un programme qui réalise la suite d’instructions suivantes :
1. Mettre 1 dan AX
2. incrémenter AX
3. si AX < 200 recommencer au point 2
4. sinon copier AX dans BX

2- Faire un programme qui réalise la suite d’instructions suivantes :


1. copier le contenu de la case mémoire [1230h] dan CX
2. Comparer CX à 200
a. si < incrémenter CX et recommencer au point 2
b. si > décrémenter CX et recommencer au point 2
c. si = copier CX dans AX et continuer le programme

3- Faire un programme qui cherche la valeur 65 dans le RAM à partir de la


position 4000h. Une fois trouvée, placer son adresse dans le registre AX.

48
Notes de Cours : Calculateurs & Interfaçage Chapitre04
4- - Faire un programme qui multiplie par 3 les 100 octets contenus dans les
100 cases mémoires commençant à l'adresse 4000h. Ne pas utiliser
l'instruction LOOP.

V. Les directives du 8086 :


Pour programmer en assembleur, on doit utiliser, en plus des
instructions assembleur, des directives ou pseudo-instructions.
Une directive est une information que le programmeur fournit au
compilateur. Elle n'est pas transformée en une instruction en langage
machine. Elle n'ajoute donc aucun octet au programme compilé. Donc les
directives sont des déclarations qui vont guider l'assembleur.
Une directive est utilisée par exemple pour créer de l'espace mémoire pour
des variables, pour définir des constantes, etc...
Pour déclarer une directive il faut utiliser la syntaxe suivante :
{Nom} Directive {opérande} { ; commentaire}
Le champ opérande dépend de la directive
Le champ commentaire a les mêmes propriétés vues dans le
paragraphe précèdent.
Le champ Nom indique le nom des variables : c'est un champ
optionnel (selon la directive).
a) Les directives de données :
EQU :
Syntaxe : Nom EQU Expression
Exemples :
VAL EQU 50 ; assigne la valeur 50 au nom VAL
ET1 EQU VAL* 5 + 1 ; assigne une expression calculer a VAL
DB/DW/DD/DF/DP/DQ/DT:
Ces directives sont utilisées pour déclarer les variables : L'assembleur
attribue à chaque variable une adresse.
Dans le programme, on repère les variables grâce à leurs noms. Les noms des
variables sont composés d'une suite de 31 caractères au maximum,
commençant obligatoirement par une lettre. Le nom peut comporter des
majuscules, des minuscules, des chiffres, plus les caractères @, et _. Lors de
la déclaration d'une variable, on peut lui affecter une valeur initiale.
DB (Define byte): définit une variable de 8 bits : c.-à-d. elle réserve un espace
mémoire d'un octet : donc les valeurs qu'on peut stocker pour cette directive
sont comprises entre 0 et 255 (pour les nombres non signés) et de -128
jusqu'à 127 pour les nombres signés.
Syntaxe : Nom DB Expression
Exemple :
Vil DB 12H ; Définit une variable (un octet) de valeur Initiale 12.

49
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Tab DB 18H, 15H, 13H ; définit un tableau de 3 cases (3 octet) Qui démarre
à partir de l'adresse TAB.
Mess DB 'ISET' ; définit aussi un tableau mais les valeurs de chaque case
n'est autre que le code ascii de chaque lettre.
Name DB ? ; définit une variable 8 bits de valeur initiale quelconque.
DW ( define word) : définit une variable de 16 bits : c-à-d elle réserve un
espace mémoire d'un mot : donc les valeurs qu'on peut stocker pour cette
directive sont comprises entre 0 et 65535 ( pour les nombres non signés ) et
de -32768 jusqu'à 32767 pour les nombres signés .
Syntaxe : Nom DW Expression
Exemple :
TT DW 500H ; réserve deux cases mémoire (un mot) a partir de l'adresse TT.
TAB1 DW 10H,11H,14H ; réserve un tableau de 6 cases chaque valeur
sera mise sur deux cases
YY DW ? ; réserve un mot dans la mémoire de valeur initial quelconque.
DD : (Define Double) : réserve un espace mémoire de 32 bits (4 cases mémoire
ou 4 octets) :
Syntaxe : nom DD expression
Exemple :
MOT32 DD 15500000H
Directive DUP
Lorsque l'on veut déclarer un tableau de « n » cases, toutes initialisées à la
même valeur, on utilise la directive DUP:
TAB DB 100 DUP (15) ; 100 octets qui vallent 15
Y DW 10 DUP (?) ; 10 mots de 16 bits non initialisés
Les direcitive Word PTR et Byte PTR :
Dans certains cas, l'adressage indirect est ambigu. Par exemple, si l'on écrit :
MOV [BX], 0 ; range 0 a l'adresse spécifiée par BX
L'assembleur ne sait pas si l'instruction concerne 1, 2 ou 4 octets consécutifs.
Afin de lever l'ambiguïté, on doit utiliser une directive spécifiant la taille de la
donnée à transférer :
MOV byte ptr [BX], im ; concerne 1 octet
MOV word ptr [BX], im ; concerne 1 mot de 2 octets

b) Les directives de segments :


La directive SEGMENT contrôle la relation entre la génération du code objet
et la gestion des segments logiques ainsi générés.
L'instruction SEGMENT sert à :
 Contrôler le placement du code objet dans des segments
spécifiques.
50
Notes de Cours : Calculateurs & Interfaçage Chapitre04
 Associer les symboles représentant des adresses à un segment en
considérant leur valeur comme un déplacement par rapport au début
du segment.
 Spécifier des directives pour l'éditeur de lien (nom du segment, champs
d'opérande de l'instruction SEGMENT déterminant le traitement du
segment par l'éditeur de liens); ces informations sont passées telles
quelles.
Syntaxe :
Nom SEGMENT opérande

Nom ENDS
Le nom champ étiquette 'Nom' sert a :
- Indiquer le nom du segment.
- Etablir une relation évidente entre des paires d'instructions
Exemple :
Pile SEGMENT STACK ; On met les directives pour réserver de l'espace
;mémoire.

PILE ENDS

Data SEGMENT ; On met les directives de données pour réserver de la mémoire


; Pour les variables qui seront utilisées dans le programme.
Data ENDS

Extra SEGMENT ; On met les directives pour déclarer ;


;les variables (les chaînes de Caractères).
Extra ENDS

Code SEGMENT
ASSUME cs : code, ds, data, es : pile :ss :pile

MOV AX,Data
MOV DS,AX
MOV AX,Extra
MOV ES,AX
MOV AX,pile
MOV SS,AX ; mettre les instructions du programme

Code ENDS

51
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Annexe
A signifie Accumulateur qui peut être AL ou AX selon la taille de l’opération 8
bits ou 16 bits X est l’extension de l’accumulateur :
(8 bits: X =AHX:A = AH:AL = AX) (16 bits: X = DX X:A = DX:AX)

52
Notes de Cours : Calculateurs & Interfaçage Chapitre04

53
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Solutions des applications
Application (a):

Ecrire le programme en assembleur qui permet de calculer le quotient et le


reste de la division de 111 par 8 sans faire de division.
Solution :
MOV AL,111 ;Chargement du registre AL par la valeur « 111 »,
MOV BL,AL ; Faire une copie de cette même valeur dans BL,
MOV CL,3 ; Chargement du registre CL par « 3 » pour l’opération de décalage,
SAR AL,CL ; Décalage arithmétique de AL de 3 bits vers la droite (Quotient),
AND BL,00000111B ; AND logique avec un masque pour sauvegarder le Reste
Application (b):
1- Ecrire un programme qui positionne l’indicateur P à 0 sans modifier les
autres indicateurs :
LAHF ; Chargement de l’octet bas du registre d’état dans AH
AND AH,11111011B ; utilisation d’un masque pour forcer le bit PF à « 0 »,
SAHF ; Chargement de la nouvelle valeur dans le registre d’état,

2- Ecrire un programme qui positionne l’indicateur O à 1 sans modifier les


autres indicateurs.
PUSHF ; Empilement du registre d’état dans la pile,
POP DX ; Faire une copie dans DX,
OR DX,0000100000000000B ; Masque logique pour forcer le bit PF à « 1 » ,
PUSH DX ; Empilement de la nouvelle valeur du registre dans la pile,
POPF ; mise à jour du registre d’état par la nouvelle valeur.
Applications (c):
1- Faire un programme qui ajoute la valeur 3 au contenu des 100 cases
mémoire du segment DATA dont l'adresse (offset) commence à 4000h.
MOV CX,100 ;Chargement de CX par la valeur 100 (compteur)
MOV BP,4000h ;Chargement du pointeur BP par l’adresse du début de tableau
MOV BX,3 ;Chargement de BX par le nombre « 3 »
@Bcle: Add [BP],BX ;Début de la boucle & addition des cases du tableau
par la valeur « 3 »,
INC BP ; incrémentation du pointeur BP pour pointer la case suivante
Loop @Bcle ;fin de boucle et test du compteur CX (si CX=0 fin de boucle sinon
retourne au début de la boucle)

54
Notes de Cours : Calculateurs & Interfaçage Chapitre04
2- Faire un programme qui multiplie par 3 les 100 words contenu dans le
segment DATA à partir de l'offset 4000h. On suppose que les résultats
tiennent dans 16 bits (< 65536).
MOV CX,100 ; Chargement de CX par la valeur 100 (compteur)
MOV SI,4000H ; Chargement de l’index SI par le début du tableau
MOV BX,3 ;Chargement de BX par la valeur « 3 »
@bcle: MOV AX,[SI] ; Début de la boucle chargement de AX par la case pointée
par [SI],
MUL BX ; Multiplication de AX par « 3 »,
MOV [SI],AX ; chargement du produit contenu dans AX vers la case du
tableau pointée par SI,
INC SI ; Incrémentation de l’index SI,
INC SI ;Deuxième incrémentation de SI (car les valeurs sont sur
16 bits donc 2xfois 8 bits)
Loop @Bcle ; Fin de la boucle avec un test de CX (si CX=0 fin de
boucle sinon retourne au début de la boucle).
Application (d):
1- Faire un programme qui réalise la suite d’instructions suivantes :
1. Mettre 1 dan AX
2. incrémenter AX
3. si AX < 200 recommencer au point 2
4. sinon copier AX dans BX
MOV AX,1 ;Chargement de AX par la valeur « 1 »,
boucle: INC AX ; Début de la boucle et incrémentation de AX,
CMP AX,200 ; Comparaison de AX avec 200,
JNE boucle ; test et retour vers de le début de la boucle si AX200
sinon on continue le programme,
MOV BX,AX ; chargement de BX par la valeur contenue dans AX.

2- Faire un programme qui réalise la suite d’instructions suivantes :


1. copier le contenu de la case mémoire [1230h] dan CX
2. Comparer CX à 200
a. si < incrémenter CX et recommencer au point 2
b. si > décrémenter CX et recommencer au point 2
c. si = copier CX dans AX et continuer le programme
MOV CX,[1230H] ; Chargement de CX par le contenu de la case [1230H]
comparaison: CMP CX,200 ; Comparaison de CX avec 200
JB branchement1 ; saut vers branchements1 si CX<200
JG branchement2 ; saut vers branchements1 si CX>200
JE branchement3 ; saut vers branchements1 si CX=200
branchement1: INC CX ; Incrémentation de CX
JMP comparaison ; Retour vers l’étiquette comparaison
branchement2: DEC CX ; Décrémentation de CX
JMP comparaison ; Retour vers l’étiquette comparaison
branchement3: MOV AX,CX ; Sauvegarde de CX dans AX

55
Notes de Cours : Calculateurs & Interfaçage Chapitre04
3- Faire un programme qui cherche la valeur 65 dans le RAM à partir de la
position 4000h. Une fois trouvée, placer son adresse dans le registre AX.

MOV BX,4000H ; Chargement de BX par l’adresse du début du


tableau
comparaison: CMP [BX],65 ; étiquette comparaison et comparaison avec la
valeur 65
JE valeurtrouvee ; branchement vers l’étiquette valeurtrouvee si
la case contient 65 sinon on continue le programme
INC BX ; Incrémentation de BX
JMP comparaison; Retour vers l’étiquette comparaison
valeurtrouvee: MOV AX,BX ; étiquette valeurtrouvee et sauvegarde de son
adresse dans AX

4- Faire un programme qui multiplie par 3 les 100 octets contenus dans les
100 cases mémoires commençant à l'adresse 4000h. Ne pas utiliser
l'instruction LOOP. On suppose que le résultat sera 8 bits.
MOV BX,4000H ; Chargement du registre de base BX par le début du tableau
MOV DL,3 ; Chargement du registre DL par la valeur « 3 »
boucle: MOV AL,[BX] ; Chargement de AL par le contenu de la case mémoire
pointée par BX,
MUL DL ; AX AL x DL,
MOV [BX],AL ; chargement de la case mémoire par le contenue de AL
(mise à jour de la case mémoire par la nouvelle valeur après multiplication),
INC BX ; Incrémentation de BX pour pointer la case suivante,
CMP BX, 4000h+100 ; comparaison du registre de base avec la valeur de
la dernière case mémoire à traiter,
JB boucle ; test si BX<4100 branchement vers l’étiquette boucle sinon
arrêt du programme.

56

Vous aimerez peut-être aussi