Cours d’initiation à l’Architecture des ordinateurs
...
Généralités sur les microprocesseurs
1.1. Le microprocesseur
On appelle processeur tout dispositif électronique qui permet de réaliser :
Le microprocesseur est un processeur qui existe sous forme d'un circuit intégré. C'est le composant de base de tout ordinateur.
A un instant donnée, le microprocesseur peut réaliser une seule instruction. Mais, il faudrait qu'il soit capable de réaliser une suite d'instructions (un programme).
Question : Où faut-il mettre le programme ?
Réponse : Dans une mémoire.
Question : Comment communiquent ces deux circuits ?
Réponse : Pour y répondre, on va étudier, tout d'abord, l'organisation de la mémoire.
1.2. La mémoire et le bus
La mémoire est une suite de m cases contenant chacune n bits :
n bits Données binaires
Pour accéder à une case, il faut fournir le numéro de la case : l'adresse. Soit l'exemple suivant qui illustre une mémoire de 16 cases de 8 bits :
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.
Mémoire de 16 octets
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 :
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).
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) :
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 :
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.
Exemple
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
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.
...
Exemple
Le microprocesseur comporte :
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)
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 :
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
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
3 Le microprocesseur
INTEL 8086
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
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.
Le 8086 dispose d'un bus d'adresse de 20 bits : A19 à A0 donc d'un espace mémoire adressable de 220 = 1 Mo.
La mémoire peut être vue ainsi :
8 bits (octet)
00000
00001
FFFFE FFFFF
Chaque case contient un octet.
Le 8086 manipule des données sur 8 bits et sur 16 bits :
Ainsi, le 8086 stocke le mot 658Fh à l'adresse 01000h comme suit :
01000h 01001h 8Fh
65h
Le 8086 a 14 registres de 16 bits classés en 4 groupes :
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 High) (AX Low)
On écrit : AX = AH : AL
Si AX = 12A4h alors AH = 12h et AL = A4h.
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.
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.
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 :
DS → Zone de données
CS →
SS → Zone de code
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 x DS)
Exemple
Dans l'instruction MOV AL,[1000h], l'adresse physique, si DS = 120h, est :
Adresse physique = 1000h + (10h x 120h) = 1000h + 1200h = 02200h Remarques
En général, en fixant DS, on peut accéder aux adresses physiques comprises entre (DS x 10h) et
L'adresse physique 08000h appartient en même temps aux segments DS=0 et DS=800h. Elle peut être calculé par : DS=0 ; Offset = 8000h, ou encore par : DS = 800h ; Offset = 0.
4.3.2. Le registre de segment de code CS (Code Segment)
La zone réservée aux instructions du programme est associé au registre de segmentation CS.
Afin que le microprocesseur puisse lire un instruction dans la mémoire, il doit fournir son adresse logique (contenue dans le registre IP) et son segment dans CS (voir 4.4.2).
4.3.3. Le registre de segment de pile SS (Stack Segment)
La pile est une zone mémoire gérée en LIFO (Last In, First out). Elle est utilisée d'une part par le processeur pour sauvegarder l'état du système lors d'un appel à un sous-programme ou à une interruption, et d'autre part par le programmeur pour passer des paramètres à un sous-programme
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 x 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
Ces drapeaux sont divisés en deux catégories : 4.4.1.1.
...
Afin d'étudier des exemples sur les différents modes d'adressage, nous allons donner la syntaxe de l'instruction de transfert MOV :
MOV destination, source
Destination est chargée par le contenu de source. Source reste inchangée.
5.1. Mode Registre
L'opérande est désigné par le contenu d'un registre. Exemple
MOV AX,DX
Avant l'instruction Après l'instruction
AX = 12C7h AX = 5EBAh
DX = 5EBAh DX = 5EBAh
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
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.
Pour lire le 4ème élément du tableau (indice i=3) en mode direct, on doit calculer son adresse :
1202h + 3 = 1205h
D'une manière générale, dans un tableau où chaque élément occupe m octets, l'adresse de l'élément d'indice i est donnée par :
Adresse de l'élément i = adresse de base du tableau + (taille d'un élément en octets × i)
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
11A62h 68h
11A63h 07h
Exemple 2
Soit : BP = F415h ; SS = 0784h ; AX = 76E4h
MOV [BP]7Ah,AL
Autre écriture : MOV [BP+7Ah],AL
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
Résultat de l'instruction :
A1BA:34AB
A1BA:34AC 2Bh 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é :
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) :
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
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)
...
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 :
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.
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.
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.
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 sous-programme (instruction RET), le microprocesseur récupère l'adresse de retour de la pile et continue l'exécution à cette adresse (pour plus de détails, voir chapitre 4 : La pile paragraphe 1.2).
6.2.3. Les sauts conditionnels
Les sauts conditionnels ont lieu si une condition est vérifiée. Ils dépendent en réalité des différents drapeaux du registre d'état (CF, ZF, PF, ...).
Avant d'effectuer un saut conditionnel, il faut positionner les drapeaux pour traduire la condition à vérifier. Dans la plupart des cas, les sauts conditionnels sont précédés par deux instructions de comparaison : CMP ou TEST. Ceux deux instructions n'ont AUCUNE influence sur les opérandes qu'on compare. Leur seul rôle est de positionner les drapeaux en fonction du résultat de la comparaison.
6.2.3.1. L'instruction CMP
Syntaxe : CMP destination,source destination et source restent inchangés.
CMP réalise une soustraction entre les deux opérandes : destination – source