Vous êtes sur la page 1sur 63

Faculté des Sciences et Techniques – Tanger

Département Génie électrique

Cours

Architecture
des ordinateurs

Par : Karim EL MOKHTARI


Karim.el.mokhtari@menara.ma

A l'usage des étudiants des maîtrises :


IEEA et Génie informatique

-1-
Table des matières

CHAPITRE 1 : SYSTEMES DE NUMERATION ET CODAGE 5

1. LES SYSTEMES DE NUMERATION 5


1.1. DEFINITION D’UNE BASE 5
1.2. LE SYSTEME DECIMAL 5
1.3. LES SYSTEMES BINAIRE, HEXADECIMAL ET OCTAL 6
1.4. REPRESENTATION DES NOMBRES FRACTIONNAIRES 8
1.5. REPRESENTATION DES NOMBRES NEGATIFS EN BINAIRE 8
1.6. OPERATIONS ARITHMETIQUES EN BINAIRE 9
2. LE CODAGE 10
2.1. CODIFICATION DES NOMBRES ENTIERS 10
2.2. CODIFICATION DES NOMBRES REELS (NORME IEEE 754) 11
2.3. CODE BINAIRE REFLECHI OU CODE GRAY 12
2.4. CODE BCD (BINARY CODED DECIMAL) 12
2.5. CODE ASCII (AMERICAN STANDARD CODE FOR INFORMATION INTERCHANGE) 12

CHAPITRE 2 : GENERALITES SUR LES MICROPROCESSEURS 15

1. STRUCTURE D'UN SYSTEME A MICROPROCESSEUR 15


1.1. LE MICROPROCESSEUR 15
1.2. LA MEMOIRE ET LE BUS 15
1.3. LES PERIPHERIQUES 18
2. ARCHITECTURE D'UN MICROPROCESSEUR 19
2.1. L'UNITE ARITHMETIQUE ET LOGIQUE 19
2.2. L'UNITE DE CONTROLE 19
2.3. LES REGISTRES 20
2.4. CARACTERISTIQUES D'UN MICROPROCESSEUR 20

CHAPITRE 3 : LE MICROPROCESSEUR INTEL 8086 21

1. CARACTERISTIQUES DU 8086 21
2. STRUCTURE INTERNE DU 8086 21
2.1. FONCTIONS DE LA BIU 22
2.2. FONCTIONS DE L'EU 22
3. ORGANISATION DE L'ESPACE MEMOIRE 22
4. LES REGISTRES DU 8086 23
4.1. LES REGISTRES DE CALCUL 23
4.2. LES REGISTRES D'ADRESSAGE 23

-2-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

4.3. LES REGISTRES DE SEGMENTATION 24


4.4. LES REGISTRES DE CONTROLE 26
5. LES MODES D'ADRESSAGE 27
5.1. MODE REGISTRE 27
5.2. MODE IMMEDIAT 28
5.3. MODE DIRECT 28
5.4. ADRESSAGE INDIRECT 28
6. LES INSTRUCTIONS DE LA FAMILLE INTEL 80X86 30
6.1. RESUME DES PRINCIPALES INSTRUCTIONS 31
6.2. LES SAUTS 37
7. CODAGE DES INSTRUCTIONS 39

CHAPITRE 4 : LA PILE ET SES UTILISATIONS 41

1. STRUCTURE DE LA PILE 41
2. ACCES A LA PILE 41
2.1. L'EMPILEMENT 41
2.2. LE DEPILEMENT 42
3. UTILISATIONS DE LA PILE 43
3.1. STOCKAGE TEMPORAIRE 43
3.2. LES APPELS AUX SOUS-PROGRAMMES ET LA PILE 43
3.3. PASSAGE DES PARAMETRES A UN SOUS-PROGRAMME 45

CHAPITRE 5 : LES INTERRUPTIONS 48

1. INTRODUCTION 48
2. TYPES D'INTERRUPTIONS 49
2.1. DEFINITION D'UNE INTERRUPTION 49
2.2. TYPES ET PROPRIETES DES INTERRUPTIONS 49
3. APPLICATION 51
3.1. METHODE PAR SCRUTATION 51
3.2. METHODE PAR INTERRUPTION 51

CHAPITRE 6 : LES ENTREES/SORTIES 53

1. INTRODUCTION 53
2. NOTION DE CONTROLEUR OU DE CIRCUIT D'INTERFACE 53
3. COMMUNICATION ENTRE LE MICROPROCESSEUR ET UN CIRCUIT D'INTERFACE 53
4. ACCES AUX REGISTRES D'UN CIRCUIT D'INTERFACE 54
5. APPLICATION : LE CIRCUIT D'INTERFACE SERIE 54
6. LE CIRCUIT D’INTERFACE PARALLELE 8255 54
6.1. CONNEXION DU 8255 AU MICROPROCESSEUR 55
6.2. PROGRAMMATION DU 8255 55

CHAPITRE 7 : INITIATION A LA PROGRAMMATION SYSTEME 57

-3-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

1. INTRODUCTION 57
2. ACCES AUX RESSOURCES MATERIELLES 57
3. STRUCTURE D’UN PROGRAMME EN ASSEMBLEUR 80X86 57
3.1. DECLARATION DES SEGMENTS 58
3.2. DECLARATION DES DONNEES ET DE LA PILE 58
3.3. EXEMPLE DE PROGRAMME 61
3.4. APPEL AUX FONCTIONS DU DOS ET DU BIOS 62
4. COMPILATION D’UN PROGRAMME EN ASSEMBLEUR 80X86 62
4.1. EDITION DU PROGRAMME 63
4.2. COMPILATION 63
4.3. EXECUTION DU PROGRAMME 63

-4-
CHAPITRE

1 Systèmes de numération
et codage

1. Les systèmes de numération


Un système de numération est un ensemble de symboles et de règles permettant la représentation
de n’importe quel élément d’un ensemble de nombres données.
Exemple
Le système décimal permet d’écrire un nombre à l’aide de dix chiffres 0 à 9. Tout nombre est
représenté par une combinaison de ces dix symboles.

1.1. Définition d’une base


La base d’un système de numération est la référence qui permet l’écriture d’un nombre. Dans le
cas du système décimal, la base est 10.
Exemple
2148 = 2.103 + 1.102 + 4.101 + 8.100
En généralisant, un nombre A peut être exprimé dans une base B par n chiffres ai :
(A)B = an-1an-2...a0
Remarque
La notation (A)B signifie que A est exprimé dans la base B.

1.2. Le système décimal


C'est le système que nous utilisons dans la vie courante. Il est basé sur les dix chiffres 0 à 9.
Si nous employons le système décimal avec aisance dans tous nos calculs, il n'en va pas de même
pour les machines électroniques danslesquelles ce système reste difficile à mettre en œuvre pour
plusieurs raisons d'ordre technique. C'est un autre système, plus adapté, qui est implanté.
Le problème de conversion se pose alors du moment que la machine et l'homme parlent deux
langages différents : La machine ne peut accepter un nombre décimal et l'homme de son côté
reste incapable d'interpréter un résultat fourni par la machine dans sa base sans faire appel à une
gymnastique lourde d’esprit.
Par conséquent, les règles de passage entre la base décimale et n'importe quelle base B ont été
définies :

1.2.1. Passage d’une base B à la base décimale


Soit A un nombre exprimé dans une base B :
(A)B = an-1an-2...a0 avec 0 ≤ ai ≤ B-1
La valeur décimale du nombre A est calculée par :

-5-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

(A)10 = an-1.Bn-1 + an-2.Bn-2 + ... + a0.B0


n−1
( A)10 = ∑a B
i=0
i
i

Exemple
Soit A un nombre exprimé en base 8 : (A)8 = 725
L'équivalent de A en décimal est :
(A)10 = 7.82 + 2.81 +5.80 = 469

1.2.2. Passage de la base décimale à une base B


Soit A un nombre exprimé dans le système décimal.
L’équivalent de A dans une base B est calculé en divisant A par B, puis le quotient obtenu par B et
ainsi de suite jusqu’à ce que le quotient soit nul. Les restes de divisions successives lus du bas vers
le haut représentent le nombre A dans la base B.
Soit : (A)B = a3a2a1a0
(A)10 = a3.B3 + a2.B2 + a1.B1 + a0.B0
(A)10 = B.(a3.B2 + a2.B1 + a1) + a0 = B.Q1 + a0
Q1 = B.(a3.B + a2) + a1 = B.Q2 + a1
Q2 = B.a3 + a2 = B.Q3 + a2
Q3 = B.0 + a3 = B.0 + a3

A B
a0 Q1 B
a1 Q2 B
a2 Q3 B
Restes
successifs a3 0

Exemple
(31)10 = (11111)2 = (1011)3
Vérifier ces résultats en appliquant les règles de passage.
Remarque
La base dans son propre système s’écrit toujours 10.

1.3. Les systèmes binaire, hexadécimal et octal

1.3.1. Le système binaire


C’est la base 2. Elle est utilisée dans tous les systèmes électroniques où les deux états VRAI et
FAUX sont facilement réalisables (interrupteur fermé ou ouvert, transistor bloqué ou saturé, lampe
allumée ou éteinte, ...). Cette base comporte uniquement les deux symboles 0 et 1. Ce sont les
chiffres binaires appelés aussi bits (Binary digit) :
(A)2 = an-1an-2...a0 avec ai ∈ {0;1}
• an-1 s’appelle le MSB (Most Significant Bit) : Bit de poids le plus fort.

-6-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

• a0 s’appelle le LSB (Least Significant Bit) : Bit de poids le plus faible.


Vu l'importance de système, nous allons consacrer plusieurs paragraphes à l'étude de certains des
ses aspects, notamment le calcul arithmétique (voir 1.6) et les nombres négatifs (voir 1.5).

1.3.2. Le système hexadécimal


Le système hexadécimal comporte 16 symboles : les dix chiffres 0 à 9 et les six lettres A, B, C, D,
E et F. Ce système est très répandu pour la simple raison qu'il permet de représenter les nombres
binaires d'une manière plus compacte.
Table de correspondance Décimal / Binaire / Hexadécimal
Décimal Binaire Hexa. Décimal Binaire Hexa.
0 0000 0 8 1000 8
1 0001 1 9 1001 9
2 0010 2 10 1010 A
3 0011 3 11 1011 B
4 0100 4 12 1100 C
5 0101 5 13 1101 D
6 0110 6 14 1110 E
7 0111 7 15 1111 F
Exemples
• Soit en base hexadécimale : (A)16 = 2AB
En décimal : (A)10 = 2.162 + 10.161 + 11.160 = 683
• Vérifiez les résultats suivants en appliquant les règles de conversion que vous connaissez :
(62)10 = (3E)16 = (111110)2
Prenons le nombre (3E)16 et exprimons chaque chiffre hexadécimal en binaire sur 4 bits (cf. le
tableau de conversion ci-dessus) :
(3)16 → (0011)2 et (E)16 → (1110)2
Maintenant, mettons les groupes de bits ensemble en suivant l'ordre des chiffres :
(3E)16 → (00111110)2
On voit bien qu'on retrouve le même résultat obtenu avec les règles de base.
Règles de conversion Base 16 / Base 2
• Pour passer de la base 16 à la base 2, on exprime chaque chiffre hexadécimal en binaire sur 4
bits.
• Pour faire la transformation inverse (Base 2 vers 16), il suffit de prendre les chiffres binaires 4
par 4 en partant de la droite et convertir chaque quartet en hexadécimal.
Exemple
(N)2 = 00111110 donc (N)16 = 3E

3 E
Remarque
Vu que le passage Base 2 / Base 16 est direct et que la représentation hexadécimale est plus
compacte, on préfère toujours écrire les nombres binaires en hexadécimal.

1.3.3. Le système octal


Il contient 8 symboles : 0 à 7. Il est moins fréquemment utilisé dans la représentation des nombres
binaires.

-7-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Le passage du système binaire au système octal se fait par groupement de 3 bits.


Exemple
(A)2 = 1100110 donc (A)8 = 146

1 4 6
(A)8 = 253 d’où (A)2 = 100101011

1.4. Représentation des nombres fractionnaires


On isole la partie entière qu'on convertit selon les règles déjà connues. Ensuite, on multiplie la
partie fractionnaire (partie après la virgule) par la base et on répète l’opération sur la partie
fractionnaire du produit jusqu’à ce qu’elle soit nulle (ou que la précision voulue soit atteinte). Les
parties entières des produits obtenus représentent les chiffres des la partie fractionnaire du nombre
converti.
Exemple
Trouver l’équivalent binaire du nombre décimal : 35,125
• Partie entière : (35)10 = (100011)2
• Partie fractionnaire :
0,125 × 2 = 0,25 a-1 = 0
0,25 × 2 = 0,5 a-2 = 0
0,5 × 2 = 1,0 a-3 = 1
0,0 × 2 =0 Arrêt
D’où :
(35,125)10 = (100011,001)2

1.5. Représentation des nombres négatifs en binaire


Il existe 3 modes de représentation des nombres signés en binaire :

1.5.1. Représentation en valeur absolue et bit de signe


On utilise un caractère binaire supplémentaire. Conventionnellement, on attribue la valeur 0 au
signe (+) et la valeur 1 au signe (–).
Exemple
La valeur absolue de 12 est (1100)2 :
+12 → 01100
– 12 → 11100

bit de signe
Ce système de représentation n’est pas couramment employé car il n’est pas pratique dans les
opérations arithmétiques.

1.5.2. Représentation par complément à 1


Le complément à 1 d’un nombre binaire s’obtient en remplaçant les 1 par des 0 et vice-versa.
Exemple
+7 → 0111
– 7 → 1000

-8-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Inconvénient
Le nombre 0 peut être codé de deux manières : 0000 et 1111.

1.5.3. Représentation en complément à 2


Le complément à 2 s’obtient en ajoutant 1 au complément à 1.
Exemple
+7 → en binaire naturel sur 4 bits : 0111 → le complément à 1 : 1000
auquel on ajoute 1 : 1000 + 1 = 1001 (l'équivalent de (–7) en code complément à 2 sur 4 bits)
Remarques
• Le code complément à 2 est le plus utilisé car il est adapté aux opérations arithmétiques.
• Le MSB indique le signe du nombre : 1 → (–) et 0 → (+)
• On doit toujours spécifier le nombre de bits lorsqu’on travaille en complément à 2. Sur n bits,
on peut représenter les nombres allant de –2n–1 à 2n–1–1. Sur 4 bits par exemple, on ne peut
représenter que les nombres compris entre –7 et +8 :
Décimal Code compl. à 2 Décimal Code compl. à 2
0 0000 –8 1000
1 0001 –7 1001
2 0010 –6 1010
3 0011 –5 1011
4 0100 –4 1100
5 0101 –3 1101
6 0110 –2 1110
7 0111 –1 1111

1.6. Opérations arithmétiques en binaire

1.6.1. L’addition
Règles
0+0=0
1+0=1+0=1
1 + 1 = 0 avec retenue
1 + 1 + 1 = 1 avec retenue
Exemple
1 1 1
1 0 1 1
+ 1 1 0 1

1 1 0 0 0

1.6.2. La soustraction
Pour calculer (M – N), on calcule la somme de M et le complément à 2 de N.
Exemple
Pour calculer (7-5), on fait la somme de 0111 (7) et 1011 (complément à 2 de 5), d’où :
0111 + 1011 = 0010 (2 en décimal)
Remarque
En général, les calculateurs travaillent avec tailles normalisées (8, 16, 32, ... bits). Pour qu’une

-9-
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

opération d’addition ou de soustraction sur n bits soit cohérente, il faut que le résultat soit compris
entre –2n–1 et 2n–1-1. Si ce n’est pas le cas, il y a un dépassement de la capacité de calcul
(Overflow).

1.6.3. Multiplication
Nous ne considérons que les opérations sur les nombres positifs, le traitement du signe est fait à
part. Pour faire une multiplication en binaire, on suit les même règles que le système décimal :

1 0 1 1
× 1 0 1
1 0 1 1
0 0 0 0
1 0 1 1
1 1 0 1 1 1

1.6.4. Division
Elle est réalisée comme la division décimale :
Dividende Diviseur

1 1 0 1 1 1 1 1
0 0 1 1
0 1 1 0 0 1 0
1
Quotient
Reste

2. Le codage

2.1. Codification des nombres entiers


Le codage d’un nombre entier dans un ordinateur se fait sur un nombre fixe de bits (8, 16, 32,
...) :
• En binaire non signé (binaire naturel) sur n bits, les nombres sont compris entre 0 et 2n–1
• En binaire signé (code complément à 2) sur n bits, les nombres sont compris entre –2n–1 et
2n–1–1
Exemple
A = –2
L’équivalent de A en binaire signé est :
Sur 8 bits Sur 16 bits Sur 32 bits
FE FFFE FFFFFFFE
Remarque
En langage C, les types utilisés occupent 1, 2 ou 4 octets :
Type Nombre d’octets Plage
int En fonction du système (*)
char 1 -128 → 127
unsigned char 1 0 → 255
short 2 -32 768 → 32 767
unsigned short 2 0 → 65 535
long 4 -2 147 483 648 → 2 147 836 647
unsigned long 4 0 → 4 294 967 295
(*)
Dans les systèmes 16 bits (DOS par exemple) un type int occupe 2 octets alors que dans les systèmes 32 bits il occupe
4 octets. Il est donc plus prudent d'utiliser les types short et long pour s'assurer de la taille de la variable.

- 10 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

A propos de signed et unsigned


Prenons l'exemple du type char :
Ce type occupe un octet dans la mémoire de l'ordinateur. Lorsqu'on affecte une valeur à une
variable de type char, elle est toujours convertie en binaire avant d'être rangée en mémoire. Au
moment de la lecture, la valeur binaire est interprétée en binaire naturel si la variable a été
déclarée unsigned ou en binaire signé (code complément à 2) si la variable a été déclarée
signed.
Afin de mieux illustrer cette notion, nous allons analyser un petit programme écrit en C :
# include <stdio.h>
void main (void)
{
char x; //signed est pris par défaut
unsigned char y;
x=-1;
y=x;
printf("(x)10 = %d ; (x)16 = %.2X\n",x,x);
printf("(y)10 = %d ; (y)16 = %.2X\n",y,y);
}

On déclare deux variable x et y de type char ; y est définie unsigned.


x=-1;
On affecte la valeur –1 à x. En réalité, la valeur affectée à x est le complément à 2 du nombre 1,
soit 11111111 en binaire (FF en hexadécimal).
y=x;
Ici on affecte la valeur de x à y (c'est la valeur binaire FF qui est recopiée dans y)
Les deux instructions printf servent à l'affichage de x et y en décimal (%d) puis en hexadécimal sur
deux chiffre (%.2X). Le résultat affiché par le programme est le suivant :
(x)10 = -1 ; (x)16 = FF
(y)10 = 255 ; (y)16 = FF
Le contenu binaire de x et y est le même (FF), cependant, cette valeur est interprétée –1 pour x
qui a été définie comme un nombre signé et 255 pour y qui a été définie non signé (donc en
binaire naturel).

2.2. Codification des nombres réels (norme IEEE 754)


Du moment que les nombres réels peuvent prendre des valeurs très grandes ou très petites, ils sont
représentés en virgule flottante (floating point) selon le format normalisée IEEE.
Il existe deux formats IEEE pour les nombres à virgule flottante : le format 32 bits (type single en
C) et le format 64 bits (type double en C) :
Format 32 bits
31 30 23 22 0
1bit 8bits 23bits
Signe Exposant Mantisse

Exemple
Soit à représenter le nombre A = 8,25 sous la format IEEE 32 bits
On commence par convertir la valeur absolue du nombre en binaire naturel :
(8,25)10 = (1000,01)2
Ensuite, on écrit le nombre sous la forme : 1,... × 2m. On trouve pour notre exemple :
1000,01 = 1,00001 × 23
Le format IEEE 32 bits se compose de 3 champs :

- 11 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

• Le bit de signe (bit 31) indique le signe du nombre : 1 → (–) ; 0 → (+)


• L’exposant est codé sur 8 bits (bits 23 à 30). Il est égal à m+127.
• La mantisse s’écrit sur 23 bits (bits 0 à 22). Elle représente la suite des bits après la virgule
(dans notre cas : 00001)
Ainsi, le format IEEE du nombre (8,25)10 est :
01000001000001000000000000000000 (soit 41040000 en hexa)
Remarques
• L’exposant 00000000 signifie que le nombre est dénormalisé (trop petit)
• L’exposant 11111111 signifie un dépassement de capacité (nombre trop grand : NaN (Not a
Number))
Par conséquent, le plus petit exposant possible est 01 (m=–126) et le plus grand est FE
(m=+127).

2.3. Code binaire réfléchi ou code GRAY


C’est un code non pondéré. Il est différent du code binaire naturel. La particularité de ce code est
que le passage d’un nombre au nombre suivant se traduit par le changement d’un seul bit :
Décimal Binaire Décimal Binaire
réfléchi réfléchi
0 0000 8 1100
1 0001 9 1101
2 0011 10 1111
3 0010 11 1110
4 0110 12 1010
5 0111 13 1011
6 0101 14 1001
7 0100 15 1000

2.4. Code BCD (Binary Coded Decimal)


On fait correspondre à chaque chiffre décimal un mot binaire codé sur 4 bits.
Exemple
(5873)10 = (0101100001110011)BCD
Ce code est souvent employé dans les systèmes de comptage et dans certaines machines à
calculer. Il permet de réaliser des opérations en décimal avec des chiffres binaires.

2.5. Code ASCII (American Standard Code for Information Interchange)

2.5.1. Définition
L'homme utilise le plus souvent des informations sous forme de texte, de chiffres ou de symboles,
c'est ce qu'on appelle en informatique des caractères (A,B,C,...,1,2,3,...,(,@,&,...). Cependant, la
mémoire de l'ordinateur ainsi que les supports d'information ne peuvent supporter que les valeurs
0 et 1. Il a donc fallu trouver un codage qui permettrait de représenter n'importe quel caractère
sous forme d'un nombre binaire afin de faciliter son stockage et sa transmission.
Le code ASCII était parmi les premiers codes utilisés pour ce propos. C'est un code universel qui
fait correspondre à chaque caractère un code sur 7 ou 8 bits.
Sur la page suivante, vous trouverez une table détaillée du code ASCII.
Dans sa première version, le code ASCII était codé sur 7 bits. Cette taille n'étant pas suffisante
pour représenter tous les symboles, il a été étendu à 8 bits.

- 12 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Table du code ASCII entre 0 et 127


Décimal Hexa Binaire ASCII Décimal Hexa Binaire ASCII
0 0 00000000 NUL 64 40 01000000 @
1 1 00000001 65 41 01000001 A
2 2 00000010 STX 66 42 01000010 B
3 3 00000011 ETX 67 43 01000011 C
4 4 00000100 EOT 68 44 01000100 D
5 5 00000101 69 45 01000101 E
6 6 00000110 ACK 70 46 01000110 F
7 7 00000111 BEL 71 47 01000111 G
8 8 00001000 72 48 01001000 H
9 9 00001001 73 49 01001001 I
10 A 00001010 LF 74 4A 01001010 J
11 B 00001011 75 4B 01001011 K
12 C 00001100 76 4C 01001100 L
13 D 00001101 CR 77 4D 01001101 M
14 E 00001110 78 4E 01001110 N
15 F 00001111 79 4F 01001111 O
16 10 00010000 80 50 01010000 P
17 11 00010001 81 51 01010001 Q
18 12 00010010 82 52 01010010 R
19 13 00010011 83 53 01010011 S
20 14 00010100 NAK 84 54 01010100 T
21 15 00010101 85 55 01010101 U
22 16 00010110 86 56 01010110 V
23 17 00010111 87 57 01010111 W
24 18 00011000 88 58 01011000 X
25 19 00011001 89 59 01011001 Y
26 1A 00011010 90 5A 01011010 Z
27 1B 00011011 91 5B 01011011 [
28 1C 00011100 92 5C 01011100 \
29 1D 00011101 93 5D 01011101 ]
30 1E 00011110 94 5E 01011110 ^
31 1F 00011111 95 5F 01011111 _
32 20 00100000 ESPACE 96 60 01100000 `
33 21 00100001 ! 97 61 01100001 a
34 22 00100010 " 98 62 01100010 b
35 23 00100011 # 99 63 01100011 c
36 24 00100100 $ 100 64 01100100 d
37 25 00100101 % 101 65 01100101 e
38 26 00100110 & 102 66 01100110 f
39 27 00100111 ' 103 67 01100111 g
40 28 00101000 ( 104 68 01101000 h
41 29 00101001 ) 105 69 01101001 i
42 2A 00101010 * 106 6A 01101010 j
43 2B 00101011 + 107 6B 01101011 k
44 2C 00101100 , 108 6C 01101100 l
45 2D 00101101 - 109 6D 01101101 m
46 2E 00101110 . 110 6E 01101110 n
47 2F 00101111 / 111 6F 01101111 o
48 30 00110000 0 112 70 01110000 p
49 31 00110001 1 113 71 01110001 q
50 32 00110010 2 114 72 01110010 r
51 33 00110011 3 115 73 01110011 s
52 34 00110100 4 116 74 01110100 t
53 35 00110101 5 117 75 01110101 u
54 36 00110110 6 118 76 01110110 v
55 37 00110111 7 119 77 01110111 w
56 38 00111000 8 120 78 01111000 x
57 39 00111001 9 121 79 01111001 y
58 3A 00111010 : 122 7A 01111010 z
59 3B 00111011 ; 123 7B 01111011 {
60 3C 00111100 < 124 7C 01111100 |
61 3D 00111101 = 125 7D 01111101 }
62 3E 00111110 > 126 7E 01111110 ~
63 3F 00111111 ? 127 7F 01111111

- 13 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

2.5.2. Codage d’une chaîne de caractères


Une chaîne de caractères est stockée sous forme d’une suite de codes ASCII représentant les
caractères qui la constituent. Ces codes sont terminés par un indicateur de fin (en général, le
caractère NUL (code ASCII : 0))
Exemple
En langage C, le mot "Bonjour" sera stocké dans la mémoire de l'ordinateur sous forme de 7 octets
suivis du caractère NUL :
42, 6F, 6E, 6A, 6F, 75, 72, 00

- 14 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

CHAPITRE

Généralités sur les


2 microprocesseurs

1. Structure d'un système à microprocesseur

1.1. Le microprocesseur
On appelle processeur tout dispositif électronique qui permet de réaliser :
• des opérations arithmétiques
• des opérations logiques
• des manipulations de bits (décalage, rotation)
• des transferts mémoire
Le microprocesseur est un processeur qui existe sous forme d'un circuit intégré. C'est le composant
de base de tout ordinateur.
A un instant donnée, le microprocesseur peut réaliser une seule instruction. Mais, il faudrait qu'il
soit capable de réaliser une suite d'instructions (un programme).
Question : Où faut-il mettre le programme ?
Réponse : Dans une mémoire.
Question : Comment communiquent ces deux circuits ?
Réponse : Pour y répondre, on va étudier, tout d'abord, l'organisation de la mémoire.

1.2. La mémoire et le bus


La mémoire est une suite de m cases contenant chacune n bits :
n bits
Données binaires

0 0 1 1 0 1 1 1 0
1 1 0 0 0 1 1 0 1
……

……

m cases

m-1 1 0 0 0 0 1 0 0

Adresse

Pour accéder à une case, il faut fournir le numéro de la case : l'adresse.


Soit l'exemple suivant qui illustre une mémoire de 16 cases de 8 bits :

- 15 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

0 1 0 1 0 0 0 0 0
1 1 1 1 0 1 0 1 0

……
14 1 1 1 0 0 0 0 0
15 0 0 0 0 1 1 0 0

Question : Combien faut-il de fils pour composer l'adresse en binaire ?


Réponse : 4 fils car 16 = 24. Ces fils s'appellent : le bus d'adresse. Un bus est un ensemble de
fils généralement partagé entre plusieurs dispositifs.
Question : Où peut on récupérer la donnée existante dans la case désignée par l'adresse ?
Réponse : sur 8 fils s'appelant le bus de données.

A0
Bus d’adresse

A1
Mémoire de
A2 16 octets

A3


D7 D0 D0
Bus de données

1.2.1. Communication entre un microprocesseur et une mémoire

Bus de contrôle

Microprocesseur Bus d’adresse Mémoire

Bus de données

Le bus d'adresse est unidirectionnel.


Le bus de données est bidirectionnel. Il permet au microprocesseur :
• De lire le contenu de la mémoire
• D'écrire dans la mémoire
Question : Comment choisir entre la lecture et l'écriture ?
Réponse : Le microprocesseur doit être capable de sélectionner le sens de l'échange. Ceci
s'effectue grâce au bus de contrôle.
Exemple
La ligne R/W (Read/Write) fait partie du bus de contrôle. Elle permet de fixer le sens de l'échange
entre le microprocesseur et le dispositif sélectionné (une mémoire par exemple).

- 16 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

1.2.2. Types de mémoires


Les mémoires sont classées en deux catégories :

1.2.2.1. Les mémoires vives


Appelées aussi RAM (Random Access Memory), elles sont accessibles en lecture et en écriture.
Elles servent au stockage des données et des variables ainsi que du programme à exécuter.
On distingue les RAM statiques (SRAM) et les RAM dynamiques (DRAM) :
• Les SRAM sont très rapides mais coûteuses. Elles servent à la réalisation des mémoires cache
des microprocesseurs.
• Les DRAM sont lentes à cause de leur cycle de rafraîchissement mais moins coûteuses ce qui
permet d'atteindre des tailles mémoire élevées. Elles constituent la mémoire vive de
l'ordinateur.

1.2.2.2. Les mémoires mortes


On les appelle aussi ROM (Read Only Memory). Elles sont accessibles uniquement en lecture.
Dans un ordinateur, elles contiennent le programme de démarrage, les données système et le
BIOS (Basic Input Output System).
Il existe des ROM effaçables et reprogrammables :
• EPROM : effaçables par rayonnement ultra-violet.
• EEPROM ou E2PROM : effaçables électriquement.

1.2.3. Communication avec plusieurs mémoires


Le microprocesseur peut communiquer avec plusieurs mémoires branchées sur les bus d'adresse et
de données.
Question : Comment sélectionner une mémoire parmi les mémoires branchées ?
Réponse : La sélection s'effectue grâce à un circuit spécialisé appelé : décodeur d'adresse.

Bus d’adresse

Microprocesseur

Décodeur
Mémoire 1 Mémoire 2 Mémoire 3
d’adresse

CS CS CS

Bus de données

CS (Chip Select) : entrée d’activation de la mémoire.


Le décodeur d'adresse active une mémoire à la fois en fonction de l'adresse présente sur le bus
d'adresse.

- 17 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Exemple
0000
Mémoire 1
3FFF
4000
Mémoire 2
BFFF
C000
Mémoire 3
CFFF
D000
Espace vide
FFFF

1. Donner la taille de l'espace mémoire total.


2. Donner la taille de chaque mémoire.
Solution
L'espace total
Il commence à 0000h et se termine à FFFFh. Le nombre de cases en hexadécimal est donc :
FFFFh – 0000h +1 = 10000h cases
Ce qui donne en décimal : 16 cases de 8 bits (un ensemble de 8 bits est appelé octet)
4

En général, on exprime les tailles des mémoires en utilisant les multiples suivant :
1 kilo-octet (Ko) = 210 octets = 1 024 octets
1 méga-octet (Mo) = 220 octets = 1 048 576 octets
L'espace total de notre mémoire sera alors de : 164 = 216 = 26.210 = 64 Ko
Mémoire 1
• Nombre de cases : 3FFFh – 0000h +1 = 4000h cases
• En décimal : 4000h → 4.163 = 22.212 = 214 = 24.210 = 16 Ko
Mémoire 2
• Nombre de cases : BFFFh – 4000h +1 = 8000h cases
• En décimal : 8000h → 8.163 = 23.212 = 215 = 25.210 = 32 Ko
Mémoire 3
• Nombre de cases : CFFFh – C000h +1 = 1000h cases
• En décimal : 1000h → 163 = 212 = 22.210 = 4 Ko

1.3. Les périphériques


Afin que le microprocesseur puisse échanger les données avec le milieu extérieur, il utilise des
périphériques de natures diverses (clavier, souris, imprimante, traceur, ...)
La communication avec les périphériques s'effectue par l'intermédiaire des circuits d'interface.

Bus de contrôle

Circuits
Microprocesseur Bus d’adresse Périphériques
d’interface

Bus de données

- 18 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Exemple
• Le circuit d'interface série (l'UART)
• Le circuit d'interface parallèle (le PPI)

2. Architecture d'un microprocesseur


Le microprocesseur comporte :
• une unité arithmétique et logique (UAL),
• une unité de contrôle et de commande,
• des registres,
• un ou plusieurs bus internes.

Bus interne

Unité de
contrôle

Registres

UAL

2.1. L'Unité Arithmétique et Logique


X Y

Sélection de
l’opération
UAL

C'est un circuit combinatoire. Il réalise les opérations arithmétiques et logiques (voir cours des
circuits logiques, chapitre 3)

2.2. L'unité de contrôle


Elle gère toutes les opérations qui concourent à la réalisation d'une instruction.
Exemple
L'instruction "Lire la case d'adresse 12" est exécutée par l'unité de contrôle de la manière suivante :
1. Placer 12 sur le bus d'adresse
2. Attendre la donnée de la mémoire
3. Lire la donnée du bus de données
4. Charger la valeur lue dans le registre demandé
Chacune de ces opérations s'appelle une micro-instruction.

- 19 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

La gestion des tâches implique la notion de temps. Le microprocesseur a besoin d'une horloge
dont la fréquence est exprimée en méga-hertz (MHz).

2.3. Les registres


Ce sont des mémoires internes. Indispensables au fonctionnement du microprocesseur, ils
permettent notamment le stockage des opérandes, des résultats, des pointeurs d'adresse, ...

2.4. Caractéristiques d'un microprocesseur


• Les microprocesseurs se distinguent par :
1. leur structure interne,
2. leur fréquence d'horloge,
3. le nombre d'instructions réalisables (jeu d'instructions),
4. la manière d'accéder aux données dans la mémoire (modes d'adressage),
5. la taille et le nombre de registres,
6. l'utilisation des registres.
• Un microprocesseur est dit n bits lorsque son bus de données est de n bits.
• L'espace d'adressage d'un microprocesseur est le nombre maximal de cases mémoire qu'il peut
adresser. Ce nombre dépend de la taille du bus d'adresse.
Exemple
Le 6809 est un microprocesseur 8 bits. Il a une bus d'adresse de 16 bits d'où un espace
d'adressage de 216 = 64 Ko

- 20 -
CHAPITRE

Le microprocesseur
3 INTEL 8086

1. Caractéristiques du 8086
• Structure 16 bits
• Capacité d'adressage de 1 Mo
• 14 registres internes de 16 bits
• 24 modes d'adressage
• Opérations sur des bits, des octets, des mots et des chaînes de caractères
• Arithmétique signée ou non signée
• Arithmétique binaire ou BCD, sur 8 ou 16 bits

2. Structure interne du 8086

- 21 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Le 8086 se compose de deux unités de traitement séparées : l'unité d'interface de bus (BIU) et
l'unité d'exécution (EU)
L'unité d'exécution comporte l'UAL, les registres généraux (AX, BX, CX, DX), les registres
d'adressage (SP, BP, SI, DI), le registre d'état (Flags) et le décodeur d'instructions.
L'unité d'interface de bus comporte une file d'attente d'instructions gérée en FIFO, les registres de
segments (CS, DS, SS, ES) et le pointeur d'instruction (IP).

2.1. Fonctions de la BIU


• Elle cherche les instructions à exécuter de la mémoire et les stocke dans la file d'attente FIFO
• Elle calcule les adresses physiques sur 20 bits
• Elle réalise le transfert des données avec la mémoire

2.2. Fonctions de l'EU


• Elle extrait les codes des instructions à partir de la file d'attente et les exécute
• Elle fournit les adresses des opérandes au BIU en nommant le segment concerné et en
fournissant le déplacement dans ce segment
• Elle reçoit et fournit les opérandes au BIU
Ces deux unités travaillent pratiquement comme deux processeurs en parallèle. Cette procédure
est appelée mode pipe-line. Elle permet un gain important en temps d'exécution.

3. Organisation de l'espace mémoire


Le 8086 dispose d'un bus d'adresse de 20 bits : A19 à A0 donc d'un espace mémoire adressable de
220 = 1 Mo.
La mémoire peut être vue ainsi :
8 bits (octet)

00000
00001
…..

FFFFE
FFFFF

Chaque case contient un octet.


Le 8086 manipule des données sur 8 bits et sur 16 bits :
• Pour accéder à une donnée sur 8 bits, il suffit de donner son adresse sur 20 bits.
• Les données exprimées sur 16 bits occupent deux octets dans la mémoire. Dans la famille
INTEL les 8 bits de poids faible sont stockées en premier suivis des 8 bits de poids fort. Cette
convention est appelé Big Endian (la convention rivale est appelé Little Endian, elle est
adoptée dans les microprocesseurs MOTOROLA)
Ainsi, le 8086 stocke le mot 658Fh à l'adresse 01000h comme suit :
01000h 8Fh
01001h 65h

- 22 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

4. Les registres du 8086


Le 8086 a 14 registres de 16 bits classés en 4 groupes :
• Les registres de calcul
• Les registres d'adressage
• Les registres de segmentation
• Les registres de contrôle

4.1. Les registres de calcul


Ce sont les registres AX, BX, CX et DX. Ils sont utilisables dans tout type de traitement (calcul,
stockage temporaire, ...).

4.1.1. Le registre AX
Appelé registre accumulateur. C'est le registre le plus utilisé implicitement par les instructions
du 8086.
Il peut être vu sous forme de deux registres indépendants de taille 8 bits : AL et AH
AX
15 8 7 0
AH AL
(AX High) (AX Low)

On écrit : AX = AH : AL
Si AX = 12A4h alors AH = 12h et AL = A4h.

4.1.2. Le registre BX
Il est appelé registre de base. Il est utilisé aussi bien pour le calcul que pour l'adressage.
Comme AX, le registre BX est constitué de deux registres 8 bits : BL et BH.
BX = BH : BL

4.1.3. Le registre CX
C'est le registre compteur. Il est souvent employé d'une manière implicite par certaines
instructions comme compteur (instructions de boucle, traitement des chaîne des caractères, ...).
CX = CH : CL

4.1.4. Le registre DX
Appelé registre de donnée, il est utilisé implicitement par certaines instructions pour stocker des
opérandes ou des résultats.
DX = DH : DL

4.2. Les registres d'adressage


Il en existe quatre de taille 16 bits : SI, DI, SP et BP

4.2.1. Les registres SI (Source Index) et DI (Destination Index)


Appelés index de source et index de destination respectivement. Ils sont souvent utilisés dans
la gestion des tableaux et des chaînes de caractères dans la zone mémoire réservée aux données.

- 23 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

4.2.2. Les registres SP (Stack Pointer) et BP (Base Pointer)


SP et BP s'appellent pointeur de pile et pointeur de base respectivement. Ils servent à la
gestion de la pile.
Le registre SP pointe sur le sommet de la pile (voir 4.3.3).
Le registre BP permet de manipuler les données existantes dans la pile (paramètres de fonction,
variables locales, ...).

4.3. Les registres de segmentation


Du moment que le 8086 a une architecture 16 bits, les adresses qu'il gère dans un programme
sont aussi exprimées sur 16 bits. Elles s'appellent les adresses logiques. Ces adresses
permettent d'accéder aux données et aux instructions stockées dans la mémoire principale.
Exemple
L'instruction : MOV AL,[1000h] signifie : Charger le registre AL par le contenu de l'octet
d'adresse 1000h.
1000h est une adresse logique exprimée sur 16 bits.
Toutefois, l'adresse logique permet d'accéder uniquement à un espace de 216 = 64 Ko, alors que
le 8086 peut adresser jusqu'à 1 Mo de mémoire (20 lignes d'adresse). Les registres de
segmentation ont été spécialement créés pour étendre l'adresse logique à 20 bits.
Le 8086 dispose de 4 registres de segmentation : DS, CS, SS et ES. Chacun est associé à une
zone spécifique de la mémoire. En effet, lorsqu'un programme est chargé, il réserve plusieurs
zones mémoire généralement indépendantes :
• Une zone réservée aux données (octets, mots, tableaux, ...)
• Une zone réservée aux instructions (le code du programme)
• Une zone réservée à la pile

DS → Zone de données

CS → Zone de code

SS → Zone de pile

4.3.1. Registre de segment de données DS (Data Segment)


Il permet d'accéder à la zone de données.
L'adresse réelle d'une donnée est appelé adresse physique. Elle est exprimée sur 20 bits et c'est
elle qui est effectivement mise sur le bus d'adresse pour accéder à la donnée.
Dans un programme, la donnée sera désignée par une adresse logique sur 16 bits et par une
valeur de segment inscrite dans le registre DS.
L'adresse physique est définie par la formule ci-dessous :
Adresse physique = Adresse logique + (10h × DS)

- 24 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Exemple
Dans l'instruction MOV AL,[1000h], l'adresse physique, si DS = 120h, est :
Adresse physique = 1000h + (10h × 120h) = 1000h + 1200h = 02200h
Remarques
• L'adresse logique est aussi appelée déplacement ou offset.
• Une case mémoire est complètement définie par son segment et par son déplacement dans
ce segment.
• Une adresse physique a deux représentations :
• Représentation sur 20 bits.
• Représentation Segment:Offset (la plus répandue).
Exemple
0100:0000 (Segment 0100 et Offset 0000h) s'écrit sur 20 bits : 01000h
• Une même adresse physique peut être obtenue de plusieurs manières :
Soit l'adresse physique 01000h. Dans les deux cas suivants on accède à cette même case :
• DS = 0 ; Offset = 1000h → 1000h + (10h × 0) = 01000h
• DS = 100h ; Offset = 0 → 0 + (10h × 100h) = 01000h
En général, en fixant DS, on peut accéder aux adresses physiques comprises entre (DS × 10h) et
(DS × 10h) + FFFFh, soit un espace de 64 Ko. Cet espace s'appelle un segment.
Exemple

00000 DS = 0000

08000

0FFFF

DS = 0800
17FFF

FFFFF

L'adresse physique 08000h appartient en même temps aux segments DS=0 et DS=800h. Elle
peut être calculé par : DS=0 ; Offset = 8000h, ou encore par : DS = 800h ; Offset = 0.

4.3.2. Le registre de segment de code CS (Code Segment)


La zone réservée aux instructions du programme est associé au registre de segmentation CS.
Afin que le microprocesseur puisse lire un instruction dans la mémoire, il doit fournir son adresse
logique (contenue dans le registre IP) et son segment dans CS (voir 4.4.2).

4.3.3. Le registre de segment de pile SS (Stack Segment)


La pile est une zone mémoire gérée en LIFO (Last In, First out). Elle est utilisée d'une part par le
processeur pour sauvegarder l'état du système lors d'un appel à un sous-programme ou à une
interruption, et d'autre part par le programmeur pour passer des paramètres à un sous-programme

- 25 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

ou stocker temporairement des données, ...


La pile est un élément vital pour le fonctionnement du microprocesseur (voir chapitre 4 : La pile)
La zone mémoire réservée à la pile est associée au registre de segment SS.
Le pointeur de pile SP (vu en 4.2.2) contient l'adresse logique du sommet de la pile. Pour calculer
son adresse physique, la formule utilisée est :
Adresse physique du sommet de la pile = SP + (10h × SS)

4.3.4. Le registre ES (Extra Segment)


Il est utilisé implicitement par certaines instructions (manipulation des chaînes de caractères, ...). Il
permet l'accès à n'importe quelle donnée dans la mémoire.

4.4. Les registres de contrôle


Les registres de contrôle sont susceptibles de modifier le comportement du microprocesseur et
informent le programmeur de l'état de celui-ci.

4.4.1. Registre d'état SR (ou Flags)


C'est un registre constitué d'un ensemble de bits portant le nom drapeau (flag).
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF

Ces drapeaux sont divisés en deux catégories :

4.4.1.1. Indicateurs d'état


Les indicateurs d'état sont mis à jour après chaque instruction. Leur valeur indique la nature du
résultat obtenu :
Drapeau Signification Remarques
CF Carry Mis à 1 en cas d'une retenue
PF Parity Mis à 1 lorsque le nombre de 1 dans le résultat est pair
AF Auxiliary Carry Mis à 1 lorsqu'une opération engendre une retenue entre le
quartet faible et le quartet fort d'un octet
ZF Zero Mis à 1 en cas d'un résultat nul
SF Sign Mis à 1 lorsqu'un résultat est négatif
OF Overflow Mis à 1 en cas de dépassement de la capacité de calcul

Exemple
• Si AX = 0012h, l'opération AX ← AX – 0012h donne un résultat nul. Le microprocesseur met
automatiquement ZF à 1.
• Si BL = FFh, l'opération BL ← BL + 10h engendre une retenue (en effet, FFh + 10h = 0Fh
avec une retenue). CF est donc automatiquement mis à 1.
Remarque
Ces indicateurs sont souvent employés dans les sauts conditionnels (voir 6.2.3).

- 26 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

4.4.1.2. Indicateurs de contrôle


Les indicateurs de contrôle permettent de modifier le comportement du microprocesseur. Ils sont
positionnés par le programmeur.
Drapeau Signification Remarques
IF Interrupt Autorisation des interruptions :
0 : interruptions inhibées
1 : interruptions autorisées
DF Direction Sens de traitement des chaînes de caractères :
0 : sens direct
1 : sens inverse
TF Trace Mode de fonctionnement du microprocesseur :
0 : mode normal
1 : mode pas à pas

4.4.2. Registre pointeur d'instructions IP (Instruction Pointer)


IP est un compteur qui contient en permanence l'adresse de la prochaine instruction que le
microprocesseur va exécuter. Il est automatiquement mis à jour par le microprocesseur après
chaque instruction.
IP contient uniquement l'adresse logique de l'instruction, le segment se trouve dans le registre CS :
Adresse physique de la prochaine instruction à exécuter = IP + (10h × CS)

5. Les modes d'adressage


Une instruction peut exiger 0, 1 ou plusieurs opérandes.
Exemples
• 0 opérande : CLS (effacer l'écran en Basic)
• 1 opérande : sin, cos, log, ...
• 2 opérandes : addition, soustraction, ...
L'opérande peut être fourni de diverses manières :
• En donnant immédiatement sa valeur : log(12) (12 est un opérande donné en immédiat).
• En fournissant son adresse : log(a) (a est une variable stockée à une adresse dans la mémoire
de l'ordinateur).
• En spécifiant l'index de l'opérande dans un tableau : log(A[i]) (A est un tableau et i l'index de
l'opérande dans ce tableau).
Afin d'étudier des exemples sur les différents modes d'adressage, nous allons donner la syntaxe de
l'instruction de transfert MOV :
MOV destination, source
Destination est chargée par le contenu de source. Source reste inchangée.

5.1. Mode Registre


L'opérande est désigné par le contenu d'un registre.
Exemple
MOV AX,DX
Avant l'instruction Après l'instruction
AX = 12C7h AX = 5EBAh
DX = 5EBAh DX = 5EBAh

- 27 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

5.2. Mode Immédiat


Un opérande est donné en immédiat s'il constitue lui même la valeur.
Exemple
MOV SI,1240h
SI est chargé par la valeur immédiate 1240h (SI ← 1240h).
Remarque
Ce type de transfert est interdit avec les registres de segmentation (DS, CS, SS, ES).

5.3. Mode direct


Un opérande est donné en mode direct s'il est désigné par son adresse logique dans la mémoire.
Exemple 1
MOV [1200h],5Ah
La valeur 5Ah sera stockée à l'adresse logique 1200h. Pour calculer l'adresse réelle de la case
(l'adresse physique), il faut connaître la valeur stockée dans le registre de segmentation DS.
Si DS = 720h, l'adresse physique sera :
Adresse physique = (720h × 10h) + 1200h = 08400h
Exemple 2
MOV [1200h],4D59h
4D59h est une donnée sur 16 bits, elle occupera les deux octets d'adresse logique 1200h et
1201h.
Si DS = 720h, la répercussion de cette instruction sur la mémoire sera :
0720:1200 59h
0720:1201 4Dh
Rappelons que 0720:1200 est la représentation Segment:Offset de l'adresse physique 08400h.
Notez aussi la convention Little Endian dans le rangement en mémoire (octet faible (59h) en
premier lieu suivi de l'octet fort (4Dh)).

5.4. Adressage indirect


On a très souvent besoin de manipuler des tableaux ou des chaînes de caractères.

Pour accéder à un élément d'un tableau d'octets, il faut connaître l'adresse de base du tableau (ici
1202h) et l'indice i de l'élément dans le tableau.
1202 i=0
1203
1204
1205 i=3
1206

Pour lire le 4ème élément du tableau (indice i=3) en mode direct, on doit calculer son adresse :
1202h + 3 = 1205h
D'une manière générale, dans un tableau où chaque élément occupe m octets, l'adresse de
l'élément d'indice i est donnée par :
Adresse de l'élément i = adresse de base du tableau + (taille d'un élément en octets × i)

- 28 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Du moment que le traitement des tableaux fait souvent appel aux boucles, on ne peut adopter le
mode direct comme mode d'adressage. Le mode le plus adapté est le mode indirect où l'on
manipule des pointeurs plutôt que des adresses explicites

5.4.1. Mode indirect basé


L'adresse logique de l'opérande est fournie par BX ou BP avec éventuellement un déplacement
constant sur 8 ou 16 bits.
Les registres de segment utilisés pour le calcul de l'adresse physique sont : DS pour BX et SS pour
BP. Ceci signifie que BX sera utilisé comme pointeur sur une donnée dans le segment de données
(registre DS), alors que BP sera employé pour accéder aux informations stockées dans la pile
(registre SS).
On note un opérande fourni en adressage indirect basé par [BX] ou [BP].
Exemple 1
Soit BX = 1342h et DS = 1072h et soit l'instruction :
MOV [BX],0768h
• L'adresse logique : 1342h
• L'adresse physique : 1342h + (10h × 1072h) = 11A62h
Ici, la donnée 0768h sera stocké à l'adresse pointée par BX, soit : 11A62h.
La donnée étant sur 16 bits, le résultat de cette instruction sera :
11A62h 68h
11A63h 07h

Exemple 2
Soit : BP = F415h ; SS = 0784h ; AX = 76E4h
MOV [BP]7Ah,AL
Autre écriture : MOV [BP+7Ah],AL
La valeur 7Ah est un déplacement constant sur 8 bits. Ce déplacement est ajouté au contenu de
BP pour former l'adresse logique.
• L'adresse logique : F415h + 7Ah = F48Fh
• L'adresse physique : F48Fh + (10h × 1072h) = 16CCFh
L'octet d'adresse 16CCFh recevra la valeur E4h (contenu de AL). Cet octet appartient évidemment
à la pile (registre SS).

5.4.2. Mode indirect indexé


L'adresse logique est fournie par l'un des registres d'index SI ou DI avec éventuellement un
déplacement constant sur 8 ou 16 bits.
SI et DI sont des pointeurs utilisés dans la zone des données. Le registre de segment employé est
DS.
Exemple 1
Soit SI = 24ABh ; DI = C140h ; DS = A1BAh
MOV [SI+1000h],142Bh
• L'adresse logique : 24ABh + 1000h = 34ABh
• L'adresse physique : 34ABh + A1BA0h = A504Bh (ou bien A1BA:34AB)

- 29 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Résultat de l'instruction :
A1BA:34AB 2Bh
A1BA:34AC 14h

Exemple 2
Soit le programme suivant :
MOV AX,A1BAh
MOV DS,AX
MOV DI,C140h
MOV AX,1412h
MOV [DI],AX

Dans la dernière instruction où l'adressage indirect indexé est employé :


• L'adresse logique : C140h
• L'adresse physique : A1BA0h + C140h = ADCE0h
Résultat de l'instruction :
ADCE0h 12h
ADCE1h 14h

5.4.3. Mode indirect basé-indexé


Dans ce mode, les modes indexé et basé sont combinés. L'adresse logique est donnée par BX/BP
et SI/DI. Quatre cas sont possibles :
Avec le registre BX (et le registre de segmentation DS) :
• BX + SI + déplacement éventuel sur 8 ou 16 bits
• BX + DI + déplacement éventuel sur 8 ou 16 bits
Avec le registre BP (et le registre de segmentation SS) :
• BP + SI + déplacement éventuel sur 8 ou 16 bits
• BP + DI + déplacement éventuel sur 8 ou 16 bits
Ce type d'adressage est très utile dans le traitement des chaînes de caractères ou dans le cas de
traitement simultané de tableaux. En effet, en faisant pointer BX sur le début d'une chaîne de
caractères, SI peut être utilisé comme index pour accéder aux différents caractères.
Exemple
Soit : SS = 1240h ; BP = 42A8h ; SI = 4010h
MOV [BP+SI],12h
Autre écriture : MOV [BP][SI],12h
• L'adresse logique : BP + SI = 82B8h
• L'adresse physique : 10h × SS + 82B8h = 1A6B8h
L'octet d'adresse 1A6B8h sera chargé par la valeur 12h.

6. Les instructions de la famille INTEL 80x86


On peut classer les instructions du 8086 en 5 catégories :
1. Instructions de transfert
2. Instructions arithmétiques
3. Instructions logiques

- 30 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

4. Instructions de manipulation de bits


5. Instructions de branchement
Remarques
• Tous les successeurs du 8086 (80286, 80386, 80486, Pentium) sont compatibles avec son jeu
d'instruction. Ainsi, tous les programmes écrits pour le 8086 peuvent être exécutés sur un PC
équipé d'un microprocesseur Pentium sans le moindre problème.
• Le 80386 et ses successeurs ont une architecture 32 bits. Les registres ont gardé leur même
nomination avec l’ajout du préfixe E (Extended) pour indiquer leur taille de 32 bits : EAX,
EBX, ESI, EDI, EBP, ... Les instructions ont été aussi étendus sur les opérations 32 bits. Ainsi
sur un Pentium, toutes les opérations suivantes sont possibles :
Sur 32 bits : MOV EAX,EBX
Sur 16 bits : MOV AX,BX (AX et BX sont les 16 bits de poids faible de EAX et EBX)
Sur 8 bits : MOV AL,BL
Cependant, le 80386 et ses successeurs ne peuvent fonctionner en 32 bits que sous un mode
appelé mode protégé.
Sur les pages suivantes vous trouverez un résumé des principales instructions du 8086 avec des
exemples d'application.

6.1. Résumé des principales instructions


(Voir pages suivantes)

- 31 -
INSTRUCTIONS DU 8086
(Résumé des principales instructions)

1. Instructions de transfert
Syntaxe Rôle Remarques Exemples
MOV destination , source Transfère le contenu de source vers destination et source doivent être de même MOV AX,5BC3h (registre 16 bits)
destination : taille (8 bits ou 16 bits). MOV CL,4Eh (registre 8 bits)
destination ← source Sont interdits : MOV AX,[1200h] (adressage direct)
le transfert mémoire, mémoire (MOV MOV [BX],CL (adressage basé)
[100h],[1200h]) ...
le transfert registre de segmentation, valeur
immédiate (MOV DS,1200h)

2. Instructions arithmétiques
- 33 -

Syntaxe Rôle Remarques Exemples

Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI


ADD destination , source Effectue une addition entre destination et S'il y a une retenue le drapeau CF (Carry) est mis ADD DX,1000h
source : à 1. (addition sur 16 bits : DX←DX+1000h)
destination ← destination + source destination et source doivent être de même ADD BH,F1h
taille (8 bits ou 16 bits). (addition sur 8 bits : BH←BH+F1h)
Tous les registres sont utilisables sauf les registres ADD AL,[1205h] (adressage direct)
de segment. ADD CL,[SI] (adressage indexé)
l'addition mémoire, mémoire est interdite. ...
ADC destination , source Effectue une addition entre destination et Mêmes remarques que ADD ADC DX,300h (DX←DX+300h + CF)
source avec la retenue CF : Si DX=500h et CF=1 alors DX prendra
destination ← destination + source + CF la valeur 801h

INC destination Incrémente destination destination est un registre de 8 ou 16 bits. INC DI


destination ← destination + 1
Syntaxe Rôle Remarques Exemples
SUB destination , source Effectue une soustraction entre Mêmes remarques que ADD SUB CH,BL (CH←CH-BL)
destination et source :
destination ← destination - source

DEC destination Décrémente destination destination est un registre de 8 ou 16 bits. DEC BH


destination ← destination - 1
MUL source Effectue une multiplication entre AX (ou Multiplication sur 8 bits : MUL DH (AX←AL x DH)
AL) et source : source est un registre 8 bits ou une adresse
Sur 8 bits : mémoire
AX ← AL x source Multiplication sur 16 bits :
Sur 16 bits : source est un registre 16 bits ou une adresse
DX:AX ← AX x source mémoire
DIV source Effectue une division entre AX (ou DX:AX) Division sur 8 bits : DIV CL (AL←AX / CL, reste dans AH)
et source : source est un registre 8 bits ou une adresse
Sur 8 bits : mémoire
AL ← AX / source (reste dans AH) Division sur 16 bits :
- 34 -

Sur 16 bits : source est un registre 16 bits ou une adresse


AX ← DX:AX / source (reste dans DX) mémoire

Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI


3. Instructions logiques
Syntaxe Rôle Remarques Exemples
AND destination , source Effectue un ET logique entre destination destination et source doivent être de même AND DH,CL
et source : taille. Ils peuvent être des registres de 8 ou 16 Si DH=F4h et CL=3Fh alors :
destination ← destination ET source bits ou des cases mémoire. DH ←DH ET CL = 34h
OR destination , source Effectue un OU entre dest. et source : même remarque que AND OR SI,BP
destination ← destination OU source
XOR destination , source Effectue un OU exclusif entre destination même remarque que AND XOR CH,AL
et source : Si CH=42h et AL=9Ah alors :
destination ← destination ⊕ source CH ← CH ⊕ AL = D8h
NOT destination Effectue le complément de destination : destination peut être un registres de 8 ou 16 bits NOT DL
destination ← destination ou une case mémoire. Si DL=C1 alors : DL ← DL = 3Eh
4. Instructions de manipulation de bits
Syntaxe Rôle Remarques Exemples
(1) SHR destination , 1 Réalise un décalage à droite de décalage d'un seul bit à droite SHR AL,CL
(2) SHR destination , CL destination décalage de n bits à droite tel que n est la valeur Si AL=7Ah et CL=4 alors AL←07h
stockée dans CL
(1) SHL destination , 1 Réalise un décalage à gauche de (1) décalage d'un seul bit à gauche SHL BL,1
(2) SHL destination , CL destination (2) décalage de n bits à gauche (CL=n) Si BL=41h alors BL←82h
(1) ROR destination , 1 Réalise un rotation à droite de destination (1) rotation d'un seul bit à droite
(2) ROR destination , CL (2) rotation de n bits à droite (CL=n)
(1) ROL destination , 1 Réalise un rotation à gauche de (1) rotation d'un seul bit à gauche
(2) ROL destination , CL destination (2) rotation de n bits à gauche (CL=n)
(1) RCR destination , 1 Réalise un rotation à droite de destination (1) rotation d'un seul bit à droite
(2) RCR destination , CL à travers le bit CF (2) rotation de n bits à droite (CL=n)
(1) RCL destination , 1 Réalise un rotation à gauche de (1) rotation d'un seul bit à gauche RCL BL,CL
(2) RCL destination , CL destination à travers CF (2) rotation de n bits à gauche (CL=n) Si BL=72h, CL=2 et CF=0 alors :
BL←C8h et CF←1
- 35 -

5. Instructions de branchement

Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI


Syntaxe Rôle Remarques Exemples
JMP Etiquette Effectue un saut inconditionnel à
l'instruction marquée par Etiquette
CALL Etiquette Effectue un appel au sous-programme Le sous-programme appelé doit obligatoirement
marqué par Etiquette. se terminer par l'instruction de retour RET
CMP destination , source Effectue l'opération : destination - source source et destination ne sont pas modifiés
et positionne les drapeaux du registre Cette instruction précède en général un saut
d'état. conditionnel
JE Etiquette Effectue un saut à Etiquette si égal CMP AL,5Ah
JE suite (saut à suite si AL=5Ah)
JNE Etiquette Effectue un saut à Etiquette si différent CMP SI,3B00h
JNE boucle (saut à boucle si SI≠3B00h)
JL,JLE Etiquette Effectue un saut à Etiquette si inférieur ou La comparaison est effectuée en binaire signé CMP CL,30h
inférieur ou égal respectivement JL fleur (saut à fleur si CL<30h)
Syntaxe Rôle Remarques Exemples
JG,JGE Etiquette Effectue un saut à Etiquette si supérieur La comparaison est effectuée en binaire signé CMP DH,FFh - JG fleur2
ou supérieur ou égal respectivement Si DH=2, il y aura saut car 2>-1 (FF en
binaire signé)
JB,JBE Etiquette Effectue un saut à Etiquette si inférieur ou La comparaison est effectuée en binaire non
inférieur ou égal respectivement signé
JA,JAE Etiquette Effectue un saut à Etiquette si supérieur La comparaison est effectuée en binaire non CMP DH,FFh - JA fleur2
ou supérieur ou égal respectivement signé Si DH=2, il n'y aura pas de saut car
2<255 (FF en binaire non signé)
JZ,JC,JP,JS,JO Etiquette Effectue un saut à Etiquette si le drapeau ADD AL,14h
ZF, CF, PF, SF, OF respectivement est à 1 JC Trai_Re (Saut à Trai_Re en cas de
retenue)
JNZ,JNC,JNP,JNS,JNO Effectue un saut à Etiquette si le drapeau SUB AX,185Eh
Etiquette ZF, CF, PF, SF, OF respectivement est à 0 JNZ suite (Saut à suite si le résultat de
la soustraction n'est pas nul)

6. Instructions de contrôle et de gestion de la pile


- 36 -

Syntaxe Rôle Remarques Exemples


CLC, CLD, CLI Met à zéro les drapeaux CF, DF et IF

Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI


respectivement
STC, STD, STI Met à un les drapeaux CF, DF et IF
respectivement
CMC Complémente le bit de retenue CF
NOP N'effectue aucune opération Instruction utilisée en général pour allonger la
durée d'une boucle ou occuper un espace non
utilisé.
PUSH source Empile source source doit être un registre de 16 bits ou un PUSH AX
pointeur vers une adresse. PUSH [SI]
Le pointeur de pile SP est décrémenté de 2
POP destination Dépile le sommet de la pile vers destination doit être un registre de 16 bits ou un POP DS
destination pointeur vers une adresse. POP [BX]
Le pointeur de pile SP est incrémenté de 2
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

6.2. Les sauts


Ils sont également appelés des branchements, ils permettent de poursuivre l'exécution du
programme à un point spécifique du programme avec ou sans condition préalable.
Les appels aux sous-programmes sont des sauts particuliers où l'appel peut être exécuté de
plusieurs endroits du programme. Le retour s'effectue à l'instruction se trouvant juste après l'appel.
Les sauts sont classés en deux catégories :
1. Les sauts inconditionnels
2. Les sauts conditionnels

6.2.1. Notion d'étiquette


Quand on écrit un programme en langage assembleur, on peut désigner certaines instructions par
des étiquettes (labels). Une étiquette joue le rôle de référence lorsqu'on désire effectuer un saut à
l'instruction marquée.
Une étiquette peut être n'importe quel texte suivi de deux points (:). Elle est mise juste avant
l'instruction à marquer.
Exemple :
DEBUT: MOV AX,1000h
MOV DS,AX
TestRS: MOV AH,01
INT 21H
XOR AH,AH
MOV BL,0AH
Suite1: DIV BL
JZ TestRS

DEBUT, TestRS et Suite1 sont des étiquettes.


La dernière ligne du programme fait référence à l'étiquette TestRS par l'instruction de saut
conditionnel JZ.

6.2.2. Les sauts inconditionnels


Ces sauts ont lieu après l'exécution d'une instruction de saut sans respect préalable d'une
quelconque condition.

6.2.2.1. L'instruction JMP


Syntaxe : JMP Etiquette
Dès que le microprocesseur rencontre cette instruction, il continue l'exécution à l'instruction
indiquée par Etiquette.
L'exécution se poursuit normalement et aucune mémorisation de l'endroit d'appel n'est faite.
Exemple
MOV CH,AL
MOV CL,4
SHR AL,CL
JMP Suite
MOV AL,CH
Suite: AND AL,0FH
XOR DX,DX

Dans cet exemple, l'instruction MOV AL,CH sera ignorée. L'instruction exécuté après SHR AL,CL
sera AND AL,0Fh.

- 37 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Remarque
Une étiquette représente l'adresse de l'instruction qu'elle désigne. Si l'instruction AND AL,0Fh est
située à l'adresse 1200h, cette valeur sera affectée à l'étiquette Suite.
Lorsque le microprocesseur exécute l'instruction JMP Suite, il charge le pointeur d'instructions IP
par l'adresse stockée dans Suite, soit dans notre cas IP ← 1200h. Ceci provoque immédiatement
la poursuite du programme à l'adresse 1200h.

6.2.2.2. L'instruction CALL


Syntaxe : CALL Etiquette
Cette instruction permet d'appeler un sous-programme.
Un sous-programme est une suite d'instructions qui effectuent un traitement donné. Les sous-
programmes permettent d'améliorer la lisibilité et évitent surtout les répétitions lorsqu'on désire
effectuer un même traitement à plusieurs endroits du programme.
Un sous-programme doit être terminé par l'instruction de retour RET et sa première instruction
désignée par une étiquette qui servira de référence d'appel.
En rencontrant l'instruction CALL, le microprocesseur suit le même comportement que pour JMP
à la différence qu'il mémorise l'endroit d'appel pour y retourner à la fin du sous-programme.
Exemple
MOV DL,41h
CALL Affich ;Premier appel au sous-programme Affich
1er Retour
XOR BL,BL ;instruction exécutée après le premier appel
ADD DL,05h
CALL Affich ;Deuxième appel au sous-programme Affich
2ème Retour
OR AL,0Fh ;instruction exécutée après le deuxième appel
.....

Affich: MOV AH,2 ;Début du sous-programme


INT 21H
RET ;Fin du sous-programme (instruction de retour)

Remarque
L'adresse de retour est mémorisée dans la pile au moment de l'appel. En arrivant à la fin du sous-
programme (instruction RET), le microprocesseur récupère l'adresse de retour de la pile et
continue l'exécution à cette adresse (pour plus de détails, voir chapitre 4 : La pile paragraphe 1.2).

6.2.3. Les sauts conditionnels


Les sauts conditionnels ont lieu si une condition est vérifiée. Ils dépendent en réalité des différents
drapeaux du registre d'état (CF, ZF, PF, ...).
Avant d'effectuer un saut conditionnel, il faut positionner les drapeaux pour traduire la condition à
vérifier. Dans la plupart des cas, les sauts conditionnels sont précédés par deux instructions de
comparaison : CMP ou TEST. Ceux deux instructions n'ont AUCUNE influence sur les opérandes
qu'on compare. Leur seul rôle est de positionner les drapeaux en fonction du résultat de la
comparaison.

6.2.3.1. L'instruction CMP


Syntaxe : CMP destination,source
destination et source restent inchangés.
CMP réalise une soustraction entre les deux opérandes :
destination – source

- 38 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

En fonction du résultat de cette opération, les drapeaux du registre d'état sont positionnés.
Exemple
CMP AL,50h
Si AL = 50h, la soustraction donnera un résultat nul. Par conséquent, ZF sera mis à 1.
Ainsi, en examinant ZF après cette instruction, on peut vérifier si AL=50h ou non.

6.2.3.2. L'instruction TEST


Syntaxe : TEST destination,source
destination et source restent inchangés.
TEST effectue un ET logique entre les deux opérandes :
destination AND source
Les drapeaux sont positionnés en fonction du résultat de cette opération.
Exemple
TEST BL,BL
• Si BL = 00h, le ET donnera un résultat nul. Par conséquent, ZF sera mis à 1.
• Si BL est différent de 00, le résultat du ET sera non nul, donc ZF sera mis à 0.
Donc, pour vérifier si BL est nul ou non, il suffit de tester l'état de ZF juste après cette instruction.

7. Codage des instructions


Les instructions et leurs opérandes sont stockés en mémoire principale. La taille du code d'une
instruction dépend du type de l'instruction ainsi que de la taille de l'opérande et du mode
d'adressage utilisé.
Une instruction se compose en général de deux champs :
• Le code opération qui représente l'instruction
• Le champ opérande qui représente la donnée ou la référence à la donnée (son adresse ou le
registre pointeur utilisé)

Code opération Opérande


(1 ou 2 octets) (0,1,2,.. octets)
Exemples
• MOV AX,125Eh est codée sur 3 octets : B8 5E 12 (B8 : code opération MOV AX; 5E 12 :
opérande donnée en immédiat)
• INC AX est codée sur un seul octet : 40
Le codage des instructions est l'une des tâches du compilateur assembleur. Sur la page suivante,
vous trouverez quelques instructions avec leur code opération.
Le microprocesseur ne reconnaît en réalité que les codes opérations avec leurs opérandes rangés
dans la mémoire principale.

- 39 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Prenons une zone de 9 octets du segment de code (CS=1F6Fh) à partir de l'offset 0100h. Le
contenu hexadécimal de cette zone est le suivant :
B8 00 12 01 D8 A1 20 5E 52

Ces octets représentent le code des instructions suivantes :


1F6F:0100 B80012 MOV AX,1200
1F6F:0103 01D8 ADD AX,BX
1F6F:0105 A1205E MOV AX,[5E20]
1F6F:0108 52 PUSH DX

Pour obtenir le code des instructions d'un programme assembleur, lancez le compilateur
assembleur comme indiqué ci-dessous (le programme à compiler est dans ce cas test.asm) :

C:\LANG\ASM\Ginfo>masm test.asm
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.

Object filename [test.OBJ]: <ENTREE>


Source listing [NUL.LST]: test.lst
Cross-reference [NUL.CRF]: <ENTREE>

Le fichier généré avec l'extension .lst contient le listing des instructions avec leur code.

Code opération de quelques instructions


Code Nb. Exemple
Mnémoniques
opération d'octets Instruction Code
MOV AX,valeur B8 3 MOV AX,1200h B8 00 12
MOV AX,[adresse] A1 3 MOV AX,[4050h] A1 50 40
MOV [adresse],AX A3 3 MOV [2010h],AX A3 10 20
ADD AX,valeur 05 3 ADD AX,25A8h 05 A8 25
ADD AX,[adresse] 03 06 4 ADD AX,[14CCh] 03 06 CC 14
SUB AX,valeur 2D 3 SUB AX,5087h 2D 87 50
SUB AX,[adresse] 2B 06 4 SUB AX,[A50Dh] 2B 06 0D A5
SHR AX,1 D1 E8 2
SHL AX,1 D1 E0 2
INC AX 40 1
DEC AX 48 1
CMP AX,valeur 3D 3 CMP AX,2000h 3D 00 20
CMP AX,[adresse] 3B 06 4 CMP AX,[350Ah] 3B 06 0A 35
JMP adresse EB 2
JE adresse 74 2
Le codage dépend de l'offset de
JNE adresse 75 2
l'instruction de saut
JA adresse 77 2
JB adresse 72 2
INT n° CD 2 INT 21h CD 21

- 40 -
CHAPITRE

4 La pile et ses utilisations

1. Structure de la pile
La pile est une zone mémoire gérée en LIFO (Last In, First Out), c'est à dire : le dernier élément
entré sera le premier sorti. On peut assimiler une pile à un tube vertical dans lequel on mettra des
pièces de monnaie. La seule pièce qu'on peut retirer est la dernière pièce empilée, celle qui existe
au sommet.
La pile n'est en réalité qu'une simple zone mémoire dans laquelle sont stockées des données
parvenant soit du microprocesseur soit du programme. Avec les langages évolués (Pascal, C, ...) sa
présence est quasiment obligatoire.
Le sommet de la pile représente la dernière donnée empilée. Afin de le repérer dans la mémoire,
le registre SP (avec SS comme registre de segment) y pointe en permanence. Affecter
(imprudemment) une autre valeur à SP au cours du programme signifie la perte l'adresse du
sommet de la pile donc de toutes les données qui y existaient, ce qui se solde, dans la plupart des
cas, par un blocage du système.

SS:SP → Sommet de la pile


Zone de
pile

2. Accès à la pile
Vu la structure de la pile, les deux opérations permises sont :
• Empiler une donnée (instruction PUSH)
• Dépiler une donnée (instruction POP)
Pour le 8086, les données empilées et dépilées sont toujours sur 16 bits.

2.1. L'empilement
L'empilement d'une donnée est réalisé par l'instruction :
PUSH donnée
Où donnée est un registre 16 bits ou un emplacement mémoire désigné par adressage direct ou
indirect.
L'empilement s'effectue en deux étapes :
• SP ← SP – 2 : on fait reculer SP de deux cases (donnée sur 16 bits), pour qu'il pointe sur le

- 41 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

nouveau sommet susceptible de recevoir la donnée à empiler.


• [SP] ← donnée : le sommet de la pile reçoit la donnée.
Exemple
Soit AX = 1225h et soit l'instruction : PUSH AX
• Etat de la pile avant l'empilement :
55h
68h
8Bh
SS:SP → 4Ah Donnée déjà
96h empilée
• Après l'empilement :
55h
SS:SP → 25h
12h
4Ah
96h

2.2. Le dépilement
Le dépilement est l'opération qui permet de retirer le sommet de la pile et le stocker dans une
destination. Il est réalisé par l'instruction :
POP destination
destination est un registre 16 bits ou un emplacement mémoire désigné par adressage direct ou
indirect.
Le dépilement engendre deux opérations :
• destination ← [SP] : le sommet de la pile est copié dans destination.
• SP ← SP + 2 : la donnée du sommet étant retirée, on fait avancer SP pour pointer sur la
donnée suivante.
Exemple
Considérons l'instruction : POP DX
• Etat de la pile avant l'instruction :
80h
SS:SP → 39h
Sommet de la pile
58h
2Fh
9Ah
• Après l'instruction :
80h
39h
58h
SS:SP → 2Fh
Nouveau sommet
9Ah

Le registre DX est chargé par la valeur 5839h.


Remarque
L'instruction POP ne détruit pas la donnée existante au sommet de la pile, elle fait tout simplement

- 42 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

avancer SP pour pointer sur la donnée suivante (le nouveau sommet).

3. Utilisations de la pile

3.1. Stockage temporaire


L'une des utilisations les plus classiques de la pile est le stockage temporaire des données. Ceci se
manifeste notamment dans les cas suivants :

3.1.1. Le manque de registres


Parfois, on a besoin de faire une opération faisant intervenir un registre spécifique alors qu'il
contient une donnée importante. On peut soit sauvegarder son contenu dans un registre libre soit,
si tous les registres sont utilisés, sauvegarder temporairement son contenu dans la pile et le
récupérer après l'opération.
Exemple
MOV AX,2100h
PUSH CX ;ici j'ai besoin de CX → j'empile son contenu
MOV CL,4 ;CL est utilisé pour effectuer un décalage
SHL AX,CL
POP CX ;je récupère le contenu de CX de la pile

3.1.2. La sauvegarde des registres dans un sous-programme


Afin d'illustrer ce cas, d'ailleurs très répandu, nous allons examiner un exemple :
MOV DX,2100h
CALL RCh
ADD DX,0002 ;ici on suppose que DX=2100h mais il n'en est rien !!
...
RCh: MOV DL,0Dh ;DX est modifié dans le sous-programme !!!
MOV AH,02h
INT 21h
RET
Dans le programme principal, le registre DX est chargé par 2100h avant l'appel du sous-
programme RCh. Celui-ci, pour effectuer son traitement, affecte une nouvelle valeur à DL et AH.
Au retour du sous-programme, DX ne contient plus sa valeur initiale 2100h mais plutôt la valeur
210Dh. En ne faisant pas attention à ce type d'erreur, le programme peut donner des résultats
complètement aberrants.
Pour remédier à ce problème, on sauvegarde le contenu des registres qui seront utilisés au début
du sous-programme et on les restaure juste avant le retour (dans le sens inverse évidemment). De
cette manière, le sous-programme reste complètement transparent vis-à-vis du programme
principal :
RCh: PUSH AX ;sauvegarde de AX dans la pile
PUSH DX ;sauvegarde de DX dans la pile
MOV DL,0Dh
MOV AH,02h
INT 21h
POP DX ;récupération de DX
POP AX ;récupération de AX
RET

3.2. Les appels aux sous-programmes et la pile


La pile joue un rôle fondamental dans les appels aux sous-programmes, car, rappelons-le, un
sous-programme peut être appelé de plusieurs endroits du programme et le retour s'effectue à
l'instruction se trouvant juste après l'appel. La question qui se pose alors est : Comment le
microprocesseur se rappelle-t-il de l'adresse de retour ? c'est dans la pile, en effet, qu'il sauvegarde
cette adresse.

- 43 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Avant d'aborder en détail le processus d'appel, il y a lieu de distinguer entre deux types d'appel :
l'appel proche (NEAR) et l'appel lointain (FAR).
Il s'agit d'un appel NEAR lorsque le sous-programme existe à l'intérieur du même segment que le
programme appelant, il suffit alors de sauvegarder l'offset de l'adresse de retour au moment de
l'appel. Par contre, lors d'un appel FAR, le segment doit aussi être sauvegardé car le sous-
programme et le programme appelant appartiennent à deux segments différents.
Regardons l'exemple suivant qui représente un appel de type NEAR :
18A4:0100 MOV BX,1528h
18A4:0103 CALL 3255h ;ici IP=0108h, cette valeur est empilée
18A4:0108 XOR AX,AX

18A4:3255 ADD BX,1254h


18A4:3259 MOV DL,BL
18A4:325B RET ;le sommet de la pile (0108h) est dépilé dans IP

Au moment de l'appel : CALL 3255h, le registre IP pointe sur l'instruction se trouvant juste après,
soit : XOR AX,AX donc IP = 0108h. Cette valeur (qui représente l'offset l'adresse de retour) est
empilée automatiquement par le microprocesseur (l'équivalent de PUSH IP). Le registre IP est
chargé ensuite par 3255h ce qui provoque le branchement au sous-programme.
L'instruction RET se trouvant à la fin du sous-programme ne fait, en réalité, que dépiler le sommet
de la pile dans le registre IP (l'équivalent de POP IP). Etant donné que la dernière valeur empilée
était 0108h, l'exécution du programme se poursuit à cette adresse. On est bien retourné au
programme principal.
Dans un appel de type FAR, le contenu des deux registres CS et IP est empilé au moment de
l'appel car tous les deux seront chargés par l'adresse du sous-programme appartenant, dans ce
cas, à un autre segment. Au retour, CS et IP sont dépilés ce qui provoque la poursuite de
l'exécution du programme appelant.
Une erreur classique (et fatale !!)
Il se peut qu'on ait besoin, durant un sous-programme, de stocker temporairement des données
dans la pile. On en a tout à fait le droit ! mais ce qui est grave c'est de les oublier dans la pile.
Regardons cet exemple :
18A4:0800 CALL 1500h ;l'adresse de retour 0805h est empilée
18A4:0805 XOR AX,AX

18A4:1500 MOV CX,1320h


18A4:1503 PUSH CX ;le contenu de CX (1320h) est empilé
18A4:1504 ADD CL,2
18A4:1507 RET ;le sommet de la pile est 1320h ! donc IP ← 1320h

Au moment de l'appel, l'adresse de retour (0805h) est empilée.


Au cours du sous-programme le contenu de CX (1320h) est empilé par l'instruction PUSH CX.
Ainsi, juste avant le retour, la pile se trouve à cet état :

SS:SP → 20h Contenu de cx


13h (oublié dans la pile !)
05h
L'adresse de retour
08h

L'instruction RET ne faisant que dépiler le sommet de la pile dans IP, c'est la valeur 1320h qui sera
chargée dans IP et non pas 0805h qui est la véritable adresse de retour. Conséquence : le
programme se poursuivra à l'adresse 18A4:1320 dont on ignore complètement le contenu !

- 44 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

En conclusion : Avant le retour, il faut dépiler toutes les données stockées dans la pile
au cours du sous-programme sinon le programme risque de se perdre !

3.3. Passage des paramètres à un sous-programme


Un sous-programme, comme on sait, est un suite d'instructions chargée de réaliser un traitement
donnée. Dans beaucoup de cas, ce traitement s'effectue sur la base d'un certain nombre de
paramètres que le sous-programme doit recevoir. En langage C, par exemple, les paramètres sont
définis dans la déclaration de la fonction :
int Somme (int x, int y)

En assembleur, les sous-programmes n'ont pas de déclaration et c'est au programmeur que revient
le choix du mode de passage des paramètres au sous-programme.
Généralement, trois modes sont utilisées : le passage des paramètres dans les registres, dans des
variables (cases mémoires) ou dans la pile.

3.3.1. Passage des paramètres dans les registres


C'est la manière la plus simple et la plus rapide. Cependant, elle est limité par le nombre des
registres libres au moment de l'appel.
Exemple
Le sous-programme Somme reçoit deux paramètres dans AX et BX et retourne le résultat (qui est
une simple addition de AX et BX) dans CX.
Somme: MOV CX,AX
ADD CX,BX
RET

Avant d'appeler ce sous-programme, il faut charger les opérandes dans AX et BX. Après l'appel,
on peut utiliser le résultat rendu dans CX :
MOV AX,5h ;Premier opérande dans AX
MOV BX,10h ;Second opérande dans BX
CALL Somme ;Appel du sous-programme
SHL CX,1 ;Utilisation du résultat retourné dans CX ...

3.3.2. Passage des paramètres dans des cases mémoire


Cette méthode est moins rapide mais peut être utilisée en cas de manque de registres. Elle n'est
pas toujours efficace surtout en présence d'un grand nombre de sous-programmes et d'appels
mutuels où l'on peut confondre les paramètres d'un sous-programme avec ceux de l'autre. On peut
certainement prévoir pour chaque sous-programme des variables indépendantes mais ceci risque
d'être pénalisant au niveau de l'espace mémoire.
Exemple
Réécrivons le sous-programme Somme vu précédemment avec ce mode de passage de
paramètres (le résultat est toujours retourné dans CX):
Somme: MOV CX,[1000h] ;Premier paramètre
ADD CX,[1008h] ;Second paramètre
RET

L'appel au sous-programme sera précédé par le chargement des paramètres :


MOV [1000h],5h ;Premier opérande dans la case [1000h]
MOV [1008h],10h ;Second opérande dans la case [1008h]
CALL Somme ;Appel du sous-programme
SHL CX,1 ;Utilisation du résultat retourné dans CX ...

3.3.3. Passage des paramètres dans la pile


C'est la méthode employé dans tous les langages évolués. En effet, le nombre de paramètres n'est

- 45 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

limité ici que par la taille de la pile. Un grand avantage de cette méthode est qu'un sous-
programme peut appeler un autre sans perdre ses propres paramètres, il peut même s'auto-
appeler (sous-programme récursif) sans altérer les paramètres reçus pour chaque appel (ceux-ci
restent, évidemment, sauvegardés dans la pile).
Exemple
Avant d'écrire la version de notre sous-programme Somme en utilisant la pile comme moyen de
passage de paramètre, nous allons analyser l'appel effectué au programme principal :
MOV AX,5h
PUSH AX ;Premier opérande empilé
MOV AX,10h
PUSH AX ;Second opérande empilé
CALL Somme ;Appel du sous-programme
1250h SHL CX,1 ;résultat dans CX

Les deux paramètres sont empilés avant l'instruction CALL. Celle-ci à son tour empile l'adresse de
retour qu'on supposera 1250h. L'état de la pile tout à fait au début du sous-programme est le
suivant :

SS:SP → 50h
L'adresse de retour
12h
10h
Paramètre 2
00h
05h
Paramètre 1
00h

Le pointeur de pile ne devant pas être modifié, on utilise le registre BP pour accéder aux
paramètres stockés dans la pile du fait qu'il est associé, lui aussi, au registre de segment SS.
Faisons pointer BP sur le sommet de la pile :
MOV BP,SP

En utilisant BP comme référence, l'adresse des différents éléments de la pile sera :

BP → SP → 50h
L'adresse de retour
12h
BP+2 → 10h
Paramètre 2
00h
BP+4 → 05h
Paramètre 1
00h

D'où, finalement, le sous-programme Somme :


Somme: MOV BP,SP
MOV CX,[BP+2] ;Premier paramètre
ADD CX,[BP+4] ;Second paramètre
RET

Après le retour, la pile contient encore les deux paramètres :

SS:SP → 10h
Paramètre 2
00h
05h
Paramètre 1
00h

- 46 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Puisqu'ils deviennent inutiles, il faut les retirer de la pile juste après le retour du sous-programme
en faisant avancer SP de 4 cases :
CALL Somme ;Appel du sous-programme
ADD SP,4 ;Elimination des paramètres de la pile
SHL CX,1 ;exploitation du résultat retourné dans CX

Remarque
Dans cet exemple, c'est le programme principal qui retire les paramètres de la pile après l'appel
(ADD SP,4). Cette convention est adopté en langage C.
En Pascal, c'est le sous-programme qui retire les paramètres de la pile par une instruction de retour
particulière : RET n, celle-ci retourne au programme appelant tout en faisant avancer SP de n
cases ce qui permet d'éliminer les paramètres. La version Pascal de notre exemple sera donc :
MOV AX,5h
PUSH AX ;Premier opérande empilé
MOV AX,10h
PUSH AX ;Second opérande empilé
CALL Somme ;Appel du sous-programme
SHL CX,1 ;les paramètres sont déjà éliminé par RET 4 !
....
Somme: MOV BP,SP
MOV CX,[BP+2] ;Premier paramètre
ADD CX,[BP+4] ;Second paramètre
RET 4 ;retour en faisant avancer SP de 4 (SP ← SP+4)

- 47 -
CHAPITRE

5 Les interruptions

1. Introduction
Soit le système à microprocesseur suivant :

Vol

Centrale Ascenseur
Système
d'alarme à µP
Incendie

Le microprocesseur analyse en permanence les signaux d'entrée :


Si (vol = 1) alors appeler la police
Si (ascenseur = 1) alors appeler la compagnie d'ascenseurs (panne d'ascenseur)
Si (incendie = 1) alors appeler les pompiers

Programme
Tant que (vol=0) et (incendie=0) et (ascenseur=0) faire { }
Au cas où :
Vol=1 : appel de la police
Asc=1 : appel de la compagnie d'ascenseurs
Feu=1 : appel des pompiers
Recommencer

Inconvénient
Si l'ascenseur se bloque et juste après une incendie se déclare, le microprocesseur sera occupé par
l'appel de la compagnie d'ascenseurs alors qu'il est plus urgent d'appeler les pompiers.
En conclusion, il faut que la procédure de la panne d'ascenseur ou celle du vol soit interrompue
dès l'apparition d'une incendie pour traiter la procédure du feu.

Solution
On peut glisser entre chaque deux instructions un test du signal d'incendie. Mais cette solution
ralentit l'exécution du programme et prend de la place mémoire.
Une autre solution consiste à prévenir matériellement le microprocesseur pour traiter la procédure
de l'incendie.

- 48 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

En effet, le 8086 possède 3 entrées appelées entrées d'interruption dont le rôle est d'aviser le
microprocesseur matériellement des événements extérieurs.

INTR

NMI 8086
RESET

2. Types d'interruptions

2.1. Définition d'une interruption


Une interruption est une demande non prévisible adressée au microprocesseur. Elle provoque
l'arrêt du programme en cours de traitement pour exécuter en priorité un sous-programme
spécifique appelé sous-programme d'interruption ou traitant d'interruption.
A la fin de ce sous-programme, le microprocesseur reprend le programme principal là où il a été
interrompu.

2.2. Types et propriétés des interruptions


Il existe deux catégories d'interruptions : les interruptions matérielles et logicielles.

2.2.1. Les interruptions matérielles


Ce sont des interruptions d'origine externe. Elles sont déclenchées par application d'un état haut
sur INTR (Interrupt Request) ou NMI (No Masquable Interrupt).
NMI est dite interruption non masquable. Elle ne peut être inhibée par programme. Elle est
associée en général à des événements catastrophiques (erreur système, erreur mémoire, ...)
INTR est moins prioritaire que NMI et peut être masquée par programme.

Processus de l'interruption NMI


Lorsque le microprocesseur reçoit une demande d'interruption sur NMI.
1. il termine l'instruction en cours d'exécution,
2. empile le registre d'état et les registres CS et IP,
3. met le drapeau IF (Interrupt Flag) à 0 (inhibition des interruptions),
4. cherche l'adresse du sous-programme à exécuter dans la table des vecteurs d'interruption,
5. exécute le sous-programme ...
6. remet le drapeau IF à 1 (autorisation des interruptions),
7. dépile IP, CS et le registre d'état et poursuit le programme principal.

Processus de l'interruption INTR


INTR est souvent associée à un circuit spécialisé appelé contrôleur d'interruption 8259A :

INTR IRQ0

INTA IRQ1
8086 8259A
......

IRQ7
Bus
de données

- 49 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Le 8259A reçoit 8 entrées IRQ0 à IRQ7 (Interrupt ReQuest). Dès que l'une de ces entrées passe à
l'état haut, le 8259A émet une demande d'interruption sur INTR :
1. Le 8086 termine l'instruction en cours,
2. envoie au 8259A sur INTA un signal "accusé de réception",
3. le 8259A place sur le bus de données le n° de l'interruption excitée. Ce numéro est reçu alors
par le 8086,
4. le 8086 cherche l'adresse du sous-programme associé à cette interruption dans la table des
vecteurs d'interruption,
la suite du processus est identique à celui de NMI ...
L'interruption INTR peut être masquée par l'instruction CLI (CLear Interrupt flag) qui met le
drapeau IF à 0. Aucun appel sur INTR n'est alors pris en compte jusqu'à la mise à 1 de IF par
l'instruction STI (SeT Interrupt flag).

2.2.2. Les interruption logicielles


Elles sont déclenchées par l'instruction INT n où n désigne le numéro d'interruption.
Les sous-programmes associés aux interruptions logicielles sont en général des routines du BIOS
ou du DOS. Elles permettent au programme d'accéder aux différents périphériques de l'ordinateur
(voir chapitre 7 : Initiation à la programmation système)
Exemple
Interruption 10h : interruption BIOS (gestion de l'affichage)
Interruption 21h : interruption DOS (gestion des périphériques, des fichiers, ...)

2.2.3. La table des vecteurs d'interruption


Cette table contient l'adresse des sous-programmes (SP) de toutes les interruptions du
microprocesseur (256 au total) et commence à partir de 00000. L'adresse d'un sous-programme
d'interruption prend 4 octets : 2 octets pour son segment et 2 octets pour son offset :

00000
Offset du SP
14243

00001
Interruption 00 : Division par 0
00002
Segment du SP
00003

00004
Offset du SP
00005
14243

Interruption 01 : Pas à pas


00006
Segment du SP
00007

003FF

La table occupe l'espace mémoire entre 00000h et 003FFh.


Pour une interruption logicielle n l'adresse du sous-programme associé se trouve à 4n (offset du
SP) et 4n+2 (segment du SP).

- 50 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Exemple
L'adresse du SP associé à l'interruption 21h se trouve à 00084h (offset du SP) et 00086h (segment
du SP) :
En supposant que le contenu de ces 4 octets est :
00084h 00085h 00086h 00087h
A0h 04h 45h 09h

Le sous-programme associé à l'interruption 21h se trouve alors à l'adresse 0945h:04A0h


Attention :
Il est interdit de modifier directement le contenu de la table des vecteurs d'interruption. Cette
opération se fait à l'aide de la fonction 25h de l'interruption 21h.

2.2.4. Cas particulier de RESET


Lorsque l'entrée RESET du microprocesseur est mise à l'état haut (bouton RESET sur le boîtier de
l'ordinateur), les registres sont initialisés par les valeurs suivantes :
SR=0 - IP=0 - CS=FFFFh - DS=0 - ES=0 - SS=0
La première instruction exécutée par le microprocesseur au démarrage se trouve donc à l'adresse
FFFFh:0000h. Cette adresse fait partie de la zone du BIOS en ROM.

3. Application
Les interruptions jouent un rôle extrêmement important dans la gestion des périphériques.
Regardons l'exemple suivant :
Un ordinateur communique à travers son port série avec un modem. Celui-ci reçoit via une ligne
téléphonique des octets provenant d'un autre ordinateur. Les octets reçus doivent être rangés dans
un buffer (zone mémoire tampon) pour être traités après.

Contrôleur
8086 du port Modem ligne
téléphonique
série

Il existe deux méthodes pour gérer cette tâche :

3.1. Méthode par scrutation


Cette méthode consiste à lire en permanence le port série pour voir si un caractère est arrivé :
Lire le port série
S'il y a un caractère → le stocker dans le buffer
Recommencer
La boucle doit se répéter jusqu'à la fin de la communication.
Cette méthode est inefficace parce que le microprocesseur passe tout son temps à attendre
l'arrivée d'un caractère alors qu'il devrait s'occuper d'autres tâches.

3.2. Méthode par interruption


La méthode par interruption fonctionne de la manière suivante :
Le contrôleur du port série est associé à une entrée de demande d'interruption, soit IRQ5. Dès

- 51 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

qu'un caractère est reçu, le contrôleur envoie une demande via IRQ5 au 8259A qui à son tour
demande une interruption sur INTR. Le microprocesseur arrête le programme en cours pour
exécuter le sous-programme associé à IRQ5. Celui-ci lit le caractère reçu et le met dans le buffer.
Le programme principal continue ensuite normalement.

Contrôleur
du port
série
8086
8259A
INTR IRQ5

Le numéro d'interruption associé à une ligne IRQn est n+8. Par conséquent, l'emplacement de
l'adresse du sous-programme correspondant dans la table des vecteurs d'interruption est 4(n+8) et
4(n+8)+2.
Dans notre cas (IRQ5), l'adresse du sous-programme d'interruption doit être stocké à 34h (offset
du SP) et 36h (segment du SP).
Supposons que notre SP d'interruption se trouve à F000h:EF6Fh, le programme principal devra
commencer par :
1. Inhiber les interruptions (CLI)
2. Mettre EF6Fh à l'adresse 00034h et F000h à l'adresse 00036h
(ceci doit être fait à l'aide la fonction 25h de l'interruption 21h)
3. Autoriser les interruptions (STI)
4. Suite du programme ...
Le SP d'interruption à l'adresse F000h:EF6Fh :
1. Lire le caractère reçu sur le port série
2. Mettre le caractère dans le buffer
3. Retour (instruction IRET)
De cette manière, le microprocesseur exécute normalement le programme principal et à l'arrivée
d'un caractère, il se branche à F000h:EF6Fh pour mettre le caractère dans le buffer puis retourne
au programme.
Cette méthode permet un gain substantiel en vitesse et en performance. La plupart des
périphériques sont gérés de cette manière.
Remarque
Pour connaître l'affectation des entrées IRQ dans un ordinateur travaillant sous Windows 95,
cliquez sur l'icône "Système" dans le panneau de configuration. Sous l'onglet "Gestionnaire de
périphériques", double-cliquez sur "Ordinateur"

- 52 -
CHAPITRE

6 Les entrées/sorties

1. Introduction
Le microprocesseur doit échanger des données avec l'environnement extérieur. Cet échange se
fait à l'aide des périphériques.
Le flux d'information peut exister dans les deux sens : de l'extérieur vers le microprocesseur
(clavier, liaison série, réseau, disque, ...) ou du microprocesseur vers l'extérieur (imprimante,
écran, disque, traceur, ...)
Ces échanges d'information sont appelés les entrées/sorties : E/S (input/output : I/O en anglais).

2. Notion de contrôleur ou de circuit d'interface


Aujourd'hui, il existe un nombre important de périphériques de natures très diverses. Le
microprocesseur est incapable de communiquer avec tous ces périphériques soit parce qu'ils
nécessitent un protocole de communication très particulier, soit encore parce que la nature des
signaux électriques transitant sur les lignes d'E/S du périphérique sont incompatibles avec ceux du
microprocesseur.
Par conséquent, et afin d'établir un échange d'information entre le microprocesseur et le
périphérique, on fait appel à un circuit spécialisé appelé circuit d'interface ou contrôleur. Un tel
circuit joue le rôle d'intermédiaire. Il se charge de piloter le périphérique en lui envoyant tous les
signaux électriques nécessaires à son fonctionnement et en recevant de celui-ci les données utiles
tout en obéissant au protocole de communication imposé.
Du côté du microprocesseur le circuit d'interface occupe un certain espace dans une zone appelée
zone d'entrée/sortie. Pour le 8086 cette zone est indépendante de la mémoire centrale et a une
taille de 64 Ko.

0000

0001

FFFF

Zone d'entrée/sortie de 64Ko

3. Communication entre le microprocesseur et un circuit d'interface


Tous les circuits d'interface comportent un ou plusieurs registres internes. Ces registres travaillent
en lecture ou en écriture et à chaque registre est affectée une adresse dans la zone d'entrée/sortie.

- 53 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Ils assurent la communication entre le microprocesseur et le circuit.


Certains de ces registres reçoivent des informations de commande du microprocesseur (mode de
fonctionnement, sens et mode de transfert, ...), d'autres contiennent des informations d'état du
circuit d'interface (erreurs de transmission, réception de données, ...), alors qu'un troisième type
joue le rôle de tampon recevant l'information à transférer du microprocesseur au périphérique ou
arrivant du périphérique vers le microprocesseur, ...

4. Accès aux registres d'un circuit d'interface


Chaque registre interne est associé à une adresse d'E/S. Pour y accéder, il existe deux instructions
IN et OUT :
IN AL,DX ; met dans AL le contenu de l'adresse d'E/S pointé par DX
OUT DX,AL ; transfère le contenu de AL vers l'adresse d'E/S pointée par DX
Il faut évidemment que DX soit chargé au préalable par l'adresse d'entrée/sortie :
MOV DX,adr. d'E/S.
AL et DX sont les seuls registres autorisés dans les opérations d'E/S.

5. Application : Le circuit d'interface série


Tout ordinateur est équipé d'un ou deux ports série permettant le transfert des données vers
d'autres systèmes (modem par exemple).
La gestion des ports série est prise en charge par à un circuit appelé l'UART (Universal
Asynchronous Receiver Transmitter).
L'UART 8250 possède plusieurs registres internes permettant de configurer la communication,
d'envoyer ou recevoir des données.
Le premier de ces registres s'appelle RBR (Receiver BuffeR) ou registre de réception. Il se situe à
l'adresse d'E/S : 3F8h. Cette adresse est appelée adresse de base car les adresses de tous les
autres registres de l'UART sont calculées par rapport à cette adresse en ajoutant un décalage.
Ainsi, le registre : LCR (Line Control Register) ou registre de contrôle de la transmission se trouve
à l'adresse 3F8h + 3 = 3FBh. Le dernier registre est situé à 3FFh
L'UART occupe donc l'espace d'E/S : 3F8h – 3FFh.
Le caractère reçu sur le port série est mis par l'UART dans le registre de réception RBR. On peut
lire le contenu du registre RBR par les instructions suivantes :
MOV DX,3F8h ; adresse d'E/S du RBR
IN AL,DX ; charger AL par le contenu du RBR

Pour configurer la transmission via le port série, On met le mot de configuration dans le registre
LCR :
MOV AL,mot de config.
MOV DX,3FBh ; adresse du LCR
OUT DX,AL ; chargement dans le LCR

6. Le circuit d’interface parallèle 8255 (filière IEEA uniquement)


Le 8255 est un circuit d’interface programmable de 24 bits d’entrée/sortie organisés sous forme de
2 ports de 8 bits : A et B, et de deux ports de 4 bits Csup et Cinf (constituant le port C).
Chaque port est programmable en entrée et en sortie.
Le 8255 est programmé à travers son registre de commande.
Le 8255 est vu par le microprocesseur comme étant 4 octets dans l’espace des entrées/sorties.

- 54 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

PA0
Adresses des registres

123
PA Port A


PA7 AB PA
PB0
AB+1 PB
AB+2 PC

123
RC PB Port B


AB+3 RC
PB7
PC0 AB : Adresse de base du 8255
Cinf

14243
PC3
PC
PC4 Port C
Csup


8255 PC7

6.1. Connexion du 8255 au microprocesseur

M/IO

A15
Décodeur
CS

d’adresse
A2

8086 A1 A1 8255
A0 A0
RD
R/W WR

D0-D7 Bus de données D0-D7

RESET RESET

6.2. Programmation du 8255


Afin de configurer le sens et le mode de fonctionnement des registres, on écrit un mot de
commande dans le registre RC.
Le 8255 dispose de 3 modes de fonctionnement :
• Mode 0 : E/S de base
• Mode 1 : E/S échantillonées
• Mode 2 : Bus bidirectionnel
C’est le mode 0 qu’on étudiera dans ce cours vu sa simplicité.
Le mot de commande permet de configurer les ports d’E/S. Il se présente de la manière suivante :

D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0
Sens de Cinf
Mode du port A/Csup
(mode 0) Sens du port B
Sens de Csup

Sens du port A
Mode du port B/Cinf
(mode 0)
Sens des ports :
1 : en entrée
0 : en sortie

- 55 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Exemple
Pour configurer le port A en sortie et les ports B et C en entrée, le mot de commande est :
10001011 soit 8B en hexadécimal.
En supposant que l’adresse de base du 8255 est 100h, le programme ci-dessous permet de
transférer la donnée présente sur le port B au port A :
MOV AL,8Bh ;mot de commande
MOV DX,103h ;adresse du registre de contrôle
OUT DX,AL ;écriture du mot de commande dans RC
MOV DX,101h ;adresse du port B
IN AL,DX ;lecture du contenu du port B dans AL
MOV DX,100h ;adresse du port A
OUT DX,AL ;transfert du contenu de AL au port A

- 56 -
CHAPITRE

7 Initiation à la
programmation système

1. Introduction
Ecrire un programme avec un langage évolué tel que Pascal, C, Fortran, ... revient à traiter les
données selon des algorithmes en général indépendants du système. Le programme écrit reste
transparent vis-à-vis du matériel et ne requière aucune connaissance sur la façon avec laquelle les
données parviennent au processeur ni comment celui-ci les traite ou les range dans la mémoire. Si
ce type de programmation est le plus répandu notamment pour sa commodité et sa transparence,
il reste limité et même parfois inefficace quand il est question de tâches critiques nécessitant une
grande vitesse d'exécution ou un accès direct au matériel. La seule solution dans ce cas est le
recours à la programmation système.
La programmation système s’intéresse aux différents échanges qui se produisent à l’intérieur de
l’ordinateur et en particulier avec la mémoire et les périphériques (clavier, écran, modem, ...). Ce
type de programmation quoique pénible et fastidieux, s’avère parfois indispensable pour générer
un code exécutable rapide et exploiter les ressources du système d’une manière optimale.
Toutefois, la programmation système exige des connaissances préalables sur l’architecture du
système et restreint le portabilité des programmes.

2. Accès aux ressources matérielles


L’une des tâches fondamentales de la programmation système est d’accéder au matériel. Cet
accès ne se fait pas obligatoirement d’une manière directe, mais peut empreinter d’autres chemins
comme l’appel de fonctions spécialisées offertes par le système d’exploitation telles que les
fonctions BIOS et DOS.
Le BIOS (Basic Input Output System) se trouve en ROM et constitue la première couche du
système. Il est chargé au démarrage de l’ordinateur bien avant le DOS. Ses fonctions permettent
d’accéder aux composants matériels : carte vidéo, lecteur de disquettes, disque dur, clavier, …
Le DOS (Disk Operating System) est la couche logicielle située en dessus du BIOS. Les fonctions
qu’il propose permettent aussi d’accéder au matériel mais d’une manière plus évoluée. En effet,
les fonctions DOS se placent au niveau logique et non pas au niveau physique du matériel.
La programmation système fait très souvent appel aux fonctions du DOS et du BIOS. Le langage
employé par excellence est l'Assembleur.

3. Structure d’un programme en Assembleur 80x86


Un programme en Assembleur se compose en général de 3 parties définissant les différents
segments :

- 57 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

1. le segment de code (pointé par CS),


2. le segment de données (pointé par DS),
3. le segment de pile (pointé par SS).

3.1. Déclaration des segments


La déclaration d’un segment se fait selon la syntaxe suivante :

Nom_Segment SEGMENT PARA ;Début du segment

<<*** Instructions ou données appartenant au segment ***>>

Nom_Segment ENDS ;Fin du segment

NB. : Tout ce qui se trouve après le point-virgule (;) est considéré comme commentaire
Exemple : Déclaration d’un segment de code
MonCode SEGMENT PARA
MOV AX,1200h
ADD AX,[5E00h]
MOV AX,4C00h
INT 21h
MonCode ENDS

3.2. Déclaration des données et de la pile


Le segment de données est réservé aux données que le programme utilise pendant son exécution.
Ces données sont représentées sous forme d’octets, de mots, de tableaux ou de chaînes de
caractères et peuvent être traîtés comme des constantes ou des variables. Chaque donnée est
stockée en mémoire sous forme hexadécimale.
Les variables peuvent recevoir une valeur initiale attribuée par le programme comme elles peuvent
rester sans initialisation et c’est pendant l’exécution qu’elles reçoivent des valeurs.
La syntaxe de définition des données au sein du segment de données dépend de leur nature :

3.2.1. Définition d’un octet


Nombre DB 18h

Label Valeur initiale

Les valeurs initiales peuvent être exprimées en décimal, en hexadécimal (h) ou en binaire (b). Le
compilateur se charge de faire la conversion. Ainsi les déclarations suivantes sont identiques :

Décimal Hexadécimal Binaire


Nombre DB 24 Nombre DB 18h Nombre DB 00011000b

Pour définir un octet sans lui affecter de valeur initiale, on utilise le symbole ?
Nombre DB ?

3.2.2. Définition d’un mot (16 bits)


Prod DW 5C0Fh

Label Valeur initiale

3.2.3. Définition d’un tableau d’octets


Tab DB 15h,5Ah,21h,7Ch,82h

Label marquant le début du tableau Données appartenant au tableau

- 58 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Dans cet exemple, si le label Tab désigne l’adresse 45F0h, La case mémoire 45F0h contient 15h,
la case 45F1h la valeur 5Ah, ... etc
Pour définir un tableau de 10 octets sans initialisation, on écrit :
Tab DB 10 DUP (?)
Pour définir un tableau de 7 octets contenant des valeurs identiques (2Ah par exemple), on écrit :
Tab1 DB 7 DUP (2Ah)

Cette définition est parfaitement identique à la définition suivante :


Tab1 DB 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah

3.2.4. Définition d’un tableau de mots


TabM DW 15EEh, 5A00h, 12FFh, 8B00h
Si l’adresse pointée par le label TabM est 1200h, le contenu de la mémoire sera:

1200h 1201h 1202h 1203h 1204h 1205h 1206h 1207h


EEh 15h 00h 5Ah FFh 12h 00h 8Bh

3.2.5. Définition d’une chaîne de caractères


MaChn DB 'Ceci est un exemple'
Chn2 DB 'FIN',0Dh,0Ah
Une chaîne de caractères est stockée sous forme d’octets représentant le code ASCII de chaque
caractère. La chaîne est écrite entre guillemets et c’est le compilateur qui se charge de convertir
chaque caractère en code ASCII.
On peut définir des chaînes de caractères contenant des caractères spéciaux (caractères non
imprimables mais qui ont une signification particulière pour l’ordinateur). Ces caractères sont
représentés par leur code ASCII dans la définition de la chaîne. Ainsi dans le deuxième exemple,
la chaîne de caractère "FIN" est suivie de deux caractères spéciaux de code ASCII : 0Dh (retour
chariot) et 0Ah (retour à la ligne).
Si le label Chn2 désigne l’adresse 8000h, le contenu de la mémoire sera le suivant :

8000h 8001h 8002h 8003h 8004h


46h 49h 4Eh 0Dh 0Ah
"F" "I" "N"

L’affichage de cette chaîne sur l’écran provoquera un retour à ligne après l’apparition du mot
"FIN".

3.2.6. Déclaration du segment de données


La syntaxe est identique à celle du segment du code. Dans un segment de données on regroupe
toutes les données utilisées par le programme.
Les variables déclarées sont placées l'une après l'autre dans la mémoire. Chacune prend l'espace
mémoire nécessaire.
Exemple
Donnees SEGMENT PARA ; Début du segment
Var1 DB 12h ; 1 octet
Mot1 DW 15E4h ; 2 octets (mot de 16 bits)
Table DB 5 DUP(1Ch) ; 5 octets (taille du tableau)
Chaine DB 'Test',0 ; 5 octets (longueur de la chaîne)
Donnees ENDS ; Fin du segment

- 59 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Si le premier octet du segment de données se trouve à l'offset 0000, le contenu de la mémoire


sera:

0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h


12h E4h 15h 1Ch 1Ch 1Ch 1Ch 1Ch
Var1 Mot1 Table

0008h 0009h 000Ah 000Bh 000Ch


54h 65h 73h 74h 00h
Chaine

Les labels qui identifient chaque variable reçoivent l'offset de celle-ci dans le segment de données :
Label Offset attribué
Var1 0000h
Mot1 0001h
Table 0003h
Chaine 0008h

3.2.7. Utilisation des données dans le programme


Comme on vient de voir, chaque donnée est repérée par un label. Celui-ci reçoit l'adresse logique
(sur 16 bits) de la donnée dans la mémoire.
Pour faire référence à une donnée définie dans le segment de données, on utilise tout simplement
son label.
Exemple 1
Soit la variable Var1 de type octet définie précédemment dans le segment de données (voir ci-
dessus):
Var1 DB 12h

Pour charger le contenu de la variable Var1 dans le registre AL, on écrit :


MOV AL,Var1

Pour écraser le contenu de Var1 et la charger par la valeur 45h, on écrit :


MOV Var1,45h

Remarque
Var1 représente l'adresse logique de la variable, en réalité, Var1 désigne l'adresse logique 0000h.
Au moment de la compilation, le compilateur remplace l'instruction MOV AL,Var1 par MOV
AL,[0000h].

Exemple 2
Soient deux tables de 5 valeurs dont le début est désigné par les labels XVect et YVect. La
deuxième table n'est pas initialisé.
XVect DB 12h,3Ah,15h,4C,2Dh
YVect DB 5 DUP (?)

- 60 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Le programme suivant permet de copier dans la deuxième table le contenu de la première en


utilisant SI et DI comme registres d'index :

LEA SI,XVect ;Charger SI par l'adresse désignée par XVect


LEA DI,YVect ;Charger DI par l'adresse désignée par YVect
MOV AH,5
suite: MOV AL,[SI]
MOV [DI], AL
INC SI
INC DI
DEC AH
CMP AH,0
JNE suite

L'instruction LEA (Load Effective Adress) permet de charger dans un registre l'adresse désignée
par un label.
Exemple
Si XVect désigne l'adresse 2B07h :
• LEA BX,XVect aura pour résultat BX=2B07h,
• MOV BX,XVect aura pour résultat BX=3A12h (premières valeurs de la table XVect).
Remarque
LEA BX,XVect est équivalente à MOV BX,offset XVect (charger BX par l'offset de XVect)

3.2.8. Déclaration du segment de pile


La pile est une zone mémoire qui doit être réservée pour le programme (gestion des appel aux
sous-programmes et aux interruptions, ...), et pour d'autres usages généraux (sauvegarde de
données temporaires, passage de paramètres à une procédure, ...)
Dans le plupart des cas, la déclaration d'un segment de pile est obligatoire surtout en présence de
sous-programmes.
La taille de la pile varie selon les applications. Un programme récursif aura besoin d'une pile de
taille beaucoup plus importante qu'un programme ordinaire.
La réservation d'une zone mémoire pour le segment de pile se fait de la manière suivante :
MaPile SEGMENT PARA STACK
DB 256 DUP (?)
MaPile ENDS

Ici, la taille de la pile est de 256 octets. Ce qui est suffisant pour des petits programmes en
assembleur.

3.3. Exemple de programme


Le programme suivant permet de remplir un tableau par une suite de nombres de 0 à 10 :

- 61 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

Pile SEGMENT PARA STACK ; Définition du segment de pile


DB 256 DUP ('P') ; Pile de 256 octets remplie par
Pile ENDS ; le caractère 'P'

Donnees SEGMENT PARA ; Définition du segment de données


Table DB 11 DUP (00) ; Table de 11 octets initialisée par 0
Donnees ENDS

Code SEGMENT PARA ; Définition du segment de code


ASSUME CS : Code ; Affectation des registres
ASSUME DS : Donnees ; de segments
ASSUME SS : Pile

Debut: MOV AX,Donnees ; Initialisation du registre DS


MOV DS,AX
LEA BX,Table ; BX reçoit l'adresse logique de Table
XOR AL,AL ; AL = 0
Boucle: MOV Byte Ptr [BX],AL ; Byte Ptr [BX] veut dire octet ...
INC BX ; ... pointé par BX
INC AL
CMP AL,0Bh ; Teste la fin de la boucle
JNE Boucle ; AL ≠ 0Bh ⇒ aller à Boucle
MOV AH, 4Ch ; Appel à la fonction 4C de
INT 21h ; l'interruption 21h(Retour au DOS)
Code ENDS
END Debut ; END indique la fin du programme
; Debut désigne le label de la
; première instruction du programme
Remarque
Les registres CS et SS sont automatiquement affectés aux segments Code et Pile respectivement.
Par contre, le registre DS doit être initialisé dans le programme

3.4. Appel aux fonctions du DOS et du BIOS


L'appel des fonctions du DOS et du BIOS se fait par le biais des interruptions logicielles. Avant
d'appeler l'interruption, on charge les éventuels paramètres dans les registres du microprocesseur.
Certaines fonctions renvoient des résultats après l'exécution de l'interuption. Ceux-ci sont en
général stockés dans les registres du microprocesseur.
Comme le nombre des fonctions disponibles est très grand, il n'est pas possible de donner des
explications détaillées dans le cadre de ce document (voir à ce sujet les ouvrages spécialisés).

Exemple : Affichage d'un caractère sur l'écran


Interruption : 21h
Paramètres :
• AH = 02h (fonction n°2)
• DL = Code ASCII du caractère à afficher
Le programme suivant permet d'afficher le caractère "A" sur l'écran :
MOV DL,41h ;Code ASCII du caractère "A"
MOV AH,2 ;Fonction n°2
INT 21h ;Appel de l'interruption 21h

4. Compilation d’un programme en Assembleur 80x86


Le compilateur Assembleur est constitué deux fichiers :
• MASM.EXE (le compilateur)
• LINK.EXE (l'éditeur des liens)

- 62 -
Cours de l’architecture des ordinateurs – FST Tanger – K. EL MOKHTARI

4.1. Edition du programme


Le programme peut être écrit avec n'importe quel éditeur de texte (l'éditeur du DOS, Notepad, ...).
Pour écrire le fichier test.asm sous l'éditeur de MS-DOS, on tape sur la ligne de commande :
C:\ASM\>edit test.asm

Une fois le programme écrit, il faut l'enregistrer sur le disque dans le répertoire du compilateur. Un
fichier source assembleur doit OBLIGATOIREMENT avoir l'extension .asm.

4.2. Compilation
La compilation s'effectue en deux étapes :
• On lance le macro assembleur MASM avec le nom du fichier source comme paramètre (ne
pas oublier le point-virgule à la fin de la ligne) :
C:\ASM>masm test;
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.

49826 + 367899 Bytes symbol space free

0 Warning Errors
0 Severe Errors

S'il y a des erreurs, elles sont indiquées avec leur numéro de ligne, on doit les corriger dans le
fichier source. Sinon, on passe à la deuxième étape.

• On lance l'éditeur des liens LINK :


C:\ASM>link test;

Microsoft (R) Overlay Linker Version 3.64


Copyright (C) Microsoft Corp 1983-1988. All rights reserved.

S'il n'y a pas d'erreurs, l'éditeur des liens crée le fichier exécutable du programme. Dans notre cas,
c'est le fichier test.exe.

4.3. Exécution du programme


Le fichier obtenu après la compilation est un fichier exécutable qu'on peut appeler directement sur
la ligne de commande de MS-DOS :
C:\ASM>test

Sous Windows, on clique deux fois sur l’icône du fichier test.exe.

- 63 -