Architecture.ordinateurs.8086.Elmokhtari

63
Faculté des Sciences et Techniques – Tanger Département Génie électrique Cours Architecture des ordinateurs Par : Karim EL MOKHTARI [email protected] A l'usage des étudiants des maîtrises : IEEA et Génie informatique - 1 -

Transcript of Architecture.ordinateurs.8086.Elmokhtari

Page 1: Architecture.ordinateurs.8086.Elmokhtari

Faculté des Sciences et Techniques – Tanger

Département Génie électrique

Cours

Architecture des ordinateurs

- 1

Par : Karim EL MOKHTARI [email protected]

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

IEEA et Génie informatique

-

Page 2: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 3: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 4: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 5: Architecture.ordinateurs.8086.Elmokhtari

C H A P I T R E

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 -

Page 6: Architecture.ordinateurs.8086.Elmokhtari

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

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

∑−

=

=1

010)(

n

i

iiBaA

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

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.

A B

Q1a0 B

Q2a1 B

Q3a2 B

0 a3Restes successifs

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 -

Page 7: Architecture.ordinateurs.8086.Elmokhtari

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

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.

3 E

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 -

Page 8: Architecture.ordinateurs.8086.Elmokhtari

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

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

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

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

bit de signe

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 -

Page 9: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 10: Architecture.ordinateurs.8086.Elmokhtari

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 :

e

1

t

2. Le codage

2.1. Codification deLe codage d’un nom...) :

• En binaire non s

• En binaire signé2n–1–1

Exemple

A = –2

L’équivalent de A en

Remarque

En langage C, les ty

Type int

char unsigned char

short unsigned short

long unsigned long

(*) Dans les systèmes 164 octets. Il est donc plus p

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

s nombres entiers bre entier dans un or

igné (binaire naturel) su

(code complément à

binaire signé est :

Sur 8 bits FE

pes utilisés occupent 1,

Nombre d’oEn fonction du s

1 1 2

2 4 4

bits (DOS par exemple) un trudent d'utiliser les types sho

1

1 0 0 1 0

dinateur se fait sur un no

r n bits, les nombres sont

2) sur n bits, les nombre

Sur 16 bits SuFFFE FF

2 ou 4 octets :

ctets Plage ystème (*)

-128 → 127 0 → 255 -32 768 → 30 → 65 535 -2 147 483 60 → 4 294 9

ype int occupe 2 octets alors qurt et long pour s'assurer de la t

- 10 -

Quotien

Diviseur

Reste

Dividend

mbre fixe de bits (8, 16, 32,

compris entre 0 et 2n–1

s sont compris entre –2n–1 et

r 32 bits FFFFFE

2 767

48 → 2 147 836 647 67 295 e dans les systèmes 32 bits il occupe

aille de la variable.

Page 11: Architecture.ordinateurs.8086.Elmokhtari

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

Exposant Mantisse Signe

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 -

Page 12: Architecture.ordinateurs.8086.Elmokhtari

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 réfléchi

Décimal Binaire 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 -

Page 13: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 14: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 15: Architecture.ordinateurs.8086.Elmokhtari

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

C H A P I T R E

2 Généralités sur les 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 :

s s

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

……

s

……

Pour accéder à une ca

Soit l'exemple suivant

m case

m-1 1 0 0

e

se, il faut fournir le num

qui illustre une mémoire

n bit

0 0 1 0 0

Adress

éro de la case : l'adress

de 16 cases de 8 bits :

- 15 -

Données binaire

e.

Page 16: Architecture.ordinateurs.8086.Elmokhtari

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

A1

A2

A3

D0 D0 D7

Mémoire de 16 octets

Bus d

’adresse

Bus de données

1.2.1. Communication entre un microprocesseur et une mémoire

Le bus d'adresse est unidirectionnel.

Le bus de données est bidirectionnel. Il permet au microprocesseur :

Bus d’adresse

Bus de données

Bus de contrôle

Mémoire 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 -

Page 17: Architecture.ordinateurs.8086.Elmokhtari

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.

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.

Microprocesseur

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

Bus d’adresse

Bus de données

CS CS CS

- 17 -

Page 18: Architecture.ordinateurs.8086.Elmokhtari

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

Exemple

0000

3FFF Mémoire 1

4000

BFFF Mémoire 2

C000

CFFF Mémoire 3

D000

FFFF Espace vide

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 : 164 cases de 8 bits (un ensemble de 8 bits est appelé octet)

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 d’adresse

Bus de données

Bus de contrôle

Circuits d’interface Microprocesseur Périphériques

- 18 -

Page 19: Architecture.ordinateurs.8086.Elmokhtari

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.

Registres

Bus interne

UAL

Unité de contrôle

2.1. L'Unité Arithmétique et Logique

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

X Y

UAL

Sélection de l’opération

Z

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 -

Page 20: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 21: Architecture.ordinateurs.8086.Elmokhtari

C H A P I T R E

3 Le microprocesseur 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 -

Page 22: Architecture.ordinateurs.8086.Elmokhtari

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 :

)

00000

00001

FFFFE

FFFFF

Chaque case contient un octet.

Le 8086 manipule des données sur 8 bits

• Pour accéder à une donnée sur 8 bits,

• Les données exprimées sur 16 bits oINTEL les 8 bits de poids faible sont sconvention est appelé Big Endian (adoptée dans les microprocesseurs MO

Ainsi, le 8086 stocke le mot 658Fh à l'a

8 bits (octet

…..

et sur 16 bits :

il suffit de donner son adresse sur 20 bits.

ccupent deux octets dans la mémoire. Dans la famille tockées en premier suivis des 8 bits de poids fort. Cette la convention rivale est appelé Little Endian, elle est TOROLA)

dresse 01000h comme suit :

01000h 8Fh 01001h 65h

- 22 -

Page 23: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 24: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 25: Architecture.ordinateurs.8086.Elmokhtari

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

0FFFF

17FFF

0

FFFFF

L'adresse physique 08000h appartient en même temps aupeut être calculé par : DS=0 ; Offset = 8000h, ou encore p

4.3.2. Le registre de segment de code CS (Code Segment) La zone réservée aux instructions du programme est associé

Afin que le microprocesseur puisse lire un instruction dans logique (contenue dans le registre IP) et son segment dans C

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, Firstprocesseur pour sauvegarder l'état du système lors d'un ainterruption, et d'autre part par le programmeur pour passer

- 25 -

DS = 000

xar

a

laS

opp d

DS = 0800

08000

segments DS=0 et DS=800h. Elle : DS = 800h ; Offset = 0.

u registre de segmentation CS.

mémoire, il doit fournir son adresse (voir 4.4.2).

ut). Elle est utilisée d'une part par le el à un sous-programme ou à une es paramètres à un sous-programme

Page 26: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 27: Architecture.ordinateurs.8086.Elmokhtari

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 DX = 5EBAh

AX = 5EBAh DX = 5EBAh

- 27 -

Page 28: Architecture.ordinateurs.8086.Elmokhtari

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 1203 1204 1205 1206

0

3

Pour lire le 4ème élément du tableau (indice i=3) en mode direct,

1202h + 3 = 1205h

D'une manière générale, dans un tableau où chaque élémenl'élément d'indice i est donnée par :

Adresse de l'élément i = adresse de base du tableau + (tail

- 28 -

i=

i=

on doit calculer son adresse :

t occupe m octets, l'adresse de

le d'un élément en octets × i)

Page 29: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 30: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 31: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 32: Architecture.ordinateurs.8086.Elmokhtari
Page 33: Architecture.ordinateurs.8086.Elmokhtari

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 : destination ← source

destination et source doivent être de même taille (8 bits ou 16 bits). Sont interdits : le transfert mémoire, mémoire (MOV [100h],[1200h]) le transfert registre de segmentation, valeur immédiate (MOV DS,1200h)

MOV AX,5BC3h (registre 16 bits) MOV CL,4Eh (registre 8 bits) MOV AX,[1200h] (adressage direct) MOV [BX],CL (adressage basé) ...

Cours de l’architecture des ordinateurs – FS

T Tanger – K. E

L

- 33 -

2. Instructions arithmétiques Syntaxe Rôle Remarques Exemples ADD destination , source Effectue une addition entre destination et

source : destination ← destination + source

S'il y a une retenue le drapeau CF (Carry) est mis à 1. destination et source doivent être de même taille (8 bits ou 16 bits). Tous les registres sont utilisables sauf les registres de segment. l'addition mémoire, mémoire est interdite.

ADD DX,1000h (addition sur 16 bits : DX←DX+1000h) ADD BH,F1h (addition sur 8 bits : BH←BH+F1h) ADD AL,[1205h] (adressage direct) ADD CL,[SI] (adressage indexé) ...

ADC destination , source Effectue une addition entre destination et source avec la retenue CF : destination ← destination + source + CF

Mêmes remarques que ADD ADC DX,300h (DX←DX+300h + CF) Si DX=500h et CF=1 alors DX prendra la valeur 801h

INC destination Incrémente destination destination ← destination + 1

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

MO

KH

TA

RI

Page 34: Architecture.ordinateurs.8086.Elmokhtari

C

ours de l’architecture des ordinateurs – FST Tanger – K

. EL

- 34 -

Syntaxe Rôle Remarques Exemples SUB destination , source Effectue une soustraction entre

destination et source : destination ← destination - source

Mêmes remarques que ADD SUB CH,BL (CH←CH-BL)

DEC destination Décrémente destination destination ← destination - 1

destination est un registre de 8 ou 16 bits. DEC BH

MUL source Effectue une multiplication entre AX (ou AL) et source : Sur 8 bits : AX ← AL x source Sur 16 bits : DX:AX ← AX x source

Multiplication sur 8 bits : source est un registre 8 bits ou une adresse mémoire Multiplication sur 16 bits : source est un registre 16 bits ou une adresse mémoire

MUL DH (AX←AL x DH)

DIV source Effectue une division entre AX (ou DX:AX) et source : Sur 8 bits : AL ← AX / source (reste dans AH) Sur 16 bits : AX ← DX:AX / source (reste dans DX)

Division sur 8 bits : source est un registre 8 bits ou une adresse mémoire Division sur 16 bits : source est un registre 16 bits ou une adresse mémoire

DIV CL (AL←AX / CL, reste dans AH)

3. Instructions logiques Syntaxe Rôle Remarques Exemples AND destination , source Effectue un ET logique entre destination

et source : destination ← destination ET source

destination et source doivent être de même taille. Ils peuvent être des registres de 8 ou 16 bits ou des cases mémoire.

AND DH,CL Si DH=F4h et CL=3Fh alors : DH ←DH ET CL = 34h

OR destination , source Effectue un OU entre dest. et source : destination ← destination OU source

même remarque que AND OR SI,BP

XOR destination , source Effectue un OU exclusif entre destination et source : destination ← destination ⊕ source

même remarque que AND XOR CH,AL Si CH=42h et AL=9Ah alors : CH ← CH ⊕ AL = D8h

NOT destination Effectue le complément de destination : destination ← destination

destination peut être un registres de 8 ou 16 bits ou une case mémoire.

NOT DL Si DL=C1 alors : DL ← DL = 3Eh

MO

KH

TA

RI

Page 35: Architecture.ordinateurs.8086.Elmokhtari

4. Instructions de manipulation de bits Syntaxe Rôle Remarques Exemples (1) SHR destination , 1 (2) SHR destination , CL

Réalise un décalage à droite de destination

décalage d'un seul bit à droite décalage de n bits à droite tel que n est la valeur stockée dans CL

SHR AL,CL Si AL=7Ah et CL=4 alors AL←07h

(1) SHL destination , 1 (2) SHL destination , CL

Réalise un décalage à gauche de destination

(1) décalage d'un seul bit à gauche (2) décalage de n bits à gauche (CL=n)

SHL BL,1 Si BL=41h alors BL←82h

(1) ROR destination , 1 (2) ROR destination , CL

Réalise un rotation à droite de destination (1) rotation d'un seul bit à droite (2) rotation de n bits à droite (CL=n)

(1) ROL destination , 1 (2) ROL destination , CL

Réalise un rotation à gauche de destination

(1) rotation d'un seul bit à gauche (2) rotation de n bits à gauche (CL=n)

(1) RCR destination , 1 (2) RCR destination , CL

Réalise un rotation à droite de destination à travers le bit CF

(1) rotation d'un seul bit à droite (2) rotation de n bits à droite (CL=n)

(1) RCL destination , 1 (2) RCL destination , CL

Réalise un rotation à gauche de destination à travers CF

(1) rotation d'un seul bit à gauche (2) rotation de n bits à gauche (CL=n)

RCL BL,CL Si BL=72h, CL=2 et CF=0 alors : BL←C8h et CF←1

Cours de l’architecture des ordinateurs – FS

T Tanger – K. E

L

- 35 -

5. Instructions de branchement 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 marqué par Etiquette.

Le sous-programme appelé doit obligatoirement se terminer par l'instruction de retour RET

CMP destination , source Effectue l'opération : destination - source et positionne les drapeaux du registre d'état.

source et destination ne sont pas modifiés Cette instruction précède en général un saut 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 inférieur ou égal respectivement

La comparaison est effectuée en binaire signé CMP CL,30h JL fleur (saut à fleur si CL<30h)

MO

KH

TA

RI

Page 36: Architecture.ordinateurs.8086.Elmokhtari

C

ours de l’architecture des ordinateurs – FST Tanger – K

. EL

- 36 -

Syntaxe Rôle Remarques Exemples JG,JGE Etiquette Effectue un saut à Etiquette si supérieur

ou supérieur ou égal respectivement La comparaison est effectuée en binaire signé CMP DH,FFh - JG fleur2

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 inférieur ou égal respectivement

La comparaison est effectuée en binaire non signé

JA,JAE Etiquette Effectue un saut à Etiquette si supérieur ou supérieur ou égal respectivement

La comparaison est effectuée en binaire non signé

CMP DH,FFh - JA fleur2 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 ZF, CF, PF, SF, OF respectivement est à 1

ADD AL,14h JC Trai_Re (Saut à Trai_Re en cas de retenue)

JNZ,JNC,JNP,JNS,JNO Etiquette

Effectue un saut à Etiquette si le drapeau ZF, CF, PF, SF, OF respectivement est à 0

SUB AX,185Eh 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 Syntaxe Rôle Remarques Exemples CLC, CLD, CLI Met à zéro les drapeaux CF, DF et IF

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 pointeur vers une adresse. Le pointeur de pile SP est décrémenté de 2

PUSH AX PUSH [SI]

POP destination Dépile le sommet de la pile vers destination

destination doit être un registre de 16 bits ou un pointeur vers une adresse. Le pointeur de pile SP est incrémenté de 2

POP DS POP [BX]

MO

KH

TA

RI

Page 37: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 38: Architecture.ordinateurs.8086.Elmokhtari

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 XOR BL,BL ;instruction exécutée après le premier appel ADD DL,05h CALL Affich ;Deuxième appel au sous-programme Affich 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 programme (instruction RET), le microprocesseur récupère l'adresse de retour de la pcontinue l'exécution à cette adresse (pour plus de détails, voir chapitre 4 : La pile paragraphe

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édrapeaux du registre d'état (CF, ZF, PF, ...).

Avant d'effectuer un saut conditionnel, il faut positionner les drapeaux pour traduire la condivérifier. Dans la plupart des cas, les sauts conditionnels sont précédés par deux instructiocomparaison : CMP ou TEST. Ceux deux instructions n'ont AUCUNE influence sur les opéraqu'on compare. Leur seul rôle est de positionner les drapeaux en fonction du résultat 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 -

1er Retour

2ème Retour

sous-ile et 1.2).

rents

tion à ns de ndes

de la

Page 39: Architecture.ordinateurs.8086.Elmokhtari

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 (1 ou 2 octets)

Opérande (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 -

Page 40: Architecture.ordinateurs.8086.Elmokhtari

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

Exemple Mnémoniques Code

opération Nb.

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 JNE adresse 75 2 JA adresse 77 2 JB adresse 72 2

Le codage dépend de l'offset de l'instruction de saut

INT n° CD 2 INT 21h CD 21

- 40 -

Page 41: Architecture.ordinateurs.8086.Elmokhtari

C H A P I T R E

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 Z

one

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 -

Page 42: Architecture.ordinateurs.8086.Elmokhtari

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

Donnée déjà 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

58h Sommet de la pile

2Fh

9Ah • Après l'instruction :

80h 39h 58h

SS:SP → 2Fh 9Ah

Nouveau sommet

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 -

Page 43: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 44: Architecture.ordinateurs.8086.Elmokhtari

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

13h Contenu de cx

(oublié dans la pile !)

05h 08h

L'adresse de retour

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 -

Page 45: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 46: Architecture.ordinateurs.8086.Elmokhtari

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

12h L'adresse de retour

10h 00h

Paramètre 2

05h 00h

Paramètre 1

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

12h L'adresse de retour

BP+2 → 10h 00h

Paramètre 2

BP+4 → 05h 00h

Paramètre 1

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

00h Paramètre 2

05h 00h

Paramètre 1

- 46 -

Page 47: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 48: Architecture.ordinateurs.8086.Elmokhtari

C H A P I T R E

5 Les interruptions

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

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.

Vol

Ascenseur

Incendie

Système à µP

Centrale d'alarme

- 48 -

Page 49: Architecture.ordinateurs.8086.Elmokhtari

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.

8086

INTR

NMI

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

......

Bus de données

INTA 8259A 8086

IRQ0

IRQ1

IRQ7

- 49 -

Page 50: Architecture.ordinateurs.8086.Elmokhtari

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

00001 Offset du SP

00002

00003 Segment du SP

Interruption 00 : Division par 0

00004

00005 Offset du SP

00006

00007 Segment du SP

Interruption 01 : Pas à pas

003FF

14243

14243

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 -

Page 51: Architecture.ordinateurs.8086.Elmokhtari

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.

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

8086 Contrôleur

du port série

Modem ligne téléphonique

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 -

Page 52: Architecture.ordinateurs.8086.Elmokhtari

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.

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"

8086

Contrôleur du port

série

8259A INTR IRQ5

- 52 -

Page 53: Architecture.ordinateurs.8086.Elmokhtari

C H A P I T R E

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 -

Page 54: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 55: Architecture.ordinateurs.8086.Elmokhtari

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

8255

RC

PC

PB

PA

PA7

PA0

123 Adresses des registres

AB PA AB+1 PB AB+2 PC AB+3 RC

AB : Adresse de base du 8255

Port A

PB7

PB0

123 Port B

PC0 Cinf

Csup 14243

PC3 Port C PC4

PC7

6.1. Connexion du 8255 au microprocesseur

8086

RESET

8255 A1 …

WR

RD

RESET

CS

D0-D7

R/W

A2

A0 A1

Décodeur d’adresse

A15

M/IO

D0-D7

A0

Bus de données

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

Mode du port A/Csup (mode 0)

0 Sens de Cinf

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 -

Page 56: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 57: Architecture.ordinateurs.8086.Elmokhtari

C H A P I T R E

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 -

Page 58: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 59: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 60: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 61: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 62: Architecture.ordinateurs.8086.Elmokhtari

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 -

Page 63: Architecture.ordinateurs.8086.Elmokhtari

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 -