36 0 940KB
2
Architecture d’un microprocesseur 16 bits Intel 8086
2.1 Introduction L’Intel 8086 (également appelé iAPX 86) est un microprocesseur 16 bits fabriqué par Intel à partir de 1978 (Figure 2.1). C’est le premier processeur de la famille x86, qui est devenue l’architecture de processeur la plus répandue dans le monde des ordinateurs personnels, stations de travail et serveurs informatiques. Parmi ses caractéristiques
Fig. 2.1 : photo du processeur Intel 8086 d’origine de 1978 à côté d’un processeur Intel Core i7-8086K (Core 8ème génération cadencé à 4 GHz en fréquence de base et atteignant 5 GHz en mode turbo) de 2018 en édition limitée. (Crédit : Intel Corporation)
principales, on peut citer : Il se présente sous forme d’un boîtier DIP (Dual Inline Package) de 40 broches (Figure 2.2) alimenté par une alimentation unique de 5V ; Il possède un bus de donnée de 16 bits ce qui permet d’échanger des mots de 2 octets ; 9
2.2 Architecture Interne du 8086 Il possède un bus d’adresse de 20 bits ce qui permet d’adresser 1 Moctets (220 ) ; Tous les registres sont de 16 bits, mais pour garder la compatibilité avec les processeurs de la précédente génération (8085/8088), certains registres sont découpés en deux et on peut accéder séparément à la partie haute et à la partie basse.
Fig. 2.2 : Brochage du 8086.
2.2 Architecture Interne du 8086 Le 8086 est constitué de deux unités (Figure 2.3) : L’unité d’interface de bus UIB (ou en anglais, BIU : Bus Interface Unit) le rôle de l’UIB est d’interagir avec la mémoire et les périphériques d’entrées/sorties pour récupérer et stocker les instructions et les données requises par l’unité d’exécution (UE). L’unité d’exécution ( ou en anglais, EU : Execution Unit) est responsable de l’exécution des instructions des programme qui lui sont transmises par l’UIB et du traitement requis ;
2.2.1
Unité de Bus et d’Interface (BIU)
Le BIU envoie les adresses, récupère les instructions de la mémoire et lit/écrit les données de/dans la mémoire ou des ports. Elle gère donc tous les transferts de données et d’adresses sur les bus pour l’UE. 10
2.2 Architecture Interne du 8086
Fig. 2.3 : Schéma détaillé de l’UE et l’UIB.
La BIU peut stocker jusqu’à 6 octets d’instructions dans un registre FIFO (First In, First Out ou premier entré, premier sorti) appelé file d’attente. Lorsque l’unité d’exécution est prête pour l’instruction suivante, la BIU lit alors l’instruction dans sa file d’attente. La principale raison est d’augmenter la vitesse de traitement du processeur par chevauchement des opérations d’extraction d’instructions avec l’exécution. Ce mécanisme est connu sous le nom de pipeline. La BIU contient Les registres de segment permettent d’accéder, soit au segment de programme qui est la zone mémoire des instructions de programme, soit au segment de données (zone mémoire contenant les données du programme), ou encore au segment de pile. Elle contient aussi le registre pointeur d’instruction. Il s’agit de : CS : Code Segment, registre de segment de code (instructions) ; DS : Data Segment, registre de segment de données ; SS : Stack Segment, registre de segment de pile ; ES : Extra Segment, registre de segment supplémentaire pour les données ; IP : Instruction Pointer, registre de pointeur d’instruction. Pour exécuter les instructions dans l’ordre établi par le programme, le microprocesseur doit savoir à chaque instant l’adresse de la prochaine instruction à exécuter. Le microprocesseur utilise un registre contenant cette information. Ce registre est appelé 11
2.2 Architecture Interne du 8086 pointeur d’instruction (IP : Instruction Pointer) [Haggège, 2003]. Le registre IP est utilisé comme offset avec le registre segment CS est donc modifié implicitement par le processeur (instruction suivante, saut à l’adresse indiquée, appel d’une fonction, interruption ...). Remarque 2.1 la valeur initiale du pointeur d’instruction est fixée par le constructeur du microprocesseur. Elle vaut une valeur bien définie à chaque mise sous tension du microprocesseur ou bien lors d’une remise à zéro (reset). Pour savoir quel type d’opération doit être exécuté (addition, soustraction, ...), le microprocesseur lit le premier octet de l’instruction pointée par le pointeur d’instruction (code opératoire) et le range dans un registre appelé registre d’instruction. Le code opératoire est décodé par des circuits de décodage contenus dans le microprocesseur. Des signaux de commande pour l’UAL sont produits en fonction de l’opération demandée qui est alors exécutée [Haggège, 2003]. Remarque 2.2 Pendant que l’instruction est décodée, le pointeur d’instruction est incrémenté de façon à pointer vers l’instruction suivante
2.2.2
Gestion de la mémoire par le 8086
Le bus d’adresse de la mémoire réelle est de 20 bits. Or le 8086 n’a pas de registre de 20 bits mais que de 16 bits. Un registre de 16 bits référence 64 Ko de mémoire, soit 216 = 65536. Pour répondre à cette problématique, le 8086 en mode réel combine un des neuf registres généraux avec l’un des quatre registres de segments pour former une adresse de 20 bits. En effet, le 8086 utilise le principe de la segmentation ou pagination ; la mémoire est divisée en bloc ou segments. Un segment est une zone mémoire de 64 Ko (65 536 octets) qui peut être adressé par un pointeur sur 16 bits ; la taille des registres du 8086. Chaque segment est complètement définie par son adresse de départ qui doit être un multiple de 16 ; dans une telle adresse , les 4 bits de poids faible sont à zéro. On peut donc représenter l’adresse d’un segment avec seulement ses 16 bits de poids fort, les 4 bits de poids faible étant implicitement à 0. une case mémoire est repérée par le 8086 au moyen de deux valeurs sur 16 bits : 1. l’adresse d’un segment ; 2. un déplacement ou offset (appelé aussi adresse effective) dans ce segment. Le mécanisme de traduction, illustré par la figure 2.4 , ajoute à ces adresses le contenu 12
2.2 Architecture Interne du 8086 d’un registre de segment multiplié par 16. Cette multiplication correspond à un décalage de 4 bits vers la gauche. L’adresse finale véhiculée par le bus externe est donc sur 20 bits. 0000
Registre Segment (16 bits) 4 bits
Déplacement (offset) (16 bits) 20
16
Additionneur 20 Adresse physique (20 bits)
Fig. 2.4 : Calcul d’adresse physique en segmentation.
La donnée d’un couple (segment,offset) définit une adresse logique, notée sous la forme segment :offset. L’adresse d’une case mémoire donnée sous la forme d’une quantité sur 20 bits (5 digits hexa) est appelée adresse physique car elle correspond à la valeur envoyée réellement sur le bus d’adresses A0-A19. 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. Exemple 2.1 si le pointeur d’instruction I P = 1A00H et le registre segment de code C S = 2010H , l’adresse émise (effective ou physique) pour accéder à une instruction sera : (2010 ∗ 10)H + 1A00H = 20100H + 1A00H = 21B00H
Remarque 2.3 les segments ne sont pas nécessairement distincts les uns des autres, ils peuvent se chevaucher ou se recouvrir complètement (Figure 2.5).
2.2.3
Unité d’exécution (UE)
L’UE décode et exécute les instructions. L’UE contient une unité arithmétique et logique (ALU, pour Arithmetic and Logic Unit en anglais), une unité de contrôle et un certain nombre de registres. Ces fonctionnalités permettent l’exécution d’instruc13
2.2 Architecture Interne du 8086
Fig. 2.5 : Exemple de chevauchement des segments 8086.
tions et d’opérations arithmétiques et logiques. Elle possède neuf registres de 16 bits ; 4 registres d’usage générale AX, BX, CX, DX, 2 registres d’index SI, DI, 2 registres pointeurs SP, BP et un registre indicateur d’états Flags. Les quatre premiers peuvent être utilisés comme registre 8 bits (AH, AL, BH, BL, CH, CL, DH, DL).
Registre AX Le registre AX est appelé accumulateur 16 bits et AL accumulateur 8 bits. Les instructions E/S (I/O en anglais) (IN ou OUT en assembleur) utilisent toujours AX ou AL pour l’entrée/la sortie des données 16 ou 8 bits depuis ou vers les ports E/S.
Registre BX BX est appelé registre de base car il s’agit du seul registre à usage général pouvant être utilisé comme index pour étendre l’adressage. Il est utilisé pour l’adressage de données dans une zone mémoire différente de la zone code : en général il contient une adresse de décalage par rapport à une adresse de référence. (Par exemple, l’adresse de début d’un tableau). De plus il peut servir pour la conversion d’un code à un autre.
Registre CX En plus d’être utilisé pour les opérations arithmétiques et logiques, le registre CX est appelé registre de compteur car certaines instructions telles que SHIFT, ROTATE et LOOP utilisent CX en tant que compteur. 14
2.2 Architecture Interne du 8086 Registre DX Le registre DX est appelé registre de données. Certaines opérations d’E / S nécessitent son utilisation et les opérations de multiplication et de division impliquant des valeurs élevées supposent l’utilisation conjointe de DX et de AX. Registres pointeurs de pile (SP) et pointeur de base (BP) Les deux sont utilisés pour accéder aux données du segment de pile. SP et le pointeur de Pile ; utilisé pour l’accès à la pile. Il représente le décalage (offset) relatif à SS (registre de segment qui indique l’adresse de début de la pile). Le contenu du SP est automatiquement mis à jour (incrémenté/décrémenté) lors de l’exécution des opérations POP et PUSH (voir le fonctionnement de la pile). Le registre BP est utilisé par les instructions utilisant le mode d’adressage basé et contient l’adresse de décalage dans le segment de pile actuel. Les registres d’index Les deux registres d’index SI (Source Index) ou index de source et DI (Destination Index) ou index de destination sont utilisés dans l’adressage indexé. Il sont généralement utilisés par les instructions qui traitent des chaînes de caractères ou les tableaux afin de distinguer les adresses source et de destination. Le registre d’état (Flags) Le 8086 a neuf drapeaux (indicateur d’état) de 1 bit (Figure 2.6). Sur les neuf, six reflètent des états du processeur après chaque instruction exécutée (retenue (addition ou soustraction), dépassement, comparaison, autoriser les interruptions, …) et trois sont des drapeaux de contrôle. Les bits de contrôle peuvent être définis ou réinitialisés par le programmeur. O
D
I
T
S
Z
A
D15
P
C D0
Fig. 2.6 : Registre indicateur d’état - Flags
O : Overflow Flag Drapeau de dépassement de capacité. Cet indicateur est défini à 1 si un dépassement de capacité arithmétique se produit ; c’est-à-dire si le résultat d’une opération signée ne peut pas tenir dans le registre de destination. 15
2.2 Architecture Interne du 8086 D : Direction Flag Indicateur de direction. Il est utilisé par les instructions de manipulation de chaîne. Si ce bit est égal à « 0 », la chaîne est traitée en commençant par l’adresse la plus basse jusqu’à l’adresse la plus élevée, c’est-à-dire en mode d’incrémentation automatique. sinon, la chaîne est traitée de l’adresse la plus élevée à l’adresse la plus basse, c’est-à-dire en mode de décrémentation automatique. I : Interrupt flag Si cet indicateur est défini à 1, les interruptions masquables sont reconnues par la CPU, sinon, elles sont ignorées. T : Trap flag Si cet indicateur est défini à 1, le processeur entre en mode d’exécution pas à pas. En d’autres termes, une interruption d’arrêt est générée après l’exécution de chaque instruction. Le processeur exécute l’instruction en cours et le contrôle est transféré au programme générant l’interruption. S : Sign flag Cet indicateur est défini lorsque le résultat d’un calcul est négatif. Pour les calculs signés, le drapeau de signe est égal au MSB (le bit le plus significatif ou Most Significant Bit en anglais) du résultat. Z : Zero flag Cet indicateur est défini à 1 lorsque le résultat du calcul est/ou que la comparaison effectuée par l’instruction précédente est égale à zéro. ç-à-d. 1 pour un résultat nul et 0 pour un résultat non nul. A : Auxiliary Carry 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). Le cas le plus courant d’utilisation de cet indicateur est les opérations sur les nombre BCD (Binary Coded Decimal). P : Parity flag Cet indicateur est défini à 1 si l’octet inférieur du résultat contient un nombre pair de 1, sinon il est défini à 0. C : Carry flag cet indicateur est défini à 1 lorsque : deux nombres non signés sont additionnés et le résultat dépasse la ”capacité” du registre de destination. Ex : on veut ajouter deux nombres sur 8 bits et sauvegarder le résultat dans un registre de 8 bits. 255 + 9 = 264, le résultat ne peut pas tenir dans un registre de 8 bits. Donc, la valeur ”8” sera sauvegardée ici (264 % 256 = 8) et le drapeau CF sera défini. on soustrait deux nombres non signés. On soustrait le plus grand du plus petit. Ex : 1-2 = 255 comme résultat et le drapeau des FC sera défini à 1. 16
2.3 Programmation du 8086
2.3 Programmation du 8086 2.3.1
Introduction
Chaque microprocesseur reconnaît un ensemble d’instructions appelé jeu d’instructions (Instruction Set) fixé par le constructeur. Remarque 2.4 Une instruction réalise une action simple sur le microprocesseur, comme ”récupérer une nombre en mémoire”, ”additionner deux nombres et placer le résultat en mémoire”. Une instruction est composée de deux champs : le code opération, qui indique au processeur quelle instruction réaliser ; le champ opérandes qui contient les données, ou les références aux données en mémoire (adresses). Une instruction est définie par son code opération, valeur numérique binaire difficile à manipuler par l’être humain. On utilise donc une notation symbolique pour représenter les instructions : les mnémoniques. L’assembleur aura pour rôle de convertir le fichier source contenant les instructions ; en mnémoniques en actions sur les registres et mémoire. Le fichier exécutable produit contient les codes binaires de chacune des instructions, compréhensible uniquement par le microprocesseur associé. L’assembleur est donc qu’une traduction d’un fichier source éditer en langage de haut niveau vers un langage binaire (de bas niveau) . Exemple 2.2 Soit l’instruction de transfert suivante : mov [1100H], 15H
mov est le mnémonique de l’instruction de transfert et [1100H] et 15H sont les opérandes.
Les instructions et leurs opérandes (paramètres) sont stockées en mémoire principale. La taille totale d’une instruction (nombre de bits nécessaires pour la représenter en mémoire) dépend du type d’instruction et aussi du type d’opérande. Intel x86 utilise un codage à largeur variable. Ainsi, le processeur doit avoir une logique interne qui met à jour le pointeur d’instruction (IP) dans le cadre de son processus de décodage d’instruction. Il récupère l’instruction, la décode et incrémente le pointeur d’instruction de la taille réelle de l’instruction décodée. 17
2.3 Programmation du 8086
2.3.2
Les modes d’adressage du 8086
Une instruction est toujours codée sur un nombre entier d’octets, afin de faciliter son décodage par le processeur. Les façons de désigner les opérandes constituent les « modes d’adressage ». Selon la manière dont les opérandes (les données) sont spécifiés, c’est à dire selon le mode d’adressage de la donnée, une instruction sera codée par 1, 2, 3 ou 4 octets. Le microprocesseur 8086 possède plusieurs modes d’adressage.
Adressage registre (R) L’opération se fait sur un ou 2 registres. mov AX,BX
;transfert entre registres
inc CL
; incrémenter CL (CL=CL+1)
Adressage Immédiat (IM) Ce type d’instruction met en jeu un registre et une valeur (qu’il s’agisse d’une affectation, une addition, une soustraction ou bien même une comparaison), la taille de l’opérande dépendra donc du type de registre mis en jeu (1 octet pour un registre 8 bits, 2 pour un registre de 16 bits). mov AX,56
;charger registre AX par la valeur 56 décimal
add AX,16H
;addition du contenu de AX avec la valeur 16 en hexa
inc CL
;incrémenter CL (CL=CL+1)
Adressage Direct (D) Un des deux opérandes se trouve en mémoire. L’adresse de la case mémoire ou plus précisément son Offset est précisé directement dans l’instruction. L’adresse Rseg:Off doit être placée entre [], si le segment n’est pas précisé, DS est pris par défaut. 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
18
2.3 Programmation du 8086
Adressage indirect (IR) Un des deux opérandes se trouve en mémoire. L’offset de l’adresse n’est pas précisé directement dans l’instruction, il se trouve dans l’un des 4 registres d’offset BX, BP, SI ou DI et c’est le registre qui sera précisé dans l’instruction : [Rseg:Roff]. 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
Adressage basé (BA) l’offset est contenu dans un registre de base BX ou BP. On peut préciser un déplacement qui sera ajouté au contenu de Roff pour déterminer l’offset Exemples : transfère la donnée dont l’offset est contenu dans le registre de base BX vers le registre AL. Le segment associé par défaut au registre BX est le segment de données : on dit que l’adressage est basé sur DS ; mov AL,[BX]
mov AL,[BP] : le segment par défaut associé au registre de base BP est le segment de pile.
Dans ce cas, l’adressage est basé sur SS ; AL