Vous êtes sur la page 1sur 88

Chapitre 2

Architecture et fonctionnement d’un


microprocesseur

2.1 Structure d’un calculateur


unité centrale de traitement (UCT)

horloge registres

unité monde extérieur


unité unité
unité arithmétique (périphériques,
de d'entrées/
de contrôle et logique capteurs,
transfert sorties
(UAL) actionneurs, ...)

: ordre ou commande mémoire


centrale
: données

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.

2.2 Organisation de la mémoire centrale

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

contenu C6H 0002H


des cases
mémoire 05H 0001H

3EH 0000H

largeur des cases mémoire :


en général 1 octet (8 bits)
= unité d'adressage

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 :

• le bus d’adresses permet au microprocesseur de spécifier l’adresse de la case


mémoire à lire ou à écrire ;

• le bus de données permet les transferts entre le microprocesseur et la mémoire ou


les E/S ;

• le bus de commande transmet les ordres de lecture et d’écriture de la mémoire et


des E/S.
périphériques

microprocesseur mémoire E/S


largeur du bus
(nombre de bits
en parallèle)
8
bus de données
16
bus d'adresses

bus de commande

Remarque : les bus de données et de commande sont bidirectionnels, le bus d’adresse


est unidirectionnel : seul le microprocesseur peut délivrer des adresses (il existe une
dérogation pour les circuits d’accès direct à la mémoire, DMA).
2.4 Description matérielle d’un microprocesseur
Un microprocesseur se présente sous la forme d’un circuit intégré muni d’un nombre
généralement important de broches. Exemples :
• Intel 8085, 8086, Zilog Z80 : 40 broches, DIP (Dual In-line Package) ;
• Motorola 68000 : 64 broches, DIP ;
• Intel 80386 : 196 broches, PGA (Pin Grid Array).
Technologies de fabrication : NMOS, PMOS, CMOS.
On peut représenter un microprocesseur par son schéma fonctionnel :

alimentation

horloge n bits
bus d'adresses
reset

p bits
microprocesseur bus de données

signaux de
commande du
microprocesseur bus de commande

2.5 Fonctionnement d’un microprocesseur


Un microprocesseur exécute un programme. Le programme est une suite d’instructions
stockées dans la mémoire. Une instruction peut être codée sur un ou plusieurs octets.
Format d’une instruction :

opération à effectuer opérande 1 , opérande 2

données traitées par l'opération

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

Remarque : la valeur initiale du pointeur d’instruction est fixée par le constructeur


du microprocesseur. Elle vaut une valeur bien définie à chaque mise sous tension du
microprocesseur ou bien lors d’une remise à zéro (reset).
Pour savoir quel type d’opération doit être exécuté (addition, soustraction, ...), le mi-
croprocesseur lit le premier octet de l’instruction pointée par le pointeur d’instruction
(code opératoire) et le range dans un registre appelé registre d’instruction. Le code
opératoire est décodé par des circuits de décodage contenus dans le microprocesseur. Des
signaux de commande pour l’UAL sont produits en fonction de l’opération demandée qui
est alors exécutée.
Remarque : pour exécuter une instruction, l’UAL utilise des registres de travail,
exemple : l’accumulateur, registre temporaire recevant des données intermédiaires.
Pendant que l’instruction est décodée, le pointeur d’instruction est incrémenté de façon à
pointer vers l’instruction suivante :
pointeur
d'instruction
3A2DH instruction n+1 3A2DH
opérande p 3A2CH

3A2BH instruction n 3A2BH

puis le processus de lecture et de décodage des instructions recommence.


A la suite de chaque instruction, un registre du microprocesseur est actualisé en fonction
du dernier résultat : c’est le registre d’état du microprocesseur. Chacun des bits du
registre d’état est un indicateur d’état ou flag (drapeau).
Exemple : registre d’état du microprocesseur Z80 :
7 6 5 4 3 2 1 0

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

3.1 Mémoires ROM et RAM


On distingue deux types de mémoires :
• les mémoires vives (RAM : Random Access Memory) ou mémoires volatiles. Elles
perdent leur contenu en cas de coupure d’alimentation. Elles sont utilisées pour
stocker temporairement des données et des programmes. Elles peuvent être lues et
écrites par le microprocesseur ;
• les mémoires mortes (ROM : Read Only Memory) ou mémoires non volatiles.
Elles conservent leur contenu en cas de coupure d’alimentation. Elles ne peuvent
être que lues par le microprocesseur (pas de possibilité d’écriture). On les utilise
pour stocker des données et des programmes de manière définitive.
Les mémoires sont caractérisées par leur capacité : nombre total de cases mémoire conte-
nues dans un même boı̂tier.

3.2 Schéma fonctionnel d’une mémoire

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)

Le nombre de lignes d’adresses dépend de la capacité de la mémoire : n lignes d’adresses


permettent d’adresser 2n cases mémoire : 8 bits d’adresses permettent d’adresser 256 oc-
tets, 16 bits d’adresses permettent d’adresser 65536 octets (= 64 Ko), ...
Exemple : mémoire RAM 6264, capacité = 8K × 8 bits : 13 broches d’adresses A0 à A12,
213 = 8192 = 8 Ko.

3.3 Interfaçage microprocesseur/mémoire


microprocesseur mémoire
D0 D0 A0
D1 D1 A1
données A2

D7 D7
An-1

RD RD
commandes
WR WR
CS

A0
A1
adresses A2

An-1

Représentation condensée (plus pratique) :

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 :

une période d'horloge

horloge

temps d'établissement de l'adresse


adresse stable

bus
adresse sur le bus (0 ou 1)
d'adresses

lecture interdite lecture autorisée

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

bus de donnée sur le bus


données
pallier
de sécurité

commande
de lecture écriture autorisée

3.5 Connexion de plusieurs boı̂tiers mémoire sur le


bus d’un microprocesseur

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

3.6 Décodage d’adresses


Les trois bits A13, A14 et A15 utilisés précédemment fournissent en fait 8 combinaisons,
de 000 à 111, d’où la possibilité de connecter jusqu’à 8 boı̂tiers mémoire de 8 Ko sur le
bus. La mémoire totale implantée devient donc de 8 × 8 Ko = 64 Ko : valeur maximale
possible avec 16 bits d’adresses.
Pour cela, il faut utiliser un circuit de décodage d’adresses, dans ce cas : un décodeur
3 vers 8.

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

Le mapping de la mémoire devient ainsi :

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

3.7 Classification des mémoires


Jusqu’à la fin des années 1970, on utilisait des mémoires à tores magnétiques, lentes et
de faibles capacités. Actuellement, on n’utilise plus que des mémoires à semiconducteurs.

mémoires à semiconducteurs

mémoires mortes mémoires vives

ROM PROM EPROM EEPROM DRAM SRAM


Mémoires mortes :
• ROM : Read Only Memory. Mémoire à lecture seule, sans écriture. Son contenu
est programmé une fois pour toutes par le constructeur. Avantage : faible coût.
Inconvénient : nécessite une production en très grande quantité.
• PROM : Programmable Read Only Memory. ROM programmable une seule fois par
l’utilisateur (ROM OTP : One Time Programming) en faisant sauter des fusibles.
Nécessite un programmateur spécialisé : application d’une tension de programmation
(21 ou 25 V) pendant 20 ms.
• EPROM : Erasable PROM, appelée aussi UVPROM. ROM programmable électri-
quement avec un programmateur et effaçable par exposition à un rayonnement ultra-
violet pendant 30 minutes. Famille 27nnn, exemple : 2764 (8 Ko), 27256 (32 Ko).
Avantage : reprogrammable par l’utilisateur.
• EEPROM : Electrically Erasable PROM. ROM programmable et effaçable électri-
quement. Lecture à vitesse normale (≤ 100 ns). Ecriture (= effacement) très lente
(≈ 10 ms). Application : les EEPROM contiennent des données qui peuvent être
modifiées de temps en temps, exemple : paramètres de configuration des ordinateurs.
Avantage : programmation sans extraction de la carte et sans programmateur. In-
convénient : coût élevé.
Mémoires vives :
• SRAM : Static Random Access Memory. Mémoire statique à accès aléatoire, à base
de bascules à semiconducteurs à deux états (bascules RS). Famille 62nnn, exemple :
62128 (16 Ko). Avantage : très rapide, simple d’utilisation. Inconvénient : compliqué
à réaliser.
• DRAM : Dynamic RAM. Basée sur la charge de condensateurs : condensateur
chargé = 1, condensateur déchargé = 0. Avantage : intégration élevée, faible coût.
Inconvénient : nécessite un rafraı̂chissement périodique à cause du courant de fuite
des condensateurs. Application : réalisation de la mémoire vive des ordinateurs
(barettes mémoire SIMM : Single In-line Memory module).
Chapitre 4

Le microprocesseur Intel 8086

4.1 Description physique du 8086


Le microprocesseur Intel 8086 est un microprocesseur 16 bits, apparu en 1978. C’est
le premier microprocesseur 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 :
GND 1 40 VCC
AD14 2 39 AD15
AD13 3 38 A16/S3
AD12 4 37 A17/S4
AD11 5 36 A18/S5
AD10 6 8086 35 A19/S6
(mode
AD9 7 34 BHE/S7 maximum)
AD8 8 33 MN/MX
AD7 9 32 RD
AD6 10 31 HOLD (RQ/GT0)
AD5 11 30 HLDA (RQ/GT1)
AD4 12 29 WR (LOCK)
AD3 13 28 M/IO (S2)
AD2 14 27 DT/R (S1)
AD1 15 26 DEN (S0)
AD0 16 25 ALE (QS0)
NMI 17 24 INTA (QS1)
INTR 18 23 TEST
CLK 19 22 READY
GND 20 21 RESET
4.2 Schéma fonctionnel du 8086
alimentation
VCC GND

horloge CLK A19

RESET A16 bus


d'adresses/
READY AD15
contrôle du données
microprocesseur MN/MX
8086 AD0
TEST
WR

RD
INTA

interruptions NMI M/IO


signaux
INTR ALE
de contrôle
BHE

DEN
HOLD
DMA DT/R
HLDA
S0 signaux
d'état
S7

4.3 Description et utilisation 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.

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.

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.

MN/MX : entrée de choix du mode de fonctionnement du microprocesseur :

• mode minimum (MN/MX = 1) : le 8086 fonctionne de manière autonome, il génère


lui-même le bus de commande (RD, WR, ...) ;

• mode maximum (MN/MX = 0) : ces signaux de commande sont produits par un


contrôleur de bus, le 8288. Ce mode permet de réaliser des systèmes multiproces-
seurs.

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 :


1 cycle de bus

T1 T2 T3 T4 T1 T2 T3 T4

CLK

ADi adresse donnée adresse donnée

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

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 :
• DT/R = 1 : données émises par le microprocesseur (écriture) ;
• DT/R = 0 : données reçues par le microprocesseur (lecture).
1 cycle de bus

T1 T2 T3 T4

CLK

ADi adresse donnée

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 :

bus d'adresses A1 - A19

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

bus de données D0 - D15


Création du bus système du 8086 :

CLK BHE/S7 8282 BHE


A19/S6 A19
8284 D Q
RESET
A16/S3 A16
READY STR
AD0
AD15

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

4.4 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).
8 bits 8 bits
AH AL = AX
16 bits
registres BH BL = BX
16 bits
généraux CH CL = CX DS
DH DL = DX SS registres
SI CS de segments
pointeurs DI ES
et index SP IP pointeur d'instruction
BP

bus de données bus externe A/D


interne 16 génération multiplexé
d'adresses +
et contrôle bus de
de bus contrôle

registres 1
temporaires 2
file d'attente
3 des instructions
4 (6 octets)
5
6
commandes
de l'unité
UAL
d'exécution

indicateurs

UNITE D'EXECUTION (EU) UNITE D'INTERFACE DE BUS (BIU)

Rôle des deux unités :


• 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, d’où une accélération du processus d’exécution
d’un programme (fonctionnement selon le principe du pipe-line).
Le microprocesseur 8086 contient 14 registres répartis en 4 groupes :
• Registres généraux : 4 registres sur 16 bits.
AX = (AH,AL) ;
BX = (BH,BL) ;
CX = (CH,CL) ;
DX = (DH,DL).
Ils peuvent être également considérés comme 8 registres sur 8 bits. Ils servent à conte-
nir temporairement des données. Ce sont des registres généraux mais ils peuvent
être utilisés pour des opérations particulières. Exemple : AX = accumulateur, CX
= compteur.
• Registres de pointeurs et d’index : 4 registres sur 16 bits.
Pointeurs :
SP : Stack Pointer, pointeur de pile (la pile est une zone de sauvegarde de
données en cours d’exécution d’un programme) ;
BP : Base Pointer, pointeur de base, utilisé pour adresser des données sur
la pile.
Index :
SI : Source Index ;
DI : Destination Index.
Ils sont utilisés pour les transferts de chaı̂nes d’octets entre deux zones
mémoire.
Les pointeurs et les index contiennent des adresses de cases mémoire.
• Pointeur d’instruction et indicateurs (flags) : 2 registres sur 16 bits.
Pointeur d’instruction : IP, contient l’adresse de la prochaine instruction à
exécuter.
Flags :
O D I T S Z A P C
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CF : indicateur de retenue (carry) ;
PF : indicateur de parité ;
AF : indicateur de retenue auxiliaire ;
ZF : indicateur de zéro ;
SF : indicateur de signe ;
TF : indicateur d’exécution pas à pas (trap) ;
IF : indicateur d’autorisation d’interruption ;
DF : indicateur de décrémentation ;
OF : indicateur de dépassement (overflow).
• Registres de segments : 4 registres sur 16 bits.
CS : Code Segment, registre de segment de code ;
DS : Data Segment, registre de segment de données ;
SS : Stack Segment, registre de segment de pile ;
ES : Extra Segment, registre de segment supplémentaire pour les données ;
Les registres de segments, associés aux pointeurs et aux index, permettent au mi-
croprocesseur 8086 d’adresser l’ensemble de la mémoire.

4.5 Gestion de la mémoire par le 8086


L’espace mémoire adressable par le 8086 est de 220 = 1 048 576 octets = 1 Mo (20 bits
d’adresses). Cet espace est divisé en segments. Un segment est une zone mémoire de
64 Ko (65 536 octets) définie par son adresse de départ qui doit être un multiple de 16.
Dans une telle adresse, les 4 bits de poids faible sont à zéro. On peut donc représenter
l’adresse d’un segment avec seulement ses 16 bits de poids fort, les 4 bits de poids faible
étant implicitement à 0.
Pour désigner une case mémoire parmi les 216 = 65 536 contenues dans un segment, il
suffit d’une valeur sur 16 bits.
Ainsi, une case mémoire est repérée par le 8086 au moyen de deux quantités sur 16 bits :
• l’adresse d’un segment ;
• un déplacement ou offset (appelé aussi adresse effective) dans ce segment.
Cette méthode de gestion de la mémoire est appelée segmentation de la mémoire.

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

le microprocesseur, noté aussi M.P.U. (Microprocessor unit) ou encore


C.P.U. (Central Processing Unit) est un circuit intégré complexe
appartenant à la famille des VLSI (Very large scale intégration) capable
d'effectuer séquentiellement et automatiquement des suites
d'opérations élémentaires.

Son rôle

Ce circuit remplit deux fonctions essentielles :

le traitement des données


On parle d'unité de traitement. Cette fonction est dédiée à l'U.A.L.
Elle concerne la manipulation des données sous formes de transfert,
opérations arithmétiques, opérations logiques....

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 :

La notion de puissance est la capacité de traiter un grand nombre


d'opérations par seconde sur de grands nombres et en grande quantité.

Intrinsèquement la puissance se joue donc sur les trois critères suivants:

La longueur des mots : données et instructions (on parle de


largeur du bus des données).

Le nombre d'octets que le microprocesseur peut adresser (on


parle de largeur du bus des adresses).

La vitesse d'exécution des instructions liée à la fréquence de


fonctionnement de l'horloge de synchronisation exprimée en MHZ.

l'aspect dimensionnel renseigne assez bien de la puissance du composant.


SCHEMA FONCTIONNEL D'UN MICROPROCESSEUR
(8bits)

On distingue 3 éléments logiques principaux :

❐ Une Unité Arithmétique et Logique (U.A.L.)


❐ Un Accumulateur.
et
❐ Des registres que l'on nomme couramment :
Le Compteur d'Instructions (C.I.)
Le Registre d'état
Le Registre d'Instructions (R.I.)
Le Registre d'Adresses (R.A.)
Le Registre temporaire des données

De base, il existe 6 registres fondamentaux dans une architecture de


microprocesseur 8 bits.

(Des registres supplémentaires sont ajoutés pour rendre la vie plus facile
aux programmeurs)

Cet ensemble est interconnecté au travers de différents bus.

On trouve trois types de bus :

❐ Le bus des données (bi-directionnel)


❐ Le bus des adresses (uni-directionnel)
❐ Le bus de contrôle (bi-directionnel)

Remarquer le bus interne de données qui relie tous les différents


éléments du micro-processeur.
L'Unité Arithmétique et Logique

Son rôle :

Ce circuit permet de traiter et tester les données.

Toute instruction qui modifie une donnée fait toujours appel à l'UAL.

L'entrée de L'UAL est connectée au bus interne via


p des registres "temporaires"
p un registre particulier appelé "accumulateur".

La sortie de l'UAL est connectée uniquement à l'entrée de


l'accumulateur.

Noter :

les deux entrées sont précédées par une mémoire tampon.


On les appelle encore des registres tampons ou verrou.

Ces registres permettent de stocker des octets aux entrées de l'U.A.L.


L'UAL étant constitué d'une logique combinatoire, elle est dépourvue de
moyen propre de stockage.

Ce type de registre ne peut être manipulé par le programmeur. Il lui est


totalement transparent.
L'accumulateur

C'est le registre le plus important du microprocesseur, il sert


systématiquement lorsque le µp a besoin de "manipuler" des données.

La plupart des opérations logiques et arithmétiques sur les données font


appel au couple "UAL - accumulateur" selon la procédure suivante:

accumulateur

alu

}
contenu initial accumulateur
perdu!
registre

mémoire

Il en est de même pour les déplacements et transferts des données d'un


endroit à un autre comme :
de mémoire à mémoire.
de mémoire à unités d'entrée-sortie (I/O).

Cette action se fait en deux temps :


source vers Accumulateur et ensuite Accumulateur vers destination.

Les instructions supportées par un accumulateur sont très nombreuses.


Au niveau de la programmation, il représente une grande souplesse
d'utilisation!

Les autres registres ne permettent que des opérations limitées.

Certains microprocesseur, possèdent des accumulateurs de longueur


double tel D chez Motorola et HL chez Intel - dissociés en deux et
généralement baptisés individuellement A et B ou H et L respectivement.

Gros avantage présenté par un µp possédant plusieurs accumulateurs : les


opérations logiques et arithmétiques se font entre accumulateurs limitant
ainsi les accès (transferts) avec l'extérieur.
Le Compteur d'Instructions

Appelé encore Compteur Programme (P.C.) ou Compteur Ordinal (C.O.)

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.

le P.C. "repère" le premier octet de chaque instruction du programme.

La taille du PC a une longueur de 16 bits ce qui lui permet d'adresser


65536 adresses mémoire soit 64 k octets (le champ mémoire).

Notons qu'il est connecté au bus interne des données.

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).

Le contenu des cases mémoires ($FFFE-$FFFF) représente en général


l'adresse où se trouve le premier octet de la première instruction du
programme.

$FFFE adresse haute


$FFFF adresse basse

Cette adresse est transmise aux circuits mémoires par l'intermédiaire du


bus d'adresse via le Registre d'Adresses.
! Le P.C. pointe toujours l'adresse du début de l'instruction suivante.
(A retenir, car parfois il est utile de connaître l'adresse présente.)
Il est possible de recharger le [P.C.] avec une adresse qui ne correspond
pas au déroulement séquentiel du programme.
On trouve les détournements conditionnel et inconditionnel.
Le registre d'adresses

Son rôle :

Le Registre d'adresses ou (R.A.) sert d'interface entre le bus des


données interne et le bus des adresses.

Il "pilote" le bus d'adresses du microprocesseur.

Commentaires :

D'une longueur de 16 bits, il est constitué de deux registres 8 bits


(partie haute et partie basse).

Son contenu provient de différentes sources :


Le Compteur d'instruction
Un registre général
Un emplacement mémoire

Le contenu du registre d'adresse pointe la zone mémoire utile au


microprocesseur.

! 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).

Cette nouvelle valeur provient soit...


d'une lecture en mémoire (directement ou
indirectement selon les modes d'adressage utililés)
d'un calcul (addition, ...)
Le Registre d'instructions

Sa tâche

Le registre d'instructions contient le premier octet de l'instruction en


cours d'exécution.

Commentaires :

Le registre est chargé pendant le cycle de base extraction-exécution.

Il reçoit l'information (octet) grâce au bus de données auquel il est


connecté.

L'information qu'il "capture" sur le bus des données est utilisé par le
décodeur d'instructions. Suivant le protocole ci-dessous :

La donnée extraite de la mémoire est stockée dans le R.I. (c'est la phase


extraction).

Ensuite ce contenu est interprété par le décodeur d'instructions qui agit


alors sur la logique de contrôle (c'est la phase exécution).

Cet octet indique au microprocesseur deux choses :


Une action (une lecture, une écriture ou autre ...)
Un lieu d'action (un registre, un accumulateur, une case
mémoire...)

Le résultat de cette interprétation se traduit par des niveaux logiques


sur le bus de contrôle.
Le registre d'état

L'existence de ce registre permet de distinguer le simple calculateur du


véritable ordinateur.

Son rôle

Stocker les résultats des tests effectués par l'U.A.L. après traitement
sur les données

Commentaires :

L'existence de ces résultats permet d'écrire des programmes avec des


branchements conditionnels (nouvelle adresse dans le C.I.).

En fonction de l'état des bits de ce registre le microprocesseur peut,


alors, exécuter des programmes différents.

le microprocesseur prend en quelque sorte des "décisions".

Les bits les plus couramment utilisés sont :

a- Le bit de retenue

Ce bit est dans l'état actif lorsque le huitième bit du résultat de


l'opération génére une 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

Information qui indique que le bit le plus significatif (MSB) du contenu de


l'accumulateur est un 1 logique.
Exemples d'application

Pour une soustraction - Selon les règles de l'arithmétique du complément


à 2 cela signifie que le nombre est négatif.

Ces 3 bits de base sont parfois complétés par des bits supplémentaires
choisis par le constructeur.
Les registres généraux

En plus des 6 registres de base que possèdent tous les microprocesseurs


8 bits, il peut en exister d'autres destinés à faciliter la tâche du
programmeur. On les nomme registres généraux.

Sur notre schéma fonctionnel type, nous avons 3 registres généraux B, C


et D.

Ce ne sont pas des registres puissants (tel un accumulateur) puisqu'ils


n'ont pas de liaison directe avec la sortie de l'U.A.L.
Ces registres peuvent néanmoins affecter le Registre d'Etat.

Parfois, ils peuvent constituer un registre 16 bits - appelé paire de


registre (ex : BC chez Intel ou D chez Motorola). Ainsi, il est possible de
réaliser des opérations sur un mot (ex : incrémentation de la paire).
La logique de contrôle

Appelé encore Séquenceur ou Unité de contrôle (U.C.)

Son rôle :

Permet à tous les éléments constitutifs du microprocesseur de travailler


ensemble et dans l'ordre.

Commentaires :

La logique de contrôle est pilotée par le Registre d'Instruction via le


décodeur d'instruction.

Cette unité joue en quelque sorte un rôle d'intendance puisqu'elle décide


de la disponibilité du bus à tel ou tel élément logique.

La logique de contrôle possède une architecture complexe et très


spécialisée. L'élément central est représenté par le décodeur
d'instructions qui décode les informations (premier octet) stockées dans
le R.I. pour générer les signaux nécessaires à l'exécution de l'instruction
.

La logique de contrôle génère sur les lignes de contrôle des niveaux


logiques qui activent les différents circuits environnant tels que
mémoires et circuits I/O.

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 :

Cette unité assure :

le contrôle de mise sous tension du microprocesseur


(initialisation des registres).
le traitement des interruptions.

Qu'est-ce qu'une interruption ?

Disons pour l'instant, que c'est une requête présentée à la logique de


contrôle par des éléments extérieurs (périphériques).
2.1 LA SEGMENTATION DE LA MEMOIRE
Le 8086 possède 20 bits d'adresse, il peut donc adresser 220 octets soit 1 Mo.
L'adresse de la première case mémoire est 0000 0000 0000 0000 0000 celle de la dernière
casse est 1111 1111 1111 1111 1111 1111. Il me paraît inutile de justifier pourquoi à
partir de cet instant, nous allons représenter les adresses en hexadécimal, et notre 8086
peut donc adresser 1 Mo allant de 00000 à FFFFF. Le problème qui se pose est comment
représenter ces adresses au sein du µP puisque les registres ne font que 16 bits soit 4
digits au maximum en hexadécimal. 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 pages de 64 ko appelés segments. On utilise
alors deux registres pour adresser une case mémoire donnée, Un registre pour adresser le
segment qu'on appelle registre segment et un 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
A titre d'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 de


segment
Segment 0 00000 0FFFF 00000
Segment 1 10000 1FFFF 10000
Segment 2 20000 2FFFF 20000

Segment 14 E0000 EFFFF E0000


Segment 15 F0000 FFFFF F0000

Considérons la case mémoire d'adresse 20350, appelée adresse absolue ou adresse


linéaire. Cette case mémoire se situe dans le segment 2, son adresse relative à ce
segment est 350, on peut donc la référencer par le couple segment:offset = 20000:350,
Se pose maintenant le problème de la représentation de cette adresse au sein du CPU
car les registres de 16 bits ne peuvent contenir que 4 digits. S'il n'y a aucun problème
pour représenter 350 dans un registre d'offset, on ne peut pas représenter 20000 dans un
registre segment. La solution adoptée par Intel est la suivante :
 Dans le registre segment, on écrit l'adresse segment sans le chiffre de faible poids
 Dans le registre d'adressage (d'offset) on écrit l'adresse relative dans le segment
 Pour calculer l'adresse absolue qui sera envoyée sur le bus d'adresse de 20 bits, le
CPU procède à l'addition des deux registres après avoir décalé le registre segment
d'un chiffre à gauche :

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.

Adresse absolue valide segment


pour début de segment
00000 0000
00010 0001
00020 0002
... ...

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

2.2 LES REGISTRES DU 8086

Registres généraux Registres d'adressage Registres de segment Registres de commande

AX AH AL SP CS IP
BX BH BL BP DS FLAGS
CX CH CL SI SS
DX DH DL DI ES

Fig. 2.4 : les registres du 8086

Tous les registres et le bus interne du 8086 sont structurés en 16 bits.


Vu de l'utilisateur, le 8086 comprend 3 groupes de 4 registres de 16 bits, un registre
d'état de 9 bits et un compteur programme de 16 bits non accessible par l'utilisateur.

2.2.1 Les registres généraux


Les registres généraux participent aux opérations arithmétiques et logiques ainsi qu'à
l'adressage. Chaque demi-registre est accessible comme registre de 8 bits, le 8086 peut
donc effectuer des opérations 8 bits d'une façon compatible avec le 8080.
AX : Accumulateur
 Usage général,
 Obligatoire pour la multiplication et la division,
 Ne peut pas servir pour l'adressage

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

2.2.2 Les registres d'adressage (offset)


Ces registres de 16 bits permettent l'adressage d'un opérande à l'intérieur d'un
segment de 64 ko (216 positions mémoires)

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

SI : Registre d'index (source)


 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
source. L'opérande destination étant indexé par DI
 Usage général

DI : 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

2.2.3 Les registres de segment


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

2.2.4 Format d’une adresse


Rien Valeur 
 DS BX 

Une adresse doit avoir la forme [Rs : Ro] avec les possibilités  ES : BP 
 
 CS SI 
 ES DI 

Si le registre segment n’est pas spécifié (cas rien), alors le processeur l’ajoute par défaut
selon l’offset choisit :

Offset utilisé Valeur DI SI BX BP


Registre Segment par défaut
DS SS
qui sera utilisé par le CPU
Tableau 2.1 : segment par défaut

Dans la suite de ce cours, On accèdera souvent à la mémoire


en précisant seulement la partie offset de l'adresse. Par
défaut on considère qu'on est dans le segment DATA
2.2.5 Le registre d'état (flags)
15 2 1 0
O D I T S Z A P C

Six bits reflètent les résultats d'une opération arithmétique ou logique et 3 participent
au control du processeur.

 C : (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.

 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.

 I : (Interruption) autorise ou non la reconnaissance des interruptions


I = 0  Interruptions autorisées
I = 1  Interruptions non autorisées

 D : (Direction) fixe la direction de l'auto-inc/décrémentation de SI et DI lors des


instruction de manipulation de chaînes.
D = 0  Incrémentation des index
D = 1  décrémentation des index

 O : (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)
2.3 LES MODES D'ADRESSAGE

Dans la suite on utilisera les abréviations suivantes :

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

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

 Adressage registre (R)


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

Exemples :
INC AX : incrémenter le registre AX
MOV AX, BX : Copier le contenu de BX dans AX

 Adressage Immédiat (IM)


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

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'

 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 [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

 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é (voir Tableau 2.1)

INST R , [Rseg : Roff]


INST [Rseg : Roff] , R
INST taille [Rseg : Roff] , im

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

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é,

 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 [Rseg : Rb+dep] , R
INST taille [Rseg : Rb+dep] , im
Exemples :
MOV AX, [BX] : Charger AX par le contenu de la mémoire d'adresse DS:BX
MOV AX, [BX+5] : Charger AX par le contenu de la mémoire d'adresse DS:BX+5
MOV AX, [BP-200] : Charger AX par le contenu de la mémoire d'adresse SS:BX-200
MOV AX, [ES:BP] : Charger AX par le contenu de la mémoire d'adresse ES:BP

 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 [Rseg : Ri+dep] , R
INST taille [Rseg : Ri+dep] , im

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

 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 [Rseg : Rb+Ri+dep] , R
INST taille [Rseg : Rb+Ri+dep] , im

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

2.4 TAILLE DES ECHANGES AVEC LA MEMOIRE


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 donne  adresse AL


Si le registre est un registre double (2 octets), l’opération se fera avec deux cases
mémoires

MOV [adresse], AX donne  adresse AL


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],4Ah ; On écrit 4A dans la position adresse


adresse 4A

MOV WORD [adresse],4Ah ; On écrit 004A, 4A  adresse, et 00  adresse+1

adresse 4A
00

Exercice 2) (ram.asm) : tracer le programme ci-dessous


mov bx,4000h ; adresse
mov ax,2233h
mov [bx],ax
mov word [bx+2],4455h
mov byte [bx+4],66
mov byte [bx+5],77
Afficher la ram en hexadécimal à partir de la position 4000H
Afficher la ram en décimal à partir de la position 4000H
2.5 LES INSTRUCTIONS DU 8086

2.5.1 Les instructions de transfert

MOV Od , Os
Copie l'opérande Source dans l'opérande Destination

MOV R1 , R2 copier un registre dans un autre


MOV R,M copier le contenu d’une case mémoire dans un registre
MOV M,R copier un register dans une case mémoire
MOV R , im copier une constante dans un registre
MOV taille M , im copier une constante dans une case mémoire
(taille = BYTE ou WORD)
MOV M , M

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)

- Copie les deux cases mémoire pointée par SP dans l'opérande Op


- Incrémente SP de 2

POP R16 POP R8


POP word M

L'exemple de la figure 2.4 illustre plusieurs situations :

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

(a) (b) (c) (d)


Fig. 2.5 : 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
(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.

Exercice 3) : (pile.asm) : tracer le programme ci-dessous. La valeur initiale de SP est


quelconque
mov ax,2233h
push ax
mov ax,4455h
push ax
mov ax,6677h
push ax
mov bp,sp
mov al,[bp+3]
mov bx,[bp+1]

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 [ ] , [ ]

2.5.2 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).

 Addition :

ADD Od , Os Additionne l'opérande source et l'opérande destination avec résultat dans


l'opérande destination,
Od + Os  Od
ADD AX,123 ADD AX,BX ADD [123],AX ADD BX,[SI]

ADC Od , Os Additionne l'opérande source, l'opérande destination et le curry avec


résultat dans l'opérande destination,
Od + Os + C  Od

INC Op Incrémente l'opérande Op


Op + 1  Op
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 [ ]
INC word [ ]

Exercice 4) :

En partant à chaque fois de la situation illustrée à droite. Quelle est la


situation après chacune des instructions suivantes 4000h 25h
33h
INC byte [4000h]

INC word [4000h]

En partant à chaque fois de la situation illustrée à droite. Quelle est la


situation après chacune des instructions suivantes 4000h FFh
33h
INC byte [4000h]

INC word [4000h]

 Soustraction

SUB Od , Os Soustrait l'opérande source et l'opérande destination avec résultat dans


l'opérande destination.
Od - Os  Od

SBB Od , Os Soustrait l'opérande source et le curry de l'opérande destination avec


résultat dans l'opérande destination.
Od - Os - C  Od
DEC Op Décrémente l'opérande Op
Op - 1  Op

NEG Op Donne le complément à 2 de l'opérande Op : remplace Op par son négatif


Cà2(Op)  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é

 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).

MUL Op8  AL x Op8 → AX


MUL Op16  AX x Op16 → 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

MUL im MUL AX,R MUL AX, im

 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

Exercice 5) : (mul.asm) Tracer le programme ci-dessous en indiquant à chaque fois la


valeur des indicateurs C et O

mov al,64h
mov bl,2
mul bl
mov al,64h
mov cl,3
mul cl

IMUL Op (Integer Multiply ) Identique à MUL excepté qu'une multiplication signée


est effectuée.

Exercice 6) (imul.asm) : différence entre MUL et IMUL


Tracer le programme ci-dessous
MOV al,11111111b
mov bl,00000010b
mul bl
MOV al,11111111b
mov bl,00000010b
imul bl

 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, exemple : DIV byte [adresse] ou DIV
word [adresse]. AX Op8
AH AL
DIV Op8 ;AX / Op8 , Quotient → AL , Reste → AH

DIV S16 ;DX:AX / S16 , Quotient → AX , Reste → DX Op16


DX:AX
DX AX
- S ne peut pas être une donnée (immédiat) DIV 125h
- Après la division L'état des indicateurs est indéfini
- La division par 0 déclenche une erreur

IDIV Op Identique à DIV mais effectue une division signée

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

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

2.5.3 Les instructions logiques

NOT Op Complément à 1 de l'opérande Op

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

Exercice 7) : (logic.asm) Tracer en binaire le programme ci-dessous


MOV AX,125h
AND AL,AH

Exercice 8) : (xor.asm) Programme qui fait AX  BX sans utiliser l’instruction XOR

2.5.4 Les masques logiques :


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

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

Exercice 9) : (masque.asm) Tracer le programme ci-dessous


MOV AX,1A25h
AND AX,F0FFh
2.5.5 Les instructions de décalage
Dans les instructions de décalage, l'opérande k peut être soit une constante
(immédiat) soit le registre CL :
INST AX,1 ; décaler AX de 1 bit
INST BL,4 ; décaler BL de 4 bits
INST BX,CL ; décaler BX de CL bits

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

SHL R/M,k (SHift Logical Left ) décalage logique à gauche de k bits


SAL R/M,k (SHift Arithmé Left) décalage arithmétique à gauche

C MSB LSB

SHR R/M,k (SHift Logical right ) décalage logique à droite

MSB LSB C

SAR R/M,k (SHift Arithmetic right ) décalage arithmétique à droite

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.

ROL R/M,k (Rotate Left ) Rotation à gauche

C MSB LSB

ROR R/M,k (Rotate Right ) Rotation à droite

MSB LSB C

RCL R/M,k (Rotate Through CF Left ) Rotation à gauche à travers le Carry

C MSB LSB
RCR R/M,k (Rotate Through CF Right) Rotation à droite à travers le Carry

MSB LSB C

2.5.6 Instructions agissant sur les indicateurs


15 2 1 0
O D I T S Z A P C

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

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

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

MOV CX,une valeur


ici: XXX xx,yy
XXX xx,yy
…………………………
XXX xx,yy
XXX xx,yy
loop ici
XXX xx,yy

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

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)

2.5.8 Les instructions de branchement


3 types de branchement sont possibles :

 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.

RET Retour de sous programme appelant sous programme


programme. L'exécution -------------
du programme continue à ------------- xxx- - - - - -
la position récupérée dans -------------
---- - -
-------------
la pile. ------------- ---- - -
CALL xxx
---- - -
INT n appel à l’interruption -------------
logicielle n° n ------------- ---- - -
------------- RET
-------------
 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

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

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 15) : (cherche.asm)


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

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

2.5.9 Instructions d'accès aux ports d'E/S

IN AL/AX,port lire un port d’entrée sortie.


IN AL , port ; charge le contenu du port d’adresse port dans AL
IN AX , port ; charge le contenu du port d’adresse port dans AL et le contenu du port
d’adresse port+1 dans AH

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

OUT port , AL/AX Ecriture dans un port d’E/S


L’adressage du port se fait de la même façon que pou IN

Out port , AX ; écrit AL dans port et AH dans port+1


2.6 CE QU’IL NE FAUT PAS FAIRE

Voici une liste non exhaustive de quelques erreurs à éviter

 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 :

MOV [245],[200] INST [ ] , [ ]


ADD [BX],[BP]

 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 :

MOV AX,[SP] MOV BP,SP


MOV AX,[BP]

 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

MOV ES,02F7H MOV BX,02F7h


MOV ES,BX

MOV ES,DS MOV AX,DS


MOV ES,AX

INC ES MOV BX,ES


INC BX
MOV ES,BX

ADD ES,2 MOV BX,ES


ADD BX,2
MOV ES,BX

 On ne peut pas utiliser directement une adresse segment dans une instruction, il faut
passer par un registre segment.

MOV [2A84h : 55],AX MOV BX,2A84h


MOV ES,BX
MOV [ES : 55] , AX

 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

 Le segment et l’offset sont séparé par le caractère ":" et non ","

[DS , BX] [DS : BX]

 On ne peut pas utiliser les opérateurs + - x sur des registre ou des mémoires

MOV AX, BX+2


MOV AX, DX x 2
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)

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 DS+D * * * * * * JL a saut si  (signé)
ADC D , S DS+D+C * * * * * * JLE a saut si  (signé)
INC D DD+1 * * * * * ! JC a saut si C = 1
SUB D,S DD-S * * * * * * JNC a saut si C = 0
SBB D,S DD–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 DD-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, XRst ? ? ? ? ? ? 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.

3.1 LES DIRECTIVES DE NASM


Les directives ne sont pas des instructions du 8086, elles sont destinées à l'assembleur
qui les utilise pour savoir de quelle manière il doit travailler.

 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.

 EQU : Définition de constante

mille EQU 1000

Chaque fois que l'assembleur rencontrera la chaîne mille , il la remplacera par le


nombre 1000 (tout simplement).

 %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 :

 db : (define byte) définit une variable initialisée de 1 octet

 dw : (define word) définit une variable initialisée de 2 octets

 resb : réserve un octet pour une variable non initialisée

 resw : réserve un mot de 2 octets pour une variable non initialisée

3.3 LES EXPRESSIONS


NASM peut évaluer des expressions entre constantes. Les opérateur reconnus sont :

+, - , * : addition, soustraction et multiplication


/ : division non signée
// : division signée
% : modulo non signé
%% : modulo signé
~ : complément logique
& : ET logique
| : OU logique
^ : XOR logique

≪ : 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.

4.1.1 L'interruption 10h du BIOS


Le BIOS est de relativement bas niveau et dépend fortement de la machine.
L'interruption 10h peut effectuer beaucoup de fonctions différentes, le numéro de la
fonction désirée doit être place dans AH avant l'appel de l'interruption. Nous ne parlerons
ici que de quelques fonctions.

 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.

En mode graphique, l'attribut de couleur ne concerne que le caractère ou le pixel, il


n'agit pas sur la couleur de l'arrière plan. Ceci est valable pour les autres fonctions qui
gèrent la couleur.

 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).

Les caractères spéciaux sont reconnus :


- 10 (LF : Line Feed ) descend le curseur d'une ligne
- 13 (CR : Carriage Return ) ramène le curseur en début de lignes
- 08 (BS : Back Space ) ramène le curseur d'une position à gauche
- 07 (BEL) fait bip

mov ah,0Eh ; affiche le caractère A à la position courante du curseur


mov al,'A'
int 10h

 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).

Exercice 17) (affcar.asm)


Programme qui place l'écran en mode texte (3) et affiche le caractère A en vert sur bleu à
la position (l=4,c=10)

Exercice 18) (couleurs.asm)


Programme qui place l'écran en mode texte (3) et affiche les 16 premiers caractères de
l'alphabet, chacun sur une line, chacun répété 40 fois et chacun avec une couleur
différente sur fond noir (on commence avec la couleur 0 et on incrémente).
 Fonction 05
Cette fonction permet de sélectionner la page active de l'affichage.

Paramètres : AH = 05h
AL = numéro de la page

 Fonction 11h, sous fonction 12h


Cette fonction permet de charger le jeu de caractère de hauteur 8 pixels pour avoir un
écran de 50 lignes. (Cette fonction doit être appelée après la fonction 00)
Paramètres
AX = 1112h
BL = 30h (08h semble marcher aussi)

Exercice 19) (diag.asm)


Programme qui place l'écran en mode 50 lignes et affiche ensuite l'alphabet (A … Z) en
Diagonal

 Fonction 0Ch : allumer un pixel

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)

Exercice 20) (pixel.asm)


Programme qui place l'écran en mode graphique 640x480, 16 couleur et allume le pixel de
coordonnées (200,300) en jaune (14)

4.1.2 L'interruption 21h du DOS


Normalement le DOS est de relativement haut niveau et ne dépend pas de la machine.
Il fait souvent appel au bios qui fonctionne à un niveau plus proche de la machine.
L'interruption 21h peut réaliser plusieurs fonctions différentes. Nous ne citerons ici que
celles que nous utiliserons.

 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.

Exercice 21) (getchar.asm)


Programme qui :
- Affiche l'invité 'Veuillez taper un caractère'
- Attend l'entrée d'un caractère au clavier
- Affiche sur la ligne suivante 'Voici le caractère tapé ' suivi du caractère

 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

Chaîne saisie 0Dh


 Fonction 0Ah
Permet de saisir une chaîne de caractère au clavier. La saisie s'arrête quand on tape la
la fonction inscrit ici le la fonction inscrit ici
touche
DX doit , lenombre
caractère CR (13) est mémorisé avec
la chaîne la chaîne
saisie
de caractères
pointer ici effectivement lus suivie de CR
Paramètres :
DX : adresse du buffer (zone mémoire tampon) où seront stockés la longueur de la
chaîne ainsi que la chaîne saisie
[DX] : longueur max. avant d'appeler la fonction, il faut placer dans le premier octet
du buffer la longueur max à ne pas dépasser, 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

Tableau 4.2 : illustration de la fonction 0AH de int 21h

Exercice 22) : (gets.asm)


Programme qui permet de saisir une chaîne de moins de 20 caractères et l'affiche ensuite
en diagonale
Aide mémoire :

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

Pseudo instructions et directives


DB Définir byte X db 123
DW Définir word X dw 1234h
RESB Réserver byte X resb 2
RESW Réserver word X resw 5
EQU Définir constante Port equ 0x378
BITS Générer code de n bits BITS 16
ORG Adresse début programme ORG 0x100 (.com)
SEGMENT Segment de saisie SEGMENT .text
%DEFINE Définir une constante %define x 1000
%INCLUDE Inclure un programme source %include ‘nasmlib.asm’

Opérateur arithmétiques et logique du préproceseur de NASM


+,-,* arithmétique mov ax, (2*x+3)/6
/ Division non signée
// Division signée
% Modulo non signé
%% Modulo signé
~ Complément binaire
& ET binaire
| OU binaire
^ XOR binaire
<< >> Décalage gauche et droite
'' code ascii 'A' = 65
5 CODE MACHINE DES INSTRUCTIONS
Une instruction peut comporter de 1 à 7 octets dont 1 ou 2 octets pour coder
l'opération, les autres servent à définir les opérandes.
Dans le cas le plus général, l’instruction se fait entre un registre et une case mémoire.
Dans le code machine de l’instruction, on trouvera le code de l’opération (CO), le code du
registre utilisé (REG), le code du mode d’adressage utilisé (MOD) et le code permettant de
déterminer l’adresse de la case mémoire (ADR):

 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.

 Le 2ème octet dit Code Opération se présente comme suit :

7 6 5 4 3 2 1 0

CO d w

 CO : C'est le code proprement dit de l'instruction


 d : désigne la destination du résultat
d=0  Résultat dans mémoire ou opération entre 2 registres
d=1  Résultat dans registre

 w : Opération 8 bits ou 16 bits


w=0 8 bits
w=1 16 bits

 Le 3ème octet permet de définir les opérandes

7 6 5 4 3 2 1 0

MOD REG ADR

 MOD : Ce champ de 2 bits nous informe sur le mode d'adressage : registre,


directe ou la nature du déplacement dans les autres cas,

 REG : Ce champ de 3 bits désigne le registre constituant un opérande

 ADR : Ce champs de 3 bits précise l’adresse de l’autre opérande quand il s´agit


d’une position mémoire.

 Pour une opération entre deux registres R  R :


REG = Registre source
ADR = Registre destination

 Les octets suivants concernent :

 Les déplacements sur 8 ou 16 bits utilisés dans le calcul d'adresse


 Les donnés sur 8 ou 16 bits dans le cas de l'adressage immédiat
 ...
5.1 LES CODES REG, ADR ET MOD

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

5.2 TABLEAU DES CODES BINAIRES


AAA 0011 0111
AAD 1101 0101 0000 1010
AAM 1101 0100 0000 1010
AAS 0011 1111
ADC
 R/M  R 0001 00dw MOD REG ADR (Adr ou dep)
 R/M  im 1000 00sw MOD 010 ADR (Adr ou dep) donnée
 AL/AX  im 0001 010w donnée
ADD
 R/M  R 0000 00dw MOD REG ADR (Adr ou dep)
 R/M  im (**) 1000 00sw MOD 000 ADR (Adr ou dep) donnée
 AL/AX  im 0000 010w donnée
AND
 R/M  R 0010 00dw MOD REG ADR (Adr ou dep)
 R/M  im 1000 000w MOD 100 ADR (Adr ou dep) donnée
 Ac  im 0010 010w donnée
BOUND 0110 0010 MOD REG ADR (Adr ou dep)
CALL
 intra segment direct 1110 1000 adresse
 intra segment indirect 1111 1111 MOD 010 ADR (Dep)
 inter segment direct 1001 1010 Adresse Segment
 inter segment indirect
CBW 1001 1000
CLC 1111 1000
CLD 1111 1100
CLI 1111 1010
CMC 1111 0101
CMP
 R/M  R 0011 10dw MOD REG ADR (Adr ou dep)
 R/M  im 1000 00sw MOD 111 ADR (Adr ou dep) donnée
 AL/AX  im 0011 110w Donnée
CMPS 1010 011w
CWD 1001 1001
DAA 0010 0111
DAS 0010 1111
DEC
 R/M 8 bits 1111 111w MOD 001 ADR (Adr ou dep)
 R 16 bits 01001 REG
DIV R/M 1111 011w MOD 110 ADR (Adr ou dep)
ENTER 1100 1000 donnée
EDC
HLT 1111 0100
IDIV R/M 1111 011w MOD 111 ADR (Adr ou dep)
IMUL R/M 1111 011w MOD 101 ADR (Adr ou dep)
IN
 Port défini 1110 010w Port
 Port dans DX 1110 110w
INC
 R/M 8 bits 1111 111w MOD 000 ADR (Adr ou dep)
 R 16 bits 01000 REG
INS 0110 110w
INT 1100 1101 Num. interruption
INTO 1100 1110
IRET 1100 1111
JA 0111 0111 DepRel_8
JAE 0111 0011 DepRel_8
JB 0111 0010 DepRel_8
JBE 0111 0110 DepRel_8
JC 1110 0010 DepRel_8
JCXZ 1110 0011 DepRel_8
JE 0111 0100 DepRel_8
JG 0111 1111 DepRel_8
JGE 0111 1101 DepRel_8
JL 0111 1100 DepRel_8
JLE 0111 1110 DepRel_8
JMP
 intra segment direct 1110 1001 Dep_Relatif_16 (jmp etiq)
 intra segment direct court 1110 1011 Dep_Relatif_8. (jmp short etiq)
 intra segment indirect 1111 1111 MOD 100 ADR
 inter segment direct 1110 1010 Adr. branch.16 SegL SegH
 inter segment indirect 1111 1111 MOD 101 ADR

JNC 0111 0011 DepRel_8


JNE 0111 0101 DepRel_8
JNO 0111 0001 DepRel_8
JNS 0111 1001 DepRel_8
JNP 0111 1011 DepRel_8
JO 0111 0000 DepRel_8
JP 0111 1010 DepRel_8
JS 0111 1000 DepRel_8
LAHF 1001 1111
LDS 1100 0101 MOD REG ADR (Adr ou dep)
LEA 10001101 MOD REG ADR (Adr ou dep)
LEAVE 11001001
LES 1100 0100 MOD REG ADR (Adr ou dep)
LOCK 1111 0000
LODS 1010 110w
LOOP 1110 0010 DepRel_8
LOOPZ 1110 0001 DepRel_8
LOOPNZ 1110 0000 DepRel_8
MOV
 R/M  R 1000 10dw MOD REG ADR (Adr ou dep)
 m  im 1100 011w MOD 000 ADR (Adr ou dep) donnée
 R  im 1011 w REG donée
 AX/AL  M_direct 1010 000w Adresse
 M_direct  AX/AL 1010 001w Adresse
 Rseg  R/M 1000 1110 MOD 0 Rseg ADR (Adr ou dep)
 R/M  Rseg 1000 1100 MOD 0 Rseg ADR (Adr ou dep)
MOVS 1010 010w
MUL R/M 1111 011w MOD 100 ADR (Adr ou dep)
NEG 1111 011w MOD 011 ADR (Adr ou dep)
NOP 1001 0000
NOT 1111 011w MOD 010 ADR (Adr ou dep)
OR
 R/M  R 0000 10dw MOD REG ADR (Adr ou dep)
 R/M  im 1000 000w MOD 001 ADR (Adr ou dep) donnée
 AX/AL  im 0000 110w donnée
OUT
 port défini 1110 011w port
 port dans DX 1110 111w
OUTS 0110 111w
POP
M 1000 1111 MOD 000 ADR (Adr ou dep)
R 0101 1REG
 Rseg 000REG111
POPA (*) 0100 0001
POPF 1001 1101
PUSH
M 1111 1111 MOD 000 ADR (Adr ou dep)
R 01010 REG
 Rseg 000REG110
PUSHA (*) 0110 0000
PUSHF 1001 1100
RCL
 R/M,1 1101 000w MOD 010 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 010 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 010 ADR (Adr ou dep) Donnée_8
RCR
 R/M,1 1101 000w MOD 011 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 011 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 011 ADR (Adr ou dep) Donnée_8
REP/REPZ, REPNZ 1111 001z
RET
 intra segment 1100 0011
 inter segment 1100 1011
ROL
 R/M,1 1101 000w MOD 000 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 000 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 000 ADR (Adr ou dep) Donnée_8
ROR
 R/M,1 1101 000w MOD 001 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 001 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 001 ADR (Adr ou dep) Donnée_8
SAHF 1001 1110
SAL/SHL
 R/M,1 1101 000w MOD 100 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 100 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 100 ADR (Adr ou dep) Donnée_8
SAR
 R/M,1 1101 000w MOD 111 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 111 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 111 ADR (Adr ou dep) Donnée_8
SBB
 R/M  R 0001 10dw MOD REG ADR (Adr ou dep)
 R/M  im 1000 00sw MOD 011 ADR (Adr ou dep) donnée
 AL/AX  im (*) 0001 110w donnée
SCAS 1010 111w
SHR
 R/M,1 1101 000w MOD 101 ADR (Adr ou dep)
 R/M,CL 1101 001w MOD 101 ADR (Adr ou dep)
 R/M,im8 (*) 1100 000w MOD 101 ADR (Adr ou dep) Donnée_8
STC 1111 1001
STD 1111 1101
STI 1111 1011
STOS 1010 101w
SUB
 R/M  R 0010 10dw MOD REG ADR (Adr ou dep)
 M  im (**) 1000 00sw MOD 101 ADR (Adr ou dep) donnée
 R  im (**) 1000 00sw 11 101 REG donnée
 AL/AX  im 0010 110w donnée
TEST
 R/M  R 1000 010w MOD REG ADR (Adr ou dep)
 R/M  im 1111 011w MOD 000 ADR (Adr ou dep) donnée
 AL/AX  im 1010 100w donnée
WAIT 1001 1011
XCHG
 R/M  R 1000 011w MOD REG ADR (Adr ou dep)
 R  AX 10010 REG
XLAT 1101 0111
XOR • R/M  R 0011 00dw MOD REG ADR (Adr ou dep)
 R/M  im 1000 000w MOD 110 ADR (Adr ou dep) donnée
 AL/AX  im 0011 010w donnée
 Les champs entre ( ) sont présents dans le cas de l’adressage direct [aaaa] ou de l’adressage
indirect avec déplacement [R+dep] ou [Rb + Ri + dep]
 Un champ adresse est toujours constitué de 2 octets : AdrL AdrH
 Un champ de donnée peut être de 1 ou de 2 octets selon l’instruction, DL suivie
éventuellement de DH

(*) 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 bx , 56h Mov bl, 56h


R16 ← im16 R8 ← im8
1011 w REG donnée 1011 w REG donnée
1011 1 011 56 00 1011 0 011 56
BB 56 00 B3 56

Mov DX , [123h] Mov AX , BX


R16 ← M R16 ← R16
1000 10dw MOD REG ADR adresse 1000 10dw MOD REG ADR
1000 1011 00 010 110 2301 1000 1001 11 011 000
8B 16 23 01 89 D8

Mov [SI + 146h] , BL Mov [BX+DI + 46h] , CX


M ← R8 M ← R16
1000 10dw MOD REG ADR deplong 1000 10dw MOD REG ADR depcourt
1000 1000 10 011 100 4601 1000 1001 01 001 001 46
88 9C 46 01 89 49 46

mov AX , [3456h] AND BL , 38h


AX ← Mdirect R8 ← im
1010 000w adresse 1000 000w MOD 100 ADR donée
1010 0001 5634 1000 0000 11 100 011 38
A1 56 34 80 E3 38
6 ANNEXE
6.1 INSTRUCTIONS D'AJUSTEMENT DECIMAL
DAA (Decimal Adjust AL after addition )
Instruction sans opérande qui agit sur le registre AL pour obtenir un résultat
BCD après l’addition de deux nombres BCD (avec résultat dans AL). AL est un
registre 8 bits, il ne peut représenter que 2 chiffres BCD, le résultat de
l’addition ne doit pas dépasser 99.
Algorithme : Après l’addition, si le drapeau A est positionné ou si les 4 bits de
poids faible de AL représente un nombre supérieur à 9 alors le processeur
ajoute 6 à AL.
AL + BL AL A AL
ADD AL , BL 03 + 04 → 07 0 DAA  07
DAA 05 + 07 → 0C 0 DAA  12
39 + 28 → 61 1 DAA  67
AAA (ASCII Adjust after Addition )
Instruction similaire à DAA sauf qu’ici, il s’agit de la représentation BCD
étendue pour laquelle chaque chiffre est codé sur 8 bits (unpacked BCD form ).
Ceci facilite la conversion vers l’ ASCII, d’où le nom de l’instruction.
Algoritjme : Si l’addition des deux chiffres dépasse 9, l’instruction AAA recopie
le chiffre des unités dans AL, incrémente AH. Si AH était = 0, on obtient les
dizaines dans AH. Les drapeaux C et A sont positionnés.
Ce qui (d’une façon plus informatique) peut être représenté par :
Si ( LSD(AL)  9 OU A = 1)
AL ← (AL + 6) AND 0Fh
AL ← AH + 1
C ← 1
A ← 1
Sinon
C ← 0
A ← 0
FinSI

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)

AAS (ASCII Adjust after Substraction )


Ajustement décimal de AL après soustraction de deux opérandes BCD au
format étendu (1 chiffre par 8 bits) pour que le résultat soit de même type.
(Voir AAA)

AAM (ASCII Adjust AX after multiply ) Ajustement décimal après multiplication


de deux opérandes BCD au format étendu pour que le résultat soit de
même type. L'opération est faite implicitement sur le registre AX. (voir
AAA)

AAD (ASCII Adjust AX before Division)


Si AX contient un nombre BCD étendu (1 chiffre par 8 bits), cette instruction
effectue un ajustement décimal inverse c.a.d. une conversion BCD vers binaire.
Cette instruction est utile avant une division, car cette dernière se fait en
binaire. Après la division, le quotient présent dans AL peut être convertit en
BCD à l’aide de l’instruction DAA.

Si AX contient la représentation BCDL du nombre décimal 98, soit


AX=0000100100001000. Si on désire faire une division, il faut d'abord convertir
AX en binaire (AAD), réaliser la division (DIV) et convertir ensuite le résultat en
BCD (DAA) :
- AAD donne la représentation de 98 en binaire AX = 0000 0000 0110 0010
- DIV BL (avec BL=8) donne AH=02 = reste, et AL = 0C = quotient
Si on veut que le quotient soit représenté en BCD, on peut utiliser l’instruction
DAA et on obtient AL = 0001 0010 = 12 (BCD)

6.2 LES INSTRUCTIONS DE MANIPULATION DE CHAINES

Les instructions de manipulation de chaînes sont au nombre de 5 :


 MOVS, LODS, STOS sont des instructions de transfert, elles peuvent être répétées
à l'aide du préfix REP
 CMPS et SCAS sont des instructions de comparaisons, elles peuvent être répétées à
l'aide du préfix REPZ

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]

Après chaque opération SI et DI sont automatiquement incrémentés ou décrémentés


selon la valeur de l'indicateur D :
o D = 0  SI et DI sont incrémentés, (voir instruction CLD)
o D = 1  SI et DI sont décrémentés. (Voir instruction STD)
SI et DI sont incrémentés de 1 ou de 2 selon que l'opération s'effectue sur un octet
(byte) ou sur un mot de 16 bits (word).
 MOVS : Copie l'opérande source dans l'opérande destination

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

DATA segment EXTRA segment EXTRA segment EXTRA segment

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

DATA segment EXTRA segment EXTRA segment EXTRA segment

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.

LODSW : Copie le mot source dans AX puis inc/decr de 2 le registre SI

La répétition de cette instruction est sans intérêt.

 STOS
STOSB : Copie AL dans l’octet destination et inc/decr le registre DI.

STOSW : Copie AX dans le mot destination et inc/dec de 2 le registres 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

La répétition de cette instruction permet par exemple la comparaison de deux chaînes


de caractères

Exercice 26) (compstr.asm)


Donner le programme qui compare deux chaînes de 30 caractères situés
respectivement aux adresses 4000h et 6000h et positionne AL comme suit :
AL = 0 si égalité, AL = -1 si différents

 SCAS
SCASB : Compare AL avec l'octet destination, positionne les indicateurs puis
inc/decrémente le registre DI.

SCASW : Compare AX avec le mot destination, positionne les indicateurs puis


inc/dec le registre DI de 2

 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

Exercice 27) (findchar.asm)


Donner le programme qui cherche le caractère 'X' dans la chaîne de 30 caractères
située à l'adresse 4000h du data segment.
- trouvé  DI = adresse
- non trouvé  DI = -1

6.3 INSTRUCTIONS DE TRANSFERT D'ADRESSE

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

Remarquer que l’on serait tenté d’utiliser la syntaxe suivante :


MOV AX, BX+124 ;incorrect car pour réaliser une addition il faut utiliser l’instruction
ADD

LDS R16 , [adr] (Load pointer into DS )


Le mot pointé par adr est recopié dans R16 et le mot suivant est recopié dans DS
30h 200h
LDS BX,[200h] 31h
32h
Après l’instruction ci-dessus on aura : 33h
BX = 3130h et DS = 3332h 34h
35h
Cette instruction doit être utilisée avec beaucoup de précaution, car on changeant la
valeur de DS, les données déclarées dans le DATA segment ne seront plus accessibles.

LES R16,[adr] (Load pointer into ES )


Similaire à LDS, ici le 2ème mot est chargé dans ES

6.4 INSTRUCTIONS DIVERSES

XLAT
Instruction sans opérande qui recopie dans AL le contenu de la case mémoire pointée
par BX+AL

Peut servir dans des opérations de transcodage en faisant correspondre au contenu de


AL une valeur préalablement rangée dans un tableau. BX doit être initialisé pour pointer
sur le début de la table et AL sert de registre d'index par rapport à BX pour localiser
l'élément désiré dans la table.

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

Le code ASCII de du chiffre 3 se trouve maintenant dan AL

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.

Instructions de contrôle du 8086 :

Opérations sur les flags


STC Met le flag de retenue à 1
CLC Efface le flag de retenue
CMC Inverse l’état du flag de retenue
STD Met le flag de direction à 1 (décrémentation)
CLD Met le flag de direction à 0 (incrémentation)
STI Autorise les interruptions sur INTR
CLI Interdit les interruptions sur INTR
Synchronisation avec l’extérieur
HLT Arrêt du microprocesseur (sortie de cet état par inter-
ruption ou reset)
WAIT Attente tant que TEST n’est pas à 0
ESC Préfixe = instruction destinée à un coprocesseur
LOCK Préfixe = réservation du bus pour l’instruction
Pas d’opération
NOP Pas d’opération

Vous aimerez peut-être aussi