Le Microprocesseur 8086
Le Microprocesseur 8086
Le Microprocesseur 8086
Le microprocesseur 8086
Du fait de la compatibilité, ascendante des microprocesseurs de INTEL, il est possible de programmer
un i7 avec les instructions du 8086 que nous allons étudier dans cette partie.
Le microprocesseur 8086 se présente sous forme d'un boîtier de 40 broches alimenté par une
alimentation unique de 5V. (Figure : brochage du 8086)
13
Le tableau ci-dessous illustre la description des différentes broches
14
2.1 les registres du 8086
Les registres du microprocesseur 8086 sont tous des registres 16 bits. Ils sont répartis en 5 catégories:
registres de travail, registres de segment, registres pointeurs, registres index et registres spéciaux.
Le registre AX peut être décomposé en AH (H pour High, les 8 bits de fort poids de AX) et AL
(L pour Low, les 8 bits de faible poids de AX). De la même façon BX peut être décomposé en BH et
BL, CX en CH et CL, DX en DH et DL.
Dans beaucoup d'instructions, ces registres sont banalisés et peuvent être utilisés indifféremment.
Toutefois, dans certaines instructions, ils ont un rôle bien précis:
15
CS : Code Segment : sert à l’adressage des octets du programme (code)
DS: Data Segment : sert à l’adressage de la mémoire de données dans laquelle sont stockées
toutes les données traitées par le programme.
SS : Stack Segment : gère la pile.
ES : Extra Segment :sert à l’adressage d’une mémoire de données supplémentaires.
Ils sont au nombre de 2 et notés SP et BP. Ils sont dédiés à l'utilisation de la pile. Le registre SP (Stack
Pointer) pointe sur le sommet de la pile et il est mis à jour automatiquement par les instructions
d'empilement et de dépilement; BP (Base Pointer) pointe la base de la région de la pile contenant les
données accessibles (variables locales, paramètres,...) à l'intérieur d'une procédure. Il doit être mis à
jour par le programmeur.
16
Le registre SR contient l'état du microprocesseur matérialisé par les indicateurs (Flags).
six bits reflètent les résultats d'une opération arithmétique ou logique et 3 participent au control du
processeur.
• P : (Parité) indique que le nombre de 1 est un nombre pair. Ce flag est utilisé avec certains
sauts conditionnels.
A : (retenue Arithmétique) indique une retenue sur les 4 bits (digit) de poids faible. Par
exemple quand la somme des 2 digits de poids faible dépasse F (15)
Z : (Zéro) Indique que le résultat d'une opération arithmétique ou logique est nul. Il est utilisé
dans plusieurs instructions de sauts conditionnels.
S : (Signe) reproduit le bit de poids fort d'une quantité signée sur 8 bits ou sur 16 bits.
L'arithmétique signée fonctionne en complément à 2. S=0 : positif, S=1 : négatif. Ce flag sert
lors de sauts conditionnels.
T : (Trap) met le CPU en mode pas à pas pour faciliter la recherche des défauts d'exécution.
I : (Interruption) autorise ou non la reconnaissance des interruptions : I = 0 alors Interruptions
autorisées. I = 1 alors Interruptions non autorisées
D : (Direction) fixe la direction de l'auto-inc/décrémentation de SI et DI lors des instructions
de manipulation de chaînes. D = 0 alors incrémentation des index. D = 1 alors décrémentation
des index
: (Overflow) indique un dépassement de capacité quand on travaille avec des nombres signés.
Comme par exemple si la somme de 2 nombres positifs donne un nombre négatif ou
inversement. (40h + 40h = 80h et O=1).
17
2.2 L'unité d'interface avec le bus (BUS)
Le BIU effectue toutes les opérations de bus sur l'unité d’exécution EU (ALU, SR et les registres
généraux). Les transferts de données entre le CPU d'une part et la mémoire ou les E /S d' autre par se
font sur demande de L'EU. Elle recherche les instructions en mémoire et les rangs dans une file
d’attente ;
18
2.3 Le fonctionnement interne d’un 8086
La solution adoptée par Intel a été la suivante : Puisque avec 16 bits en peut adresser 216 octets
= 65535 octets = 64 ko, La mémoire totale adressable de 1 Mo est fractionnée en pages de 64 ko
appelés segments. On utilise alors deux registres pour adresser une case mémoire donnée. Un
registre pour adresser le segment qu'on appelle registre segment et un registre pour adresser à
l'intérieur du segment qu'on désignera par registre d'adressage ou offset. Une adresse se présente
toujours sous la forme segment: offset
Pour calculer l’adresse physique ou l’adresse absolue on procède à cette opération : on décale le
registre segment vers la gauche et on donne la valeur 0 en hexa au bit le mois significatif puis on
effectue une addition entre le registre segment et l’offset :
Dans notre exemple, l'adresse de la case mémoire considérée devient 2000:350 soit :
Segment = 2000
Offset = 350
L'adresse absolue ou adresse physique est calculée ainsi :
19
A un instant donné, le 8086 a accès à 4 segments dont les adresses se trouvent dans les registres de
segment CS, DS, SS et ES. Le segment de code contient les instructions du programme, le segment de
données contient les données manipulées par le programme, le segment de pile contient la pile de
sauvegarde et le segment supplémentaire peut aussi contenir des données.
Le registre CS est associé au pointeur d’instruction IP, ainsi la prochaine instruction exécuter se trouve
` a l’adresse logique CS : IP.
De même, les registres de segments DS et ES peuvent être associés à un registre d’index.
Exemple : DS : SI, ES : DI. Le registre de segment de pile peut être associé aux registres de pointeurs :
SS : SP ou SS : BP.
Mémoire accessible par le 8086 à un instant donné:
20
Si le registre segment n’est pas spécifié (cas rien), alors le processeur l’ajoute par défaut selon l’offset
choisit :
L'Espace d'E/S
L'accès au ports se fait a l'aides des instructions IN et OUT.
Format :
IN PORT, Données
OUT Données, PORT
21
Dans cette instruction, le contenu des cases mémoire dont l’adresse est pointée par
DS :COMPTE et DS :COMPTE+1 sera transféré dans AX.
MOV AX, [243] : Copier le contenu de la mémoire d'adresse DS:243 dans AX
MOV [123], AX : Copier le contenu de AX dan la mémoire d'adresse DS:123
MOV AX, SS:[243] : Copier le contenu de la mémoire SS:243 dans AX
La deuxième instruction signifie qu’on à charger le registre AX par le contenu de la case mémoire
dont l’adresse se trouve pointée par le registre BX, (qui est l’offset de COMPTE).
D’autres exemples :
MOV AX, [BX] ; Charger AX par le contenu de la mémoire d'adresse DS:BX
MOV AX, [BP] ; Charger AX par le contenu de la mémoire d'adresse SS:BP
MOV AX, [SI] ; Charger AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [DI] ; Charger AX par le contenu de la mémoire d'adresse DS:DI
MOV AX, ES:[BP] ; Charger AX par le contenu de la mémoire d'adresse ES:BP
Avec le registre BX on peut accéder à divers structure de données qui se trouvent en différents endroits
de la mémoire. Pour ce la il suffit de mettre l’adresse de base dans le registre de base (BX ou BP) et
on pointe les éléments de la structure par leurs déplacement par rapport à la base. Pour se déplacer
vers une autre structure, il suffit de changer le registre de base.
Exemples :
MOV AX, [BX] : Charger AX par le contenu de la mémoire d'adresse DS:BX
MOV AX, [BX+5] : Charger AX par le contenu de la mémoire d'adresse DS:BX+5
MOV AX, [BP-200] : Charger AX par le contenu de la mémoire d'adresse SS:BX-200
MOV AX, [ES:BP] : Charger AX par le contenu de la mémoire d'adresse ES:BP
22
3.4.2 Mode d’adressage direct indexé
Dans le mode d’adressage indexé, l’adresse effective est la somme d’un label ou d’un déplacement et
d’un registre indexe SI ou DI.
Exemples :
MOV AX, [SI] ; Charger AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [SI+500] ; Charger AX par la mémoire d'adresse DS:SI+500
MOV AX, [DI-8] ; Charger AX par la mémoire d'adresse DS:DI-8
MOV AX, [ES:SI+4] ; Charger AX par la mémoire d'adresse ES:SI+4
TAB est une table d’octets ( TAB DB 100 DUP( ?) )
MOV DI,2
MOV AL,TAB[DI]
Cette instruction charge le 3ème octet du TAB dans le registre AL.
TAB est une table de mots ( TAB DW 100 DUP( ?) )
MOV DI,4
MOV AX,TAB[DI]
Cette instruction charge le 3 ème mot du TAB dans le registre AX.
Ce modes d’adressage est intéressant dans le cas ou on veut accéder a une structure bidimensionnelle
comme le matrices. Dans ce cas le registre de base contient l’adresse de départ du tableau, le registre
index contient le numéro de la ligne et le déplacement le numéro de la colonne.
Exemples :
MOV AX,[BX+SI] ; AX est chargé par la mémoire d'adresse DS:BX+SI
MOV AX,[BX+DI+5] ; AX est chargé par la mémoire d'adresse DS:BX+DI+5
MOV AX,[BP+SI-8] ; AX est chargé par la mémoire d'adresse SS:BP+SI-8
23
MOV AX,[BP+DI] ; AX est chargé par la mémoire d'adresse SS:BP+DI
Résumé
- EQU :
Nom EQU expression ; assigne le nom de l’expression au nom
Exemples :
Pi EQU 3.14 ; valeur constante
Dans certains cas, l'adressage indirect est indéterminé par rapport à la taille qui doit être pris en
considération.
Exemple :
Mov [bx], 25h ; range 21 à l'adresse spécifiée par BX
L'assembleur ne sait pas si l'instruction concerne 1, 2 ou 4 octets
Afin de lever l'ambiguïté, on doit utiliser une directive spécifiant la taille de la donnée à transférer
:
MOV byte ptr [BX], val ; concerne 1 octet
MOV word ptr [BX], val ; concerne 1 mot de 2 octets
4.1.3 Les directives de segment et de procédure (Assume ; segment ; proc/endp)
- Segment : cette directive délimite un segment, elle permet de
contrôler la relation entre la génération du code objet et la gestion des segments logiques
ainsi générés.
25
Syntax de la directive
nom_seg SEGMENT [align][combine][‘class’]
……
……
……
nom_seg ENDS
ENDS marque la fin du segment.
Exemple :
DONNEE SEGMENT
Message DB ‘ bonjours a tous$ ‘
DONNEE ENDS
- Assume :
La directive ASSUME permet d'indiquer à l'assembleur quel est le segment de données et celui
de codes (etc...), afin qu'il génère des adresses correctes.
2. Une partie pour déclarer une pile qui est définie dans le segment de pile délimité par les directives
SEGMENT STACK et ENDS
3. Des définitions de données déclarées par des directives. Celles-ci sont regroupées dans le segment
de données délimité par les directives SEGMENT et ENDS
4. Puis sont placées les instructions (qui sont en quelque sorte le coeur du programme), la première
devant être précédée d'une étiquette, c'est-à-dire par un nom qu'on lui donne. Celles-ci sont regroupées
dans le segment d'instructions délimité par les directives SEGMENT et ENDS
5. Enfin, le fichier doit être terminé par la directive END suivi du nom de l'étiquette de la première
instruction (pour permettre au compilateur de connaître la première instruction à exécuter (Les points-
virgules marquent le début des commentaires, c'est-à-dire que tous les caractères situés à droite d'un
point virgule seront ignorés) Voici à quoi ressemble un fichier source (fichier .ASM):
Title prog01.asm
Pile SEGMENT STACK ; On met les directives pour réserver de l'espace mémoire.
26
PILE ENDS
Data SEGMENT ; On met les directives de données pour réserver de la mémoire
; Pour les variables qui seront utilisées dans le programme.
Data ENDS
Extra SEGMENT ; On met les directives pour déclarer ;
;les variables (les chaînes de Caractères).
Extra ENDS
Code SEGMENT
ASSUME cs : code, ds, data, es : pile :ss :pile
PROG:
Mov AX,Data
Mov DS,AX
Mov AX,Extra
Mov ES,AX
Mov AX,pile
Mov SS,AX ; mettre les instructions du programme
Code ENDS
END PROG
Comme nous l’avons indiquer au paragraphe précédent, c'est la directive ASSUME qui permet
d'indiquer à l'assembleur où se situe le segment de données et le segment de code. Puis il s'agit
d'initialiser le segment de données DS (même chose pour : ES et SS)
MOV AX, nom_du_segment_de_données;
MOV DS, AX
27
Voir le fichier des instructions
5. Les entrée sorties
Pour faire des entrées sorties (essentiellement avec l’écran et le clavier), on passe par des interruptions
du BIOS ou du DOS.
28
5.1 Gestion des ports d’E/S par le 8086
Le 8086 dispose d’un espace mémoire de 1 Mo (adresse d’une case mémoire sur 20 bits) et
d’un espace d’E/S de 64 Ko (adresse d’un port d’E/S sur 16 bits).
Le signal permettant de différencier l’adressage de la mémoire de l’adressage des ports d’E/S est la
ligne M / IO :
Les instructions de lecture et d’écriture d’un port d’E/S sont respectivement les instructions IN et
OUT. Elles placent la ligne M / IO à 0 alors que l’instruction MOV place celle-ci à 1.
29
IN al, adresse : lecture d’un port sur 8 bits
IN ax, adresse : lecture d’un port sur 16 bits
si l’adresse du port d’E/S est sur deux octets :
IN al, dx: lecture d’un port sur 8 bits
IN ax, dx: lecture d’un port sur 16 bits
Où le registre DX contient du port d’E/S à lire.
6. Les Interruptions
Imaginer qu'un événement extérieur demande un traitement particulier du µp. Cet événement peut
intervenir à n'importe quel instant. Le processeur doit être capable d'abandonner le programme en
cours et servir la routine correspondant à cette demande d'intervention. Une fois cette demande traitée,
le µp reprend le programme qui était en cours d'exécution sans aucune perte de donnée ou d'état.
Sachant que la routine appelée va de toute façon, utiliser les mêmes registres et les mêmes drapeaux
que le programme principal, il faut sauvegarder l'état complet du système avant de commencer la
routine d'interruption et les récupérer juste avant de revenir au programme principal.
30
Normalement le DOS est relativement de haut niveau et ne dépend pas de la machine. Il fait souvent
appel au bios qui fonctionne à un niveau plus proche de la machine. L'interruption 21h peut réaliser
plusieurs fonctions différentes. Nous ne citerons ici que celles que nous utiliserons.
Fonction 02
Cette fonction permet d'écrire un caractère. Le caractère est envoyé vers la sortie standard, l'écriture
peut donc être redirigée dans un fichier.
Paramètres : AH = 02h
DL = Caractère à écrire
Fonction 09
Cette fonction permet en un seul appel, d'écrire une suite de caractères.
Paramètres : AH = 09h
DX = Adresse de la chaîne de caractères
La chaîne doit être terminée par le caractère $
Fonction 07
Cette fonction permet de lire un caractère du clavier sans qu'il n'y ait d'écho à l'écran.
Paramètre passé : AH = 07
Paramètre retourné : AL = caractère lu
Les touches fonction retourne 2 caractères, d'abord un octet nul, puis le code étendu
de la touche, il faut donc faire 2 appels consécutifs de la fonction 07.
Fonction 0Ah
Permet de saisir une chaîne de caractère au clavier. La saisie s'arrête quand on tape la touche de retour
, le caractère CR (13) est mémorisé avec la chaîne Paramètres :
DX : adresse du buffer (zone mémoire tampon) où seront stockés la longueur de la chaîne ainsi que la
chaîne saisie
[DX] : longueur max. avant d'appeler la fonction, il faut placer dans le premier octet du buffer la
longueur max à ne pas dépasser, il faut compter le CR.
Une fois la saisie terminée, la fonction place dans le deuxième octet du buffer le nombre de caractère
effectivement saisi. La chaîne saisie est placée tous de suite derrière.
31
7. Les microcontrôleurs
Un microcontrôleur est un composant réunissant sur un seul et même silicium un microprocesseur,
divers dispositifs d'entrées/sorties et de contrôle d'interruptions ainsi que de la mémoire, notamment
pour stocker le programme d’application. Il intègre également un certain nombre de périphériques
spécifiques des domaines ciblés (bus série, interface parallèle, convertisseur analogique numérique,
...). Les microcontrôleurs améliorent donc l'intégration et le coût (lié à la conception et à la réalisation)
d'un système à base de microprocesseur en rassemblant les éléments essentiels d’un tel système dans
un seul circuit intégré.
Un microcontrôleur possède généralement les éléments suivant :
32
Des convertisseurs numériques-analogiques (CNA) : effectuent l'opération inverse d’un
CAN c’est-à-dire, il permet de reconstituer un signal analogique à partir des donnés
numériques.
Des générateurs de signaux à modulation de largeur d'impulsion (MLI, ou en anglais,
PWM pour Pulse Width Modulation) : il permet de modifier la largeur d’impulsion.
Des timers /compteurs : compteurs d'impulsions d'horloge interne ou d'événements externes);
son rôle est de permettre la synchronisation des opérations que microprocesseur (ou le
microcontrôleur) est chargé d'effectuer.
Des chiens de garde (watchdog) : Le watchdog, ou chien de garde est un mécanisme de
protection de votre programme. Il sert à surveiller si le programme s’exécute toujours dans
l’espace et dans le temps que vous lui avez attribués.
Des comparateurs comparent deux tensions électriques : à titre d’exemple les modules
CCP1 et CCP2 implantés dans un microcontrôleur 16F877.
Des contrôleurs de bus de communication : UART, I2C, SSP, CAN, RS232, USB, Ethernet,
etc.
µC :PIC 16F877
33
34