horloge registres
L’élément de base d’un calculateur est constitué par l’unité centrale de traitement
(UCT, CPU : Central Processing Unit). L’UCT est constituée :
• d’une unité arithmétique et logique (UAL, ALU : Arithmetic and Logic Unit) :
c’est l’organe de calcul du calculateur ;
• de registres : zones de stockage des données de travail de l’UAL (opérandes,
résultats intermédiaires) ;
• d’une unité de contrôle (UC, CU : Control Unit) : elle envoie les ordres (ou com-
mandes) à tous les autres éléments du calculateur afin d’exécuter un programme.
La mémoire centrale contient :
• le programme à exécuter : suite d’instructions élémentaires ;
• les données à traiter.
L’unité d’entrées/sorties (E/S) est un intermédiaire entre le calculateur et le monde
extérieur.
L’unité de transfert est le support matériel de la circulation des données.
Les échanges d’ordres et de données dans le calculateur sont synchronisés par une horloge
qui délivre des impulsions (signal d’horloge) à des intervalles de temps fixes.
Définition : un microprocesseur consiste en une unité centrale de traitement (UAL +
registres + unité de contrôle) entièrement contenue dans un seul circuit intégré. Un cal-
culateur construit autour d’un microprocesseur est un microcalculateur ou un micro-
ordinateur.
Remarque : un circuit intégré qui inclut une UCT, de la mémoire et des périphériques
est un microcontrôleur.
La mémoire peut être vue comme un ensemble de cellules ou cases contenant chacune
une information : une instruction ou une donnée. Chaque case mémoire est repérée par
un numéro d’ordre unique : son adresse.
Représentation :
adresse des cases
mémoire
(généralement
notée en
hexadécimal)
12H 0003H
3EH 0000H
Une case mémoire peut être lue ou écrite par le microprocesseur (cas des mémoires
vives) ou bien seulement lue (cas des mémoires mortes).
2.3 Circulation de l’information dans un calculateur
La réalisation matérielle des ordinateurs est généralement basée sur l’architecture de Von
Neumann :
périphériques
microprocesseur mémoire E/S
BUS
Le microprocesseur échange des informations avec la mémoire et l’unité d’E/S, sous forme
de mots binaires, au moyen d’un ensemble de connexions appelé bus. Un bus permet
de transférer des données sous forme parallèlle, c’est-à-dire en faisant circuler n bits
simultanément.
Les microprocesseurs peuvent être classés selon la longueur maximale des mots binaires
qu’ils peuvent échanger avec la mémoire et les E/S : microprocesseurs 8 bits, 16 bits,
32 bits, ...
Le bus peut être décomposé en trois bus distincts :
bus de commande
alimentation
horloge n bits
bus d'adresses
reset
p bits
microprocesseur bus de données
signaux de
commande du
microprocesseur bus de commande
Exemple :
ADDITIONNER
case
mémoire 1, case mémoire 2
opération opérandes
Rangement en mémoire :
opérande p
instruction n
opérande 2 0002H
opérande 1 0001H
code opératoire
de l'addition 3EH 0000H
Pour exécuter les instructions dans l’ordre établi par le programme, le microprocesseur
doit savoir à chaque instant l’adresse de la prochaine instruction à exécuter. Le micropro-
cesseur utilise un registre contenant cette information. Ce registre est appelé pointeur
d’instruction (IP : Instruction Pointer) ou compteur d’instructions ou compteur
ordinal.
Exemple :
pointeur
opérande p
d'instruction
3A2BH instruction n 3A2BH
adresse de la
prochaine
instruction à
exécuter opérande 2 0002H
opérande 1 0001H
instruction 1 0000H
S Z AC P/O N C
soustraction
signe zéro retenue parité/ retenue
auxiliaire dépassement (carry)
Les indicateurs d’état sont activés lorsqu’une certaine condition est remplie, exemple : le
flag Z est mis à 1 lorsque la dernière opération a donné un résultat nul, le flag C est mis
à un lorsque le résultat d’une addition possède une retenue, ...
Les indicateurs d’état sont utilisés par les instructions de saut conditionnels : en fonction
de l’état d’un (ou plusieurs) flags, le programme se poursuit de manière différente.
Toutes ces étapes (lecture de l’instruction, décodage, exécution) sont synchronisées par
un séquenceur qui assure le bon déroulement des opérations :
mémoire
horloge
bus d'adresse
pointeur
d'instruction
bus de commande : "lire la mémoire"
séquenceur
registre
d'instruction
bus de données
décodeur
micro-code
exécution
Pour exécuter le programme contenu dans la mémoire centrale, le séquenceur du micropro-
cesseur exécute lui-même un programme appelé micro-code, contenu dans une mémoire
morte à l’intérieur du microprocesseur.
Le séquenceur est dirigé par une horloge qui délivre un signal de fréquence donnée per-
mettant d’enchaı̂ner les différentes étapes de l’exécution d’une instruction :
cycle d'instruction
période d'horloge
(microcycle)
T1 T2 T3
recherche de instruction
décodage exécution
l'instruction suivante
Chaque instruction est caractérisée par le nombre de périodes d’horloge (ou microcycles)
qu’elle utilise (donnée fournie par le fabricant du microprocesseur).
Exemple : horloge à 5 MHz, période T = 1/f = 0, 2 µs. Si l’instruction s’exécute en 3
microcycles, la durée d’exécution de l’instruction est : 3 × 0, 2 = 0, 6 µs.
L’horloge est constituée par un oscillateur à quartz dont les circuits peuvent être internes
ou externes au microprocesseur.
Structure complète d’un microprocesseur simple : pour fonctionner, un microprocesseur
nécessite donc au minimum les éléments suivants :
registres
Unité pointeur d'instruction
Arithmétique
et Logique registre d'instruction
(UAL) accumulateur
indicateurs d'état
séquenceur décodeur
d'instructions
horloge
quartz
Chapitre 3
Les mémoires
A0 D0
A1 D1
n lignes A2 p lignes de données
D2
d'adresses (le plus souvent, p = 8)
RAM
ou Dp-1
An-1
ROM
actifs à l'état bas
signal de lecture : RD ou OE
signal d'écriture (RAM) : WR
validation de boîtier : CS
(chip select)
D7 D7
An-1
RD RD
commandes
WR WR
CS
A0
A1
adresses A2
An-1
microprocesseur bus
mémoire
D0 D0 A0
D1 8 D1 A1
données A2
D7 D7
An-1
RD RD
commandes
WR WR
CS
A0
A1
adresses A2
n
An-1
3.4 Chronogrammes de lecture/écriture en mémoire
Une caractéristique importante des mémoires est leur temps d’accès : c’est le temps qui
s’écoule entre l’instant où l’adresse de la case mémoire est présentée sur le bus d’adresses
et celui où la mémoire place la donnée demandée sur le bus de données. Ce temps varie
entre 50 ns (mémoires rapides) et 300 ns (mémoires lentes).
Chronogramme de lecture en mémoire :
horloge
bus
adresse sur le bus (0 ou 1)
d'adresses
commande
de lecture
donnée
temps d'accès stable
bus de donnée
valeurs non significatives
données sur le bus
Remarque : si le temps d’accès d’une mémoire est supérieur à une période d’horloge
(mémoire lente), le microprocesseur peut accorder à la mémoire un temps supplémentaire
(une ou plusieurs périodes d’horloge), à la demande de celle-ci. Ce temps supplémentaire
est appelé temps d’attente (wait time : TW ) :
signal
de lecture
microprocesseur mémoire
demande
de temps
d'attente
Chronogramme d’écriture en mémoire :
horloge
bus
adresse sur le bus
d'adresses
commande
de lecture écriture autorisée
Les boı̂tiers mémoire possèdent une broche notée CS : Chip Select. Lorsque cette broche
est active (état bas), le circuit peut être lu ou écrit. Lorsqu’elle est inactive( état haut),
le circuit est exclu du service : ses broches de données D0 à D7 passent à l’état de haute
impédance : tout se passe comme si la mémoire était déconnectée du bus de données du
microprocesseur, d’où la possibilité de connecter plusieurs boı̂tiers mémoire sur un même
bus : un seul signal CS doit être actif à un instant donné pour éviter les conflits entre les
différents boı̂tiers.
Exemple : connexion de trois boı̂tiers mémoire d’une capacité de 8 Ko chacun (13 lignes
d’adresses) sur un bus d’adresse de 16 bits :
13 bus d'adresses A0 - A12
microprocesseur mémoire 1 mémoire 2 mémoire 3
A0 A0 D0 A0 D0 A0 D0
A1 A1 D1 A1 D1 A1 D1
A2 A2 A2 A2
8 Ko 8 Ko 8 Ko
D7 D7 D7
A12 A12 A12 A12
A13
A14 CS CS CS
A15
RD WR RD WR RD WR
signaux
D0
D1 de selection
de boîtier bus de
données
D7 8 D0-D7
RD
WR
Dans un même boı̂tier, une case mémoire est désignée par les bits d’adresses A0 à A12 :
A12 A11 ... A1 A0 A12 A11 ... A1 A0
0 0 ... 0 0 à 1 1 ... 1 1
0000H 1FFFH
Pour atteindre la mémoire no 1, il faut mettre à 1 le bit A13 et à 0 les bits A14 et A15.
La plage d’adresses occupée par cette mémoire est donc :
A15 A14 A13 A12 ... A0 A15 A14 A13 A12 ... A0
0 0 1 0 ... 0 à 0 0 1 1 ... 1
2000H 3FFFH
De même, pour la mémoire no 2, on doit avoir A13 = 0, A14 = 1 et A15 = 0 d’où la plage
d’adresses occupée cette mémoire :
A15 A14 A13 A12 ... A0 A15 A14 A13 A12 ... A0
0 1 0 0 ... 0 à 0 1 0 1 ... 1
4000H 5FFFH
Pour la mémoire no 3, on doit avoir A13 = 0, A14 = 0 et A15 = 1 d’où la plage d’adresses
occupée cette mémoire :
A15 A14 A13 A12 ... A0 A15 A14 A13 A12 ... A0
1 0 0 0 ... 0 à 1 0 0 1 ... 1
8000H 9FFFH
On en déduit la cartographie ou mapping de la mémoire visible par le microprocesseur :
FFFFH
9FFFH
mémoire no 3 mémoire totale
8000H adressable par
le microprocesseur
mémoire
réelle
5FFFH
implantée
mémoire no 2
4000H
3FFFH
mémoire no 1
2000H
0000H
A0 à A12 mémoire no 0
1
microprocesseur 2
D0 à D7
3
A15 A14 A13 CS 4
CS 5
CS 6
CS 7
A Y0 CS
B Y1 CS
C Y2
Y3 CS
Y4 CS
Y5
Y6
Y7
décodeur 3 vers 8
(ex: 74138)
Table de vérité du décodeur d’adresses :
C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0
FFFFH
mémoire no 7
E000H
DFFFH
mémoire no 6
C000H
BFFFH
mémoire no 5
A000H
9FFFH
mémoire no 4
8000H
7FFFH
mémoire no 3
6000H
5FFFH
mémoire no 2
4000H
3FFFH
mémoire no 1
2000H
1FFFH
mémoire no 0
0000H
mémoires à semiconducteurs
RD
INTA
DEN
HOLD
DMA DT/R
HLDA
S0 signaux
d'état
S7
4,77 MHz
CLK
quartz
8284 READY
14,318 MHz
8086
RESET
générateur
d'horloge
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.
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 :
T1 T2 T3 T4 T1 T2 T3 T4
CLK
ALE
lecture
RD
écriture
WR
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), en-
semble 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.
Circuit de démultiplexage A/D :
LATCH
ALE
bus d'adresses
8086
H Q
D A0 - A19
x 20
bus de données
20
AD0 - AD15 D0 - D15
A16/S3 - A19/S6 S3 -S6
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 microproces-
seur que lorsque les données sont présentes sur le bus A/D.
Exemples de bascules D : circuits 8282, 74373, 74573.
AD0 - AD7 D0 Q0
A0 - A7
ou D1 Q1
ou
AD8 - AD15 8282 A8 - A15
ou ou
A16/S3 - A19/S6 A16 - A19
D7 Q7
ALE STROBE
OE
T1 T2 T3 T4
CLK
ALE
DEN
écriture
DT/R
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.
Exemples de tampons de bus : circuits transmetteurs bidirectionnels 8286 ou 74245.
A0 B0
A1 B1
8286
AD0 - AD7 D0 - D7
ou ou
AD8 - AD15 D8 - D15
commande
du sens de A7 x8 B7
transfert lignes de
DIR données
DT/R bufferisées
DEN EN
validation
du transfert
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 Kmots 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). 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.
A1 - A19 bus d'adresses
A1 A0 D0 D0
A2 A1 D1 D1
banque
paire D7 D7
A19 A18
A0 CS
A1 A0 D0 D8
A2
A1 D1 D9
banque
impaire D7 D15
A19 A18
BHE CS
D0 - D15
bus de données
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 :
BHE A0 octets transférés
0 0 les deux octets (mot complet)
0 1 octet fort (adresse impaire)
1 0 octet faible (adresse paire)
1 1 aucun octet
Remarque : 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 :
A1 A0 D0 D0
A2 A1 D1 D1
64 K x 8
D7 D7
A16 A15
A17 Y0 CS
A
A18 B Y1 banque
A19 C Y2
paire
A1 A0 D0 D0
Y3
74138 Y4
A0 Y5 A2
A1 D1 D1
Y6
EN Y7 64 K x 8
D7 D7
A16 A15
CS
A1 A0 D0 D8
A2 A1 D1 D9
64 K x 8
D7 D15
A16 A15
A17
A Y0 CS
A18 B Y1 banque
A19 C Y2 impaire
D0 D8
Y3 A1 A0
74138 Y4
BHE Y5 A2 A1 D1 D9
Y6
EN Y7 64 K x 8
D7 D15
A16 A15
CS
adresses
8086 8282 A15
WR ALE D Q
A8
RD DEN STR
M/IO DT/R
8282 A7
D Q
A0
BUS SYSTEME
STR
D15
A B
8286 D8
EN
données
DIR
D7
A B
8286 D0
EN
DIR
commandes
M/IO
RD
WR
registres 1
temporaires 2
file d'attente
3 des instructions
4 (6 octets)
5
6
commandes
de l'unité
UAL
d'exécution
indicateurs
1 Mo FFFFFH
case
un segment mémoire
(64 Ko) offset
adresse
multiple
de 16
0 00000H
La donnée d’un couple (segment,offset) définit une adresse logique, notée sous la forme
segment : offset.
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.
Le microprocesseur
Définition
Son rôle
le contrôle du système
Cette fonction se traduit par des opérations de décodage et d'exécution
des ordres exprimés sous forme d'instruction.
Puissance d'un microprocesseur
Définition :
(Des registres supplémentaires sont ajoutés pour rendre la vie plus facile
aux programmeurs)
Son rôle :
Toute instruction qui modifie une donnée fait toujours appel à l'UAL.
Noter :
accumulateur
alu
}
contenu initial accumulateur
perdu!
registre
mémoire
Son rôle
Pointer TOUJOURS le premier octet d'une instruction.
Commentaires :
Le programme à exécuter est une succession d'instructions ordonnées
(chaque instruction pouvant prend plusieurs octets!) qui se trouve rangé
dans une zone mémoire, généralement à des adresses successives.
A la mise sous tension, une valeur particulière est déposée sur le bus
d'adresses (Dans le cas du 6809, cette valeur est $FFFE).
Son rôle :
Commentaires :
! Une fois que le premier octet de l'instruction en cours est décodé ...
Le contenu du Compteur d'Instructions est changé
(contient l'adresse du début de l'instruction à venir).
Le contenu du Registre d'adresses change! donc
[C.I.] ≠ [R.A.]
Ce changement correspond...
soit à une incrémentation du contenu afin de
lire l'information complémentaire de l'instruction en cours.
soit à un chargement d'une nouvelle valeur
correspondant à une nouvelle zone mémoire utilisée temporairement par
le microprocesseur (zone différente de celle où se trouve le programme).
Sa tâche
Commentaires :
L'information qu'il "capture" sur le bus des données est utilisé par le
décodeur d'instructions. Suivant le protocole ci-dessous :
Son rôle
Stocker les résultats des tests effectués par l'U.A.L. après traitement
sur les données
Commentaires :
a- Le bit de retenue
b- le bit de zéro
Ce bit est actif lorsque l'opération a pour effet de mettre tous les bits
d'un accumulateur ou d'un registre à la valeur logique 0 (très utilisé pour
réaliser des compteurs).
c- Le bit de signe
Ces 3 bits de base sont parfois complétés par des bits supplémentaires
choisis par le constructeur.
Les registres généraux
Son rôle :
Commentaires :
Cette unité fournit, à partir d'un signal de référence qui est l'horloge,
tous les signaux de synchronisation utiles au bon fonctionnement de
l'ensemble.
Cette horloge est crée à partir d'un oscillateur interne qui utilise un
signal en provenance d'un quartz externe.
Deux actions complémentaire à noter :
X X X X 0 Segment
+ X X X X Offset
X X X X X Adresse absolue
Fig. 2.2 : calcul d'adresse dans un 8086
Dans notre exemple, l'adresse de la case mémoire considérée devient 2000:350 soit :
Segment = 2000
Offset = 350
L'adresse absolue est calculée ainsi :
2 0 0 0 Segment
+ 3 5 0 Offset
2 0 3 5 0 Adresse absolue
Fig. 2.3 : exemple de calcul d'adresse
Remarque :
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 digit de plus
faible poids soit nul. Nous pouvons donc commencer un segment tous les 16 octets.
Exercice 1)
1. Donner les adresses linéaires (absolues) des mémoires 3500:AB00, 0022:FFFF,
2. Proposer au moins deux adresses segment:offset différentes pour les mémoires
d'adresse linéaire 10000, FFFFF, 00000
AX AH AL SP CS IP
BX BH BL BP DS FLAGS
CX CH CL SI SS
DX DH DL DI ES
BX : Base
Usage général,
Adressage, (Par défaut, son offset est relatif au segment DS)
CX : Comptage et calcul
Usage général,
Utilisé par certaines instruction comme compteur de répétition.
Ne peut pas servir pour l'adressage
DX : 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
SP : 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 : Pointeur de Base
Adressage comme registre de base, (Par défaut, son offset est relatif à SS)
Usage général
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
Si le registre segment n’est pas spécifié (cas rien), alors le processeur l’ajoute par défaut
selon l’offset choisit :
Six bits reflètent les résultats d'une opération arithmétique ou logique et 3 participent
au control du processeur.
P : (Parité) indique que le nombre de 1 est un nombre pair. Ce flag est utilisé avec
certains sauts conditionnels.
A : (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)
Z : (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.
S : (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.
T : (Trap) met le CPU en mode pas à pas pour faciliter la recherche des défauts
d'exécution.
INST : instruction,
R : Registre quelconque,
Rseg : Registre Segment
Roff : Registre d’offset
Adr : Adresse
[ adr] : contenu Mémoire
Off : Offset de l’adresse
Im : donnée (constante)
Dep : déplacement (constante)
Op : Opérande
Os : Opérande source
Od : opérande destination
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 de gauche.
Les opérandes peuvent être des registres, des constantes ou le contenu de cases
mémoire, on appelle ça le mode d’adressage
Exemples :
INC AX : incrémenter le registre AX
MOV AX, BX : Copier le contenu de BX dans AX
Exemples :
MOV AX, 243 : charger le registre AX par le nombre décimal 243
ADD AX, 243h : additionner le registre AX avec le nombre hexadécimal 243
MOV AX, 0xA243 : Quand le chiffre de gauche du nombre hexadécimal est une lettre,
il est préférable d'utiliser le préfix 0x pour l'hexadécimal
MOV AL, 'a' : Charger le registre AL par le code ASCII du caractère 'a'
MOV AX, 'a' : Charger le registre AH par 00 et le registre AL par le code ASCII du
caractère 'a'
MOV AX,'ab' : Charger AH par 'a' et AL par 'b'
INST R , [adr]
INST [adr] , R
INST taille [adr] , im
Exemples :
MOV AX,[243] : Copier le contenu de la mémoire d'adresse DS:243 dans AX
MOV [123],AX : Copier le contenu de AX dan la mémoire d'adresse DS:123
MOV AX, [SS:243] : Copier le contenu de la mémoire SS:243 dans AX
Exemples :
MOV AX, [BX] ; Charger AX par le contenu de la mémoire d'adresse DS:BX
MOV AX, [BP] ; Charger AX par le contenu de la mémoire d'adresse SS:BP
MOV AX, [SI] ; Charger AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [DI] ; Charger AX par le contenu de la mémoire d'adresse DS:DI
MOV AX, [ES:BP] ; Charger AX par le contenu de la mémoire d'adresse ES:BP
Exemples :
MOV AX, [SI] ; Charger AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [SI+500] ; Charger AX par la mémoire d'adresse DS:SI+500
MOV AX, [DI-8] ; Charger AX par la mémoire d'adresse DS:DI-8
MOV AX, [ES:SI+4] ; Charger AX par la mémoire d'adresse ES:SI+4
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
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.
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 :
adresse 4A
00
MOV Od , Os
Copie l'opérande Source dans l'opérande Destination
PUSH Op
Empiler l’opérande Op (Op doit être un opérande 16 bits)
- Décrémente SP de 2
- Copie Op dans la mémoire pontée par SP
PUSH R16
PUSH word [adr]
PUSH im PUSH R8
POP Op
Dépiler dans l’opérande Op (Op doit être un opérande 16 bits)
X X X X
X DX SP DX BP SP
CX SP CX CX SP CX
BX BX BX BX
AX AX AX AX
X X X X
X X X X
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]
XCHG [ ] , [ ]
Addition :
Exercice 4) :
Soustraction
Multiplication
MUL Op 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).
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)
MUL BL ; AL x BL → AX
MUL CX ; AX x CX → DX:AX
MUL byte [BX] ; AL x (octet pointé par BX) → AX
MUL word [BX] ; AX x (word pointé par BX) → DX :AX
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
mov al,64h
mov bl,2
mul bl
mov al,64h
mov cl,3
mul cl
Division
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.
Si AL contient un nombre négatif, On complète par des 1 pour obtenir la
représentation sur 16 bits.
+5 = 0000 0101 0000 0000 0000 0101
5 = 1111 1011 1111 1111 1111 1011
AND Od , Os ET logique
Od ET Os Od
OR Od , Os OU logique
Od OU Os Od
XOR Od , Os OU exclusif logique
Od OUX Os Od
TEST Od , Os Similaire à AND mais ne retourne pas de résultat dans Od, seuls les
indicateurs sont positionnés
Forcer un bit à 0 :
xxxx xxxx
Pour forcer un bit à 0 sans modifier les autres bits, on utilise
AND 1110 1101
l'opérateur logique AND et ces propriétés :
xxx0 xx0x
- 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
Forcer un bit à 1 :
Pour forcer un bit à 1 sans modifier les autres bits, on utilise xxxx xxxx
l'opérateur logique OR et ces propriétés : OR 0010 0000
- x OR 1 = 1 (1 = élément absorbant de OR) xx1x xxxx
- 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
Inverser un bit :
Pour inverser la valeur d'un bit sans modifier les autres bits, on xxxx xxxx
utilise l'opérateur logique XOR et ces propriétés : XOR 0010 0000
- X XOR 1 = X xxXx xxxx
- 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
On peut aussi décaler le contenu d'une case mémoire mais il faut préciser la taille
INST byte [BX],1 ; décaler une fois le contenu de la case
mémoire d'adresse BX
C MSB LSB
MSB LSB C
MSB LSB C
Les décalages arithmétiques permettent de conserver le signe. Ils sont utilisés pour
effectuer des opérations arithmétiques comme des multiplications et des
divisions par 2.
C MSB LSB
MSB LSB C
C MSB LSB
RCR R/M,k (Rotate Through CF Right) Rotation à droite à travers le Carry
MSB LSB C
LAHF
Copier l'octet bas du registre d'état dans AH
AH : S Z A P C
Après l'opération, on a :
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,
Exercice 10) :
1. programme qui positionne l’indicateur P à 0 sans modifier les autres indicateurs
2. programme qui positionne l’indicateur O à 1 sans modifier les autres indicateurs
2.5.7 Les instructions de contrôle de boucle
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,
Exercice 11) : (boucle.asm) Programme qui ajoute la valeur 3 au contenu des 100 cases
mémoire du segment DATA dont l'adresse (offset) commence à 4000h
Exercice 12) : (boucle2.asm) 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)
Branchements inconditionnels
Branchements conditionnels
Appel de fonction ou d’interruptions
Tous ces transferts provoquent la poursuite de l'exécution du programme à partir
d'une nouvelle position du code. Les transferts conditionnels se font dans une marge de
-128 à +127 octets à partir de la position de transfert.
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.
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
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
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
SO=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
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
JNS xyz (Jump if No Sign ) aller à la ligne xyz si signe positif. C'est-à-dire si S = 0
Exercice 13) :
Ecrire la suite d’instructions pour réaliser les étapes suivantes :
1. Mettre 1 dan AX
2. incrémenter AX
3. si AX 200 recommencer au point 2
4. sinon copier AX dans BX
Exercice 14) :
Ecrire la suite d’instructions pour réaliser les étapes 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
Exercice 16) : (boucle3.asm) Programme qui divise par 3 les 100 octets contenus dans
les 100 cases mémoires commençant à l'adresse 4000h. Ne pas utiliser l'instruction loop
Si l'adresse port tient sur 8 bits, elle peut être précisée immédiatement, sinon il faut
passer par le registre DX
IN AL , 4Dh MOV DX , 378h
IN AL , DX
Une opération ne peut pas se faire entre deux cases mémoire, il faut que ça passe
par un registre. On ne peut pas avoir des instructions du style :
Bien que le registre SP soit un registre d’adressage, il ne peut être utilisé directement
pour accéder à la pile, on peut toutefois le copier dans un registre valide pour
l’adressage (BX, BP,SI, DI) et utiliser ensuite ce dernier :
On ne peut pas faire des opérations directement sur un registre segment, il faut
passer par un autre registre. On ne peux pas non plus copier un registre segment
dans un autre
On ne peut pas utiliser directement une adresse segment dans une instruction, il faut
passer par un registre segment.
On ne peut pas faire une multiplication ou une division sur une donnée (immédiat)
MUL im
DIV im
On ne peut pas empiler/dépiler un opérande 8 bits
PUSH R/M8
On ne peut pas utiliser les opérateurs + - x sur des registre ou des mémoires
AX AH AL SP CS O D I T S Z A P C
BX BH BL BP DS
CX CH CL SI SS * : Positionné selon le résultat
DX DH DL DI ES ? : Modifié, résultat non défini
Transfert O S Z A P C Branchement O S Z A P C
MOV D , S D S JMP a branche à l'adresse a
PUSH R/M empile R/M (16 bits) JE/JZ a saut si = (Z levé)
POP R/M dépile R/M (16 bits) JNE/JNZ a saut si (Z baissé)
XCHG D , S D S JA a saut si (non signé)
XLAT AL [BX+AL] JAE a saut si (non signé)
LEA R16 , M R16 offset de M JB a saut si (non signé)
LDS R16 , [a]
R16 [a], DS[a+2] JBE a saut si (non signé)
LES R16 , [a]
R16 [a], ES[a+2] JG a saut si (signé)
Arithmétique JGE a saut si (signé)
ADD D , S DS+D * * * * * * JL a saut si (signé)
ADC D , S DS+D+C * * * * * * JLE a saut si (signé)
INC D DD+1 * * * * * ! JC a saut si C = 1
SUB D,S DD-S * * * * * * JNC a saut si C = 0
SBB D,S DD–S-C * * * * * * JO a saut si O = 1
NEG D D -D * * * * * * JNC a saut si C = 0
CMP D,S D-S * * * * * * JP/JPE a saut si P = 1
DEC D DD-1 * * * * * * JNP/JPO a saut si P = 0
MUL S X:A A x S * ? ? ? ? * JS a saut si S = 1
IMUL S X:A A x S (signée) * ? ? ? ? * JNS a saut si S = 0
DIV S A(X:A) / S, XRst ? ? ? ? ? ? CALL a saut à sous programme
IDIV S division signée ? ? ? ? ? ? RET retour de sous programme
CBW Byte(AL) to word(AX) ( signé) LOOP A dec CX, saut si CX 0
CWD Word(AX) to Dword (DX|AX) (signé) LOOPZ a dec CX, saut si :CX 0 et Z = 1
DAA Dec. adj. after ADD ? * * * * * LOOPNZ a dec CX, saut si :CX 0 et Z = 0
AAA ascii adj after ADD ? ? ? * ? * JCXZ a saut si CX = 0 ( Z)
DAS dec adj after SUB ? * * * * * action sur Indicateurs
AAS ascii adj after SUB ? ? ? * ? * LAHF AH RE L
AAM ascii adj after MUL ? * * ? * ? SAHF REL AH * * * * *
AAD ascii adj before DIV ? * * ? * ? PUSHF empile RE
Logique POPF dépile RE * * * * * *
NOT R/M R/M R/M CLC Clear Carry flag 0
AND D , S D D AND S 0 * * ? * 0 STC Set Carry flag 1
OR D , S D D OR S 0 * * ? * 0 CMC complémente Carry *
XOR D , S D D XOR S 0 * * ? * 0 CLD Clear Direction flag
TEST D , S D AND S 0 * * ? * 0 STD Set Direction flag
SHL/SHL R/M C 0 * * * ? * * CLI Clear Interrupt flag
SHR R/M 0 C * * * ? * * STI Set Interrupt flag
SAR R/M C * * * ? * * Divers
ROL R/M C * INT n déclenche l'interrupt n
ROR R/M C * INTO n interrupt si Overflow
RCL R/M C * IRET Retour d'interruption * * * * * *
RCR R/M C * HALT entre en mode vail
Chaînes WAIT entre en attente
MOVSb/w [ES:DI] [DS:SI], NOP ne fait rien
SCASb/w AL/AX – [ES:DI]; * * * * * * IN al/ax,port Lit un port d' E/S
LODSb/w AL/AX [DS:SI] out port,al/ax écrit dans un port
CMPSb/w [ES:DI] - [DS:SI], * * * * * *
STOSb/w AL/AX [ES:DI] * * * * * *
3 L’ASSEMBLEUR NASM
La syntaxe des mnémoniques que nous avons utilisée jusqu’à présent est la syntaxe de
l’assembleur NASM. Rappelons que le rôle de l’assembleur est de convertir le programme
source écrit en mnémonique en codes machines compréhensible par le processeur.
BITS
Cette directive indique à NASM s'il doit produire un code 16 bits ou un code 32 bits.
Elle est utilisée sous la forme : BITS 16 ou BITS 32
ORG
Cette directive indique à l'assembleur l'adresse à partir de laquelle le programme sera
implanté dans la RAM. Pour les programmes ".com", cette adresse doit être 100h
SEGMENT
Cette directive précise dans quel segment, les instructions ou les données qui la
suivent seront assemblées :
SEGMENT .text
Les instructions ou les données initialisée (par db ou dw) qui suivent cette 'déclaration'
seront placé dans le segment programme (Code segment)
SEGMENT .data
Les données (initialisée) déclarée après cette directive sont placée dans le segment de
données (Data segment)
SEGMENT .bss
Les données déclarées après cette directive seront placées dans le segment de
données mais cette partie est réservée à la déclaration des variables non initialisée.
%INCLUDE
Comme en langage C, cette directive permet d'inclure un fichier source avant la
compilation.
%DEFINE
La directive %define permet de définir une constante un peut de la même façon que la
directive EQU . La différence subtile est que %define définit une macros qu'on peur
redéfinir dans la suite du programme ce qui n'est pas possible avec EQU .
3.2 LES PSEUDO INSTRUCTION DE NASM
Les pseudo instructions ne sont pas des instructions du 8086. Elles ne seront donc pas
traduites en langage machine lors de l'assemblage. NASM les interprète et réalise les
fonctions correspondantes. Les pseudo instructions les plus courantes servent à la
déclaration des variables initialisées ou non initialisées, définition de constantes et la
répétition des instructions :
≪ : décalage à gauche
≫ : décalage à droite
x equ 0F00h
mov ax,(2*x+6)/2
mov ax,x << 4
mov ax,(x >> 8)+(x << 4)
mov ax,x & x >> 4; >> est prioritaire sur &
mov ax,x | x >> 4; >> est prioritaire sur |
Attention, les expressions ne peuvent être utilisés qu’avec des constantes. On ne peut
pas avoir des choses du genre : MOV AX , DX+2
4 LES ENTREE SORTIES
Pour faire des entrées sorties (essentiellement avec l’écran et le clavier), on passe par
des interruptions du BIOS ou du DOS. Nous n'allons voir ici que ce dont nous avons
besoin.
Fonction 00
Cette fonction permet de choisir un mode texte ou un mode graphique. En changeant
de mode, on peut effacer l'écran, ce qui fait que l'on peut appeler cette fonction pour
effacer l'écran et rester dans le même mode.
Paramètres :
AH = 00
Résolution dimensions Résolution
AL mode Couleurs pages Segment
texte caractère graphique
00h T 40x25 9x16 360x400 16 8 B800
01h T 40x25 9x16 360x400 16 8 B800
02h T 80x25 9x16 720x400 16 8 B800
03h T 80x25 9x16 720x400 16 8 B800
04h G 40x25 8x8 320x200 4 . B800
05h G 40x25 8x8 320x200 4 . B800
06h G 80x25 8x8 640x200 2 . B800
07h T 80x25 9x16 720x400 mono . B000
0Dh G 40x25 8x8 320x200 16 8 A000
0Eh G 80x25 8x8 640x200 16 4 A000
0Fh G 80x25 8x14 640x350 mono 2 A000
10h G 80x25 8x14 640x350 16 . A000
11h G 80x30 8x16 640x480 mono . A000
12h G 80x30 8x16 640x480 16 . A000
13h G 40x25 8x8 320x200 256 . A000
Tableau 4.1 : modes écran
Pour les modes texte, on peut doubler le nombre de ligne en chargeant un jeux de
caractère de hauteur 8 pixels. Voir fonction 11
Pour ne pas effacer l'écran, placer le bit 7 de AL à 1 (Ajouter 80h)
Fonction 09
Cette fonction permet d'écrire un caractère couleur couleur
arrière plan texte
- Permet les répétitions,
- Gère la couleur en mode texte et en mode R V B R V B
graphique,
- Ne gère pas le curseur.
clignotement brillance
Paramètres : AH = 09h
Fig. 4.1 : couleur en mode texte
AL = caractère à écrire
BH = page écran
BL = attribut de couleur (RVB :111=Blanc, 000=Noir)
CX = nombre de fois
Les caractères spéciaux ne sont pas reconnus (le 7 ne fait pas bip). Le bit 7 de la
couleur fait un ou exclusif en mode graphique et un clignotement (uniquement en
mode plein écran) en mode texte.
Fonction 0Eh
Cette fonction permet d'écrire un caractère,
- Fonctionne en mode graphique,
- Gère le curseur
- Gère la couleur seulement en mode graphique. Seule la couleur du caractère est
gérée, la couleur du fond n’est pas gérée.
paramètres : AH = 0Eh
AL = code ascii du caractère à écrire
BL = couleur du caractère (mode graphique uniquement).
Fonction 02
Cette fonction permet de positionner le curseur où on le désire, dans la page courante
ou dans une page cachée.
Paramètres : AH = 02h
BH = numéro de la page
DH = ligne (ordonnée)
DL = colonne (abscisse)
En mode 25x80 les cordonnées vont de (0,0) à (24,79).
Paramètres : AH = 05h
AL = numéro de la page
AH = 0Ch
BH = 0 (numéro de page)
AL = couleur du pixel
si bit 7 = 1 on trace en mode XOR sauf en mode 256 couleur
CX = x (abscisse)
DX = y (ordonnée)
Fonction 02
Cette fonction permet d'écrire un caractère. Le caractère est envoyé vers la sortie
standard, l'écriture peut donc être redirigée dans un fichier.
Paramètres : AH = 02h
DL = Caractère à écrire
Fonction 09
Cette fonction permet en un seul appel, d'écrire une suite de caractères.
Paramètres : AH = 09h
DX = Adresse de la chaîne de caractères
La chaîne doit être terminée par le caractère $
Remarque : Cette interruption retourne $ dans le registre AL et ceci même si la
documentation officielle affirme le contraire. Donc attention, si vous avez
quelque chose dans AL avant d'appeler cette interruption, ce sera perdu
Exemple : (phrase.asm)
;*********************************************************
; affiche une phrase … l'aide de int21_fct09
;*********************************************************
BITS 16
ORG 0x0100
SEGMENT .data
txt db 'MON PREMIER PROGRAMME NASM$'
SEGMENT .text
MOV AH,9 ; fonction 9 de int21
MOV DX,txt ; adresse du début de la phrase
INT 21h ; écrit la phrase
MOV AX,4C00h ; fin programme
int 21h
Remarques :
Pour revenir à la ligne à la fin de la chaîne : ’Bonjour’,10,13 ,’$’
Si la chaîne contient apostrophe : ’Ecole d’ingénieurs’ ’Ecole d’,39,’ingénieurs$’
Fonction 07
Cette fonction permet de lire un caractère du clavier sans qu'il n'y ait d'écho à l'écran.
Paramètre passé : AH = 07
Paramètre retourné : AL = caractère lu
Les touches fonction retourne 2 caractères, d'abord un octet nul, puis le code étendu
de la touche, il faut donc faire 2 appels consécutifs de la fonction 07.
Fonction 0Bh
Cette fonction permet de savoir si un caractère est disponible dans la mémoire tampon
du clavier. Elle est l'équivalente de la fonction kbhit (du C) ou de Keypressed (du
Pascal). Il ne faut pas oublier de vider le buffer par une lecture à l'aide de la fonction
07 ou 08, sinon on risque d'avoir des surprises à la prochaine lecture du clavier.
Paramètre passé : AH = 0B
Paramètre retourné : AL = 0 aucun caractère n'a été tapé
AL = 255 (-1) au moins un caractère a été tapé
saisir, il faut compter le CR
Une fois la saisie terminée, la fonction place dans le deuxième octet du buffer le
nombre de caractère effectivement saisi. La chaîne saisie est placée tous de suite derrière.
B8000
Mémoire
écran vidéo
caractère
attribut
Quelques interruptions
AH AL BH BL CX DH DL commentaire
Mode écran 00 mode
Ecrit char 09 car page coul t/g rep !Curs !CarSpec
Ecrt char 0A car page rep !Curs !CarSpec
Ecrt char 0E car Coul g Curs CarSpec
INT 10h
Pos Curs 02 page ligne col
Choisir page 05 page
Allumer pixel 0Ch couleur page x y
50 lignes 11h 12h 30h
Ecrt char 02 car ^C^B -> int 23h
Ecrit chaîne 09 adresse ‘$’= fin chaîne
Lit car !écho 07 Car lu
INT 21h
Lit chaine 0Ah adresse Voir cours
kbhit 0B 0 : non
FF : oui
Le premier octet est un octet optionnel qui représente un préfix qui peut être un
préfix de répétition ou un préfix de changement de segment.
7 6 5 4 3 2 1 0
CO d w
7 6 5 4 3 2 1 0
REG MOD
ADR
w=1 w=0
- Directe
000 AX 000 AL 000 BX+SI+d 00
- Indirecte avec dep = 0
001 CX 001 CL 001 BX+DI+d
010 DX 010 DL 010 BP+SI+d Indirect déplacement court :
01
011 BX 011 BL 011 BP+DI+d 8 bits, 127, 1 ou 2 chiffres hex
100 SP 100 AH 100 SI+d Indirect dép. long : 16 bits,
10
101 BP 101 CH 101 DI+d 128 , + de 2 chiffres hex
- BP+d R ← R ou R ← im
110 SI 110 DH 110
- Direct 11 Dans ce cas :
111 DI 111 BH 111 BX+d ADR= code registre destination
REG Segment Préfix de changement de segment
00 01 10 11 ES CS SS DS
ES CS SS DS 26h 2Eh 36h 3Eh
(*) Ces instructions ne tournent pas sur le 8086 mais sur les processeurs qui l’on suivi
(**) s=1 dans le cas R/M16 ↔ im8, une extension de signe 8 bits vers 16 bits est effectués
sur la donnée immédiate avant l’opération.
Exemples :
mov ax , 3456h mov CL , [BP+SI]
R16 ← im16 R8 ← M
1011 w REG donnée 1000 10dw MOD REG ADR
1011 1 000 5634 1000 1010 00 001 010
B8 56 34 8A 0A
MOV AH, 5 AL + BL AL A AH AL C A
ADD AL , BL 03 + 04 → 07 0 AAA 05 07 0 0
AAA 05 + 07 → 0C 0 AAA 06 02 1 1
09 + 08 → 11 1 AAA 06 07 1 1
DAS (Decimal Adjust AL after Substraction ).
Ajustement décimal de AL après soustraction de deux opérandes BCD pour
que le résultat soit aussi en BCD. (voir DAA)
Chacune des instructions existe en deux versions, l'une se fait entre deux octets
XXXXB , l'autre se fait entre 2 words XXXXW
Ces instructions sont utilisées sans opérandes. Les opérations se font implicitement
entre 2 opérandes pointés par les registres d'index SI et DI. L'opérande pointé par SI
constitue l'opérande source, celui pointé par DI constitue l'opérande destination.
L'opérande source est pris par défaut dans le segment DATA à moins que l'on précise
dans l'instruction un préfix de changement de segment qui oblige le processeur à prendre
l'opérande source dans un autres segment.
L'opérande destination est toujours situé dans le segment EXTRA, on ne peut pas le
modifier.
[DS:SI] [ES:DI]
MOVSB : Copie un octet depuis la case source [DS:SI] vers la case destination
[ES:DI] puis auto inc/decrémente les registre SI et DI
SI DI SI DI
MOVSB ES MOVSB
MOVSW : Transfert deux octets depuis la source vers la destination puis auto
inc/decrémente de 2 les registre SI et DI
SI DI SI DI
MOVSW ES MOVSW
Grâce au préfixe de répétition REP, les instructions MOVSB et MOVSW sont répétées CX
fois ce qui permet de copier une zone mémoire dans une autre.
Exercice 23)
Programme qui recopie 500 octets de la position 4000h du DATA segment vers la position
6000h du EXTRA segment
Exercice 24)
Programme qui recopie 500 octets de la position 4000h du EXTRA segment vers la
position 6000h du même segment
Exercice 25)
Programme qui recopie 500 octets de la position 4000h du DATA segment vers la position
6000h du même segment
LODS
LODSB : Copie l'octet source dans AL puis inc/decr le registre SI.
STOS
STOSB : Copie AL dans l’octet destination et inc/decr le registre DI.
Avec le préfix de répétions REP, Cette instruction permet d’initialiser une chaîne
(une zone mémoire) avec le même caractère.
CMPS
CMPSB : Compare l'octet source avec l'octet destination, positionne les indicateurs
puis inc/decrémente les registres SI et DI.
CMPSW : Compare le mot source avec mot destination, positionne les indicateurs
puis inc/decrémente de 2 les registres SI et DI
Avec le préfixe de répétition REPZ (repeat while Z) , cette instruction est répétée CX
fois tant que Z=1
Avec le préfixe de répétition REPNZ (repeat while not Z) , cette instruction est
répétée CX fois tant que Z=0
SCAS
SCASB : Compare AL avec l'octet destination, positionne les indicateurs puis
inc/decrémente le registre DI.
Avec le préfixe de répétition REPZ (repeat while Z) , cette instruction est répétée CX
fois tant que Z=1
Avec le préfixe de répétition REPNZ (repeat while not Z) , cette instruction est
répétée CX fois tant que Z=0
Avec répétition cette opération permet (par exemple) de chercher l'occurrence d'une
valeur dans une chaîne
LEA R16 , M
(Load Effective Adress ) Transfert l'offset de l’adresse de M dans le registre R16.
LEA AX, [BX+124] ; Copier dans AX la valeur de BX + 124
XLAT
Instruction sans opérande qui recopie dans AL le contenu de la case mémoire pointée
par BX+AL
La figure ci-contre montre une table contenant les codes ASCII 2FA3
de quelques chiffres. Pour déterminer le code ASCII d’un chiffre, il (0) 48
suffit de placer le chiffre dans AL et d’exécuter l’instruction XLAT (1) 49
(2) 50
(3) 51
(4) 52
(5) 53
MOV BX,2FA3h
MOV AL,3
XLAT
HALT Met le processeur en mode veille. On peut sortir de cet état soit par une
interruption externe autorisée soit par un RESET.
WAIT Met le processeur en mode WAIT. On peut sortir de cet état quand la
broche test du processeur passe au niveau 1. Cette instruction sert à
synchroniser le processeur sur des événements externes. Si une
interruption externe autorisée intervient lors du mode WAIT, elle est
exécutée puis le processeur revient en mode WAIT.
Annexe
Jeu d’instructions du 8086
Transfert de données :
Général
MOV Déplacement d’un octet ou d’un mot
PUSH Ecriture d’un mot au sommet de la pile
POP Lecture d’un mot au sommet de la pile
XCHG Echange d’octets ou de mots
XLAT ou Traduction d’un octet à l’aide d’une table
XLATB
Entrées/Sorties
IN Lecture d’un port d’E/S
OUT Ecriture d’un port d’E/S
Transfert d’adresses
LEA Chargement d’une adresse effective
LDS Chargement d’un pointeur utilisant DS
LES Chargement d’un pointeur utilisant ES
Transfert des flags
LAHF Transfert des 5 flags bas dans AH
SAHF Transfert de AH dans les 5 flags bas
PUSHF Sauvegarde des flags sur la pile
POPF Restauration des flags à partir de la pile
Instructions arithmétiques :
Addition
ADD Addition d’octets ou de mots
ADC Addition d’octets ou de mots avec retenue
INC Incrémentation de 1 d’un octet ou d’un mot
AAA Ajustement ASCII de l’addition
DAA Ajustement décimal de l’addition
Soustraction
SUB Soustraction d’octets ou de mots
SBB Soustraction d’octets ou de mots avec retenue
DEC Décrémentation de 1 d’un octet ou d’un mot
NEG Complémentation à 2 d’un octet ou d’un mot (change-
ment de signe)
CMP Comparaison d’octets ou de mots
AAS Ajustement ASCII de la soustraction
DAS Ajustement décimal de la soustraction
Multiplication
MUL Multiplication non signée d’octets ou de mots
IMUL Multiplication signée d’octets ou de mots
AAM Ajustement ASCII de la multiplication
Division
DIV Division non signée d’octets ou de mots
IDIV Division signée d’octets ou de mots
AAD Ajustement ASCII de la division
CBW Conversion d’octet en mot
CWD Conversion de mot en double mot
Instructions logiques :
Logique
NOT Complément à 1 d’un octet ou d’un mot
AND ET logique de deux octets ou de deux mots
OR OU logique de deux octets ou de deux mots
XOR OU exclusif logique de deux octets ou de deux mots
TEST Comparaison, à l’aide d’un ET, d’octets ou de mots
Décalages
SHL/SAL Décalage à gauche arithmétique ou logique (octet ou
mot)
SHR Décalage logique à droite d’un octet ou d’un mot
SAR Décalage arithmétique à droite d’un octet ou d’un mot
Rotations
ROL Rotation à gauche d’un octet ou d’un mot)
ROR Rotation à droite d’un octet ou d’un mot
RCL Rotation à gauche incluant CF (octet ou mot)
RCR Rotation à droite incluant CF (octet ou mot)
Instructions sur les chaı̂nes de caractères :
Préfixes
REP Répétition tant que CX n’est pas nul
REPE ou REPZ Répétition tant qu’il y a égalité et que CX n’est pas nul
REPNE ou Répétition tant qu’il n’y a pas égalité et que CX n’est
REPNZ pas nul
Instructions
MOVS ou Déplacement de blocs d’octets ou de mots
MOVSB/MOVSW
CMPS ou Comparaison de blocs d’octets ou de mots
CMPSB/CMPSW
SCAS ou Exploration d’un bloc d’octets ou de mots
SCASB/SCASW
LODS ou Tranfert d’un octet ou d’un mot dans AL ou AX
LODSB/LODSW
STOS ou Chargement d’un bloc d’octets ou de mots par AL ou
STOSB/STOSW AX
Instructions de branchements :
Branchements inconditionnels
CALL Appel de procédure
RET Retour d’une procédure
JMP Saut inconditionnel
Contrôles d’itérations
LOOP Bouclage tant que CX = 0
LOOPE ou Bouclage tant que CX = 0 et ZF = 1 (égalité)
LOOPZ
LOOPNE ou Bouclage tant que CX = 0 et ZF = 0 (inégalité)
LOOPNZ
JCXZ Saut si CX est nul
Interruptions
INT Interruption logicielle
INTO Interruption si OF = 1 (overflow)
IRET Retour d’une interruption
Instructions de branchements conditionnels :
Sauts conditionnels
JA ou JNBE (1) Saut si « supérieur » (si CF + ZF = 0)
JAE ou JNB (1) Saut si « supérieur ou égal » (si CF = 0)
JB ou JNAE (1) Saut si « inférieur » (si CF = 1)
JBE ou JNA (1) Saut si « inférieur ou égal » (si CF + ZF = 1)
JC Saut en cas de retenue (si CF = 1)
JE ou JZ Saut si « égal » ou « nul » (si ZF = 1)
JG ou JNLE (2) Saut si « plus grand » (si (SF ⊕ OF) + ZF = 0)
JGE ou JNL (2) Saut si « plus grand ou égal » (si SF ⊕ OF = 0)
JL ou JNGE (2) Saut si « plus petit » (si SF ⊕ OF = 1)
JLE ou JNG (2) Saut si « plus petit ou égal » (si (SF ⊕ OF) + ZF = 1)
JNC Saut si « pas de retenue » (si CF = 0)
JNE ou JNZ Saut si « non égal » ou « non nul » (si (ZF = 0)
JNO Saut si « pas de dépassement » (si OF = 0)
JNP ou JPO Saut si « parité impaire » (si PF = 0)
JNS Saut si « signe positif » (si SF = 0)
JO Saut si « dépassement » (si OF = 1)
JP ou JPE Saut si « parité paire » (si PF = 1)
JS Saut si « signe négatif » (si SF = 1)
(1)
concerne des nombres non signés.
(2)
concerne des nombres signés.