• Aucun résultat trouvé

Figure 2.15. Réalisation du plan mémoire

Dans le document Microprocesseurs et Microcontrôleurs (Page 44-47)

Figure 2.15. Réalisation du plan mémoire.

Le décodeur positionne à 1 (5v) la sortie n° "A1A0". Exemple: A1A0=11b (binaire) = 3d (décimal) =>Y3Y2Y1Y0=(1000)b. Dans le cas de la figure ci dessus les entrées A1 et A0 du décodeur sont les lignes d’adresse A19 et A18 du microprocesseur, ce qui permet de sélectionner 128 Ko par sortie Yi du décodeur (CS1, CS2, CS3 et CS4). La mémoire totale sélectionnée est alors de 512 Ko par banc mémoire. Soit au total 1Mo de cases mémoires sélectionnées.

2 Jlassi Khaled

I. Introduction.

Dans cette partie du cours, nous allons étudier la programmation en langage assembleur d'un microprocesseur de la famille INTEL. L'étude complète d'un processeur réel, comme le 80486 ou le Pentium fabriqués par Intel, dépasse largement le cadre de ce cours : le nombre d'instructions et de registres est très élevé. Nous allons ici nous limiter à un sous-ensemble du microprocesseur 80486 (seuls les registres et les instructions les plus simples seront étudiés). De cette façon, nous pourrons tester sur un PC les programmes en langage machine que nous écrivons. La gamme de microprocesseurs 80x86 équipe les micro-ordinateurs de type PC et compatibles. Les premiers modèles de PC, commercialisés au début des années 1980, utilisaient le 8086, un microprocesseur 16 bits. Les modèles suivants ont utilisé successivement le 80286, 80386, 80486 et Pentium (ou 80586). Chacun de ces processeurs est plus puissant que les précédents : augmentation de la fréquence d'horloge, de la largeur de bus (32 bits d'adresse et de données), introduction de nouvelles instructions (par exemple calcul sur les réels) et ajout de registres. Chacun d'entre eux est compatible avec les modèles précédents; un programme écrit dans le langage machine du 80286 peut s'exécuter sans modification sur un 486. L'inverse n'est pas vrai, puisque chaque génération a ajouté des instructions nouvelles. On parle donc de compatibilité ascendante. Du fait de cette compatibilité, il est possible de programmer le Pentium comme un processeur 16 bits. C'est ce que nous ferons dans nos exemples par souci de simplification. Ainsi, nous n'utiliserons que des registres de 16 bits.

II. Architecture interne du microprocesseur 8086.

Quoique, nous ayons déjà parlé de l’architecture de base d’un microprocesseur, nous pensons

qu’il est utile d’en reparler. Nous allons nous intéresser ici à l’architecture interne du

microprocesseur 8086, sujet de cette étude, avant d’entamer l’étude des instructions de ce

même microprocesseur. Du fait de la compatibilité, ascendante des microprocesseurs de

INTEL, il est possible de programmer le Pentium avec les instructions du 8086 que nous allons

étudier dans cette partie. 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. Les registres de travail sont au nombre de 4 et sont notés

AX, BX, CX, DX. Chacun d'eux peut être utilisé comme un registre 16 bits ou décomposé en 2

registres 8 bits au gré du programmeur. Le registre AX peut être décomposé en AH (H pour

3 Jlassi Khaled

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: le registre AX est utilisé

implicitement comme accumulateur (dans les instructions de multiplication), BX comme

registre de base (pour des données dans le segment pointé par le registre de segment ES), CX

comme compteur d'itérations (dans les instructions de boucle) et DX contient l'adresse du port

d'E/S dans les instructions d'E/S IN et OUT.

Les registres de segment sont aussi au nombre de 4 et sont notés CS, DS, SS et ES. Pendant l'exécution d'un programme, ils contiennent les numéros des segments accessibles. Le registre CS contient le numéro du segment de code (Code Segment), DS le numéro du segment de données (Data Segment), SS le numéro du segment de pile (Stack Segment) et ES le numéro du segment de données supplémentaire (Extra Segment). L'utilisation de ces registres est implicite sauf indication explicite du programmeur. Les registres pointeurs 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. Les registres d'index sont au nombre de 2 et sont notés SI et DI. Chacun de ces 2 registres peut être utilisé pour indexer les éléments d'un tableau. Dans les instructions de mouvement de chaînes d'octets, ils sont utilisés simultanément: SI pour indexer les caractères de la chaîne émettrice, d'où son nom Source Index et DI pour les caractères de la chaîne réceptrice, d'où son nom Destination Index. Les registres spéciaux sont au nombre de 2 et notés IP (Instruction Pointer) et SR (Status Register). IP joue le rôle de compteur ordinal et contient le déplacement dans le segment de code de la prochaine instruction à exécuter. Le couple CS:IP donne donc l'adresse physique sur 20 bits. Le registre SR contient l'état du microprocesseur matérialisé par les indicateurs (Flags): O pour Overflow, D pour Direction, I pour Interrupt, T pour Trace, S pour Sign, Z pour Zero, A pour Auxiliary carry, P pour Parity et C pour Carry.

4 Jlassi Khaled

Figure 3.1 Registre d’état SR

III. Organisation de l'espace adressable.

L'espace adressé par le 8086 est un espace de 1 Moctets organisé en segments ayant des tailles pouvant aller jusqu'à 64K octets. Ces segments peuvent se chevaucher et leurs adresses début sont multiples de 16: ainsi les segments de numéros 0, 1, 2, 3, 4, 5 ... auront les adresses physiques 0, 16, 32, 48, 64, 80...Les adresses sont des adresses segmentées: formées par le couple (numéro de segment, déplacement). Le numéro de segment et le déplacement sont codés chacun sur 16 bits. Cette structuration répond au découpage logique des programmes. Elle offre en outre l'avantage de ne spécifier que le déplacement dans les instructions à référence mémoire, le numéro de segment étant implicite (il demeure le même tant qu'on n'accède qu'à des données ou instructions situées dans un même segment). Ainsi la plupart de ces instructions contiennent une adresse de 16 bits au lieu de 20 bits. L'adresse physique envoyée par le 8086 sur le bus est une adresse 20 bits. Elle est calculée à partir du numéro de segment (conservé dans un registre) et du déplacement fourni par l'instruction: elle est obtenue en additionnant le numéro de segment décalé de 4 positions vers la gauche (ce qui donne l'adresse physique du début du segment sur 20 bits) au déplacement sur 16 bits.

num éro d e seg m ent (16 bits)

déplacem ent (16 bits) 0 0 0 0

adresse physique 20 bits +

=

Dans le document Microprocesseurs et Microcontrôleurs (Page 44-47)