• Aucun résultat trouvé

Les modes d'adressage

Dans le document CHAPITRE 4 Unité centrale (Page 36-45)

INSTRUCTIONS SIGNIFICATION

1.9. Les modes d'adressage

Dans le répertoire d'instructions de l'ordinateur, on peut diviser les instructions en plusieurs sous-groupes dépendant à quelle unité l'instruction s'adresse, cette classification peut être faite aussi selon la fonction de l'instruction. Par exemple, les instructions de l'unité arithmétique forment un sous-groupe, celles des unités d'entrées/sorties en forment un autre, etc. Une autre classification possible peut se réaliser aussi selon le nombre d'opérandes impliqués dans l'instruction. On distingue généralement des instructions à zéro, un, deux et trois opérandes chez la plupart des microprocesseurs. Le VAX en a qui ont jusqu'à six opérandes.

Dépendant de leurs fonctions, les adresses des instructions peuvent apparaître sous plusieurs modes d'adressage. Par exemple, l'adressage sera direct dans la plupart des instructions de l'ALU mais relatif ou indexé dans les instructions de lecture/écriture en mémoire centrale.

Voyons plus en détails la signification de ces divers modes d'adressage. Évidemment, des indicateurs de mode et de format sont nécessaires lorsque plusieurs modes sont présents dans la même machine ayant des formats multiple d'instructions.

1.9.1 L'adressage immédiat

La façon la plus simple de spécifier un opérande dans une instruction, c'est d'écrire directement sa valeur dans la zone d'adresse de l'instruction. On appelle ce type d'opérande opérande immédiat.

Celui-ci est chargé automatiquement dans la mémoire registre de l'unité de traitement lors du cycle de décodage de l'instruction, après bien sûr l'identification de ce mode d'adressage.

Le terme opérande immédiat est par conséquent plus adéquat que celui d'adressage immédiat car il n'y a pas de référence à la mémoire centrale de l'ordinateur, l'instruction étant elle-même porteuse de la valeur de l'opérande.

Cette technique d'adressage est particulièrement utile dans les instructions de décalage où la valeur inscrite est présente pour indiquer la valeur du décalage à effectuer. Ce mode intervient principalement dans les instructions de transfert d'information dans les registres du microprocesseur de l'unité de traitement. En fait, cette technique est utilisée là où l'usage d'une constante numérique entière de valeur fixe est requise. Cette valeur est cependant limitée au nombre de bits de la partie adresse, réduisant sensiblement le pouvoir de ce mode d'adressage.

Ce mode d'adressage en plus d'économiser de la place en mémoire principale, diminue le temps d'exécution car il n'y a pas de requête à la mémoire principale.

Exemple :

Supposons un ordinateur muni de quatre registres internes à son unité de commande identifiés R0 à R1 et numérotés en binaire 00 à 11 respectivement. Supposons de plus qu'un des formats d'instruction est à un opérande de la forme

où MODE indique le mode d'adressage utilisé dans l'instruction codé sur 3 bits. Supposons que la signature du mode d'adressage immédiat est le code 000. Si le répertoire d'instruction comprend l'opération d'initialisation suivante des registres internes: INIxx où xx indique le numéro du registre impliqué, l'opération étant codée sur cinq bits sous la forme binaire 111xx, alors l'instruction machine

1110100001010010 sera interprétée par l'unité de commande de la façon suivante:

Question: Quelle serait l'instruction machine permettant d'initialiser le registre R3 de la valeur décimale 1 en utilisant l'adressage immédiat?

1.9.2 L'adressage direct

C'est le mode d'adressage le plus simple et le plus utilisé. Ce mode permet de référer à un mot mémoire en faisant figurer dans la zone adresse, directement l'adresse du mot désiré sans plus de complication, mot contenant la valeur de l'opérande impliqué. Cela nécessite exactement un cycle de mémoire pour que la valeur désirée soit livrée. La majorité des instructions de nature arithmétique utilisent ce mode d'adressage.

Exemple: Supposons le même ordinateur qu'à l'exemple 1, ayant le même format d'instruction à un opérande. Supposons que le code pour l'adressage direct est la chaîne binaire 001. Alors l'instruction d'initialisation 1110100101010010 aura pour signification:

1.9.3 L'adressage registre.

C'est conceptuellement la même chose que l'adressage direct, excepté que les adresses sont celles de registres plutôt que de mots mémoire. Étant donné qu'il n'y a qu'un nombre restreint de registres internes, généralement entre quatre et 16 registres, rarement plus (tout au plus 32 à l'heure actuelle), le nombre de bits nécessaires pour spécifier le registre impliqué dans une

adresse est très petit, 5 bits tout au plus s'il y a 32 registres. Le format de l'instruction est donc beaucoup plus court.

On peut supposer que la différenciation entre les formats pour l'espace adressable mémoire et celui de l'espace registre se réalise automatiquement au niveau du code d'opération de l'instruction. Voyons l'illustration de ce mode d'adressage registre dans l'exemple suivant.

Exemple: Supposons l'opération d'addition selon un mode d'adressage de l'espace mémoire dont la mnémonique est ADD1 avec le code 0000 et celui de l'espace registre de mnémonique ADD0 avec le code 0001. Considérons les deux instructions suivantes:

ADD0, R0,R1 signifiant R0  R0 + R1 et

ADD1,A,B signifiant A  A + B.

Si 00 est l'adresse du registre R0 et 01 celui du registre R1 comme dans l'exemple 1, si A représente l'adresse 00110111 et B l'adresse 11000111, les deux instructions mentionnées s'écrivent selon ces codes:

00000001 et 00010011011111000111.

On remarque immédiatement une différence dans la longueur des instructions, le format de l'instruction est donc plus court pour le mode d'adressage registre. De plus, celle des registres ne nécessite pas de référence à la mémoire directement, donc le temps d'exécution est nettement plus court que celui en adressage direct qui nécessite deux accès à la mémoire principale. Les deux situations sont illustrées dans les schémas suivants: adressage registre

Exemple : Voici deux séquences produisant le même résultat au niveau du registre R0, séquences écrites en utilisant les différents formats d'instructions précédents, agissant sur les mêmes mémoires et registres:

Séquence 1

ADD1, A,B 00010101010110001000

INI,R0,A 1110000101010101

Séquence 2

INI,R0,A 1110000101010101

INI,R1,B 1110000110001000

ADD0,R0,R1 00000001

On vérifie facilement par la trace mémoire l'équivalence entre les deux séquences au niveau du registre R0, cependant on note que l'effet n'est pas le même au niveau des autres mémoires impliquées.

1.9.4 L'adressage indirect

Dans ce mode d'adressage, une instruction donnée se réfère toujours au même mot de la mémoire.

Pour rendre l'adresse variable, la seule solution est de modifier dans son entier l'instruction elle-même avant l'exécution. Ce procédé est lourd et parfois dangereux, surtout si le programmeur manque d'expérience. L'adressage indirect est une solution simple qui permet de rendre variable l'adresse à laquelle se réfère l'instruction.

Soit A, la partie adresse d'une instruction. Selon notre notation, M(A) et le contenu du mot d'adresse A. En mode d'adressage direct, l'adresse de l'opérande est A et la valeur de l'opérande est M(A). Pour l'adressage indirect, l'adresse effective ou physique de l'opérande est M(A).

L'adresse de l'opérande est donc le contenu du mot mémoire repéré par A. En fait, la valeur M(A) est un pointeur (une adresse).

En mode d'adressage indirect, on va donc chercher l'adresse de l'opérande en mémoire principale.

Dans le cas où le mot mémoire est plus grand que la longueur en bits d'une adresse, une convention doit être prise par le constructeur pour déterminer quelle partie du mot servira à représenter l'adresse.

L'adressage indirect, lorsqu'il est utilisé, sera marqué par un code dans la partie mode de l'instruction ou par tout autre moyen finalement équivalent, un bit réservé à cette fin dans une position précise de l'instruction pourrait servir à l'indiquer par exemple. Ce bit pourrait aussi être logé dans la partie adresse même. Un tel choix permettrait alors des adressages indirects de profondeur quelconque.

En effet, l'adresse M(A) ainsi trouvée en mémoire à partir de A pourrait-elle aussi contenir la marque d'adressage indirect conduisant au contenu M(M(A)) comme adresse physique potentielle; et ainsi de suite de pointeur en pointeur jusqu'à la découverte d'un contenu qui ne contient pas cette marque. On obtient ainsi un chaînage d'adresses indirectes de profondeur quelconque. Certaines machines, bien que rares, admettent l'adressage indirect de profondeur quelconque.

À la profondeur égale à 2, le contenu M(M(A)) est l'adresse physique de l'opérande, c'est-à-dire que ce contenu n'est pas marqué du mode d'adressage indirect. Il faut noter qu'une erreur de programmation peut entraîner un bouclage. Par exemple, si A pointe sur B, si B pointe sur C et si, à son tour C pointe sur A, on se trouve en situation de bouclage infini qui devra être décelé et interrompu par la machine ou encore par une intervention venant de l'extérieur .

L'adressage indirect de profondeur 1 est le plus courrant et demande deux références à la mémoire principale. Rappelons-nous que l'adressage direct n'en demandait qu'une seule, tandis

même. En général, l'adressage indirect de profondeur n exigera n+1 requêtes à la mémoire principale pour trouver la valeur désirée de l'opérande. Notons que l'indirection de profondeur plus grande que l'unité ne se trouve que très rarement chez les ordinateurs conventionnels.

Exemple: (un adressage indirect de profondeur 3)

1.9.5 L'adressage indexé

Dans ce mode d'adressage, la zone d'un adresse est constituée de deux parties. Une première partie, appelée partie index, renferme le numéro I d'un registre spécial de la machine appelé registre index. La deuxième partie contient une adresse d'opérande.

zone d'adresse

I A

numéro du registre index

adresse de l'opérande

À l'exécution, le contenu du registre index noté R(I) est ajouté à l'adresse A pour obtenir l'adresse effective de l'opérande soit A + R(I) en mémoire principale. Le contenu M(A+R(I)) donne la valeur de l'opérande impliqué. Notons que le registre index peut aussi être un mot mémoire. La fonction d'adressage est illustrée dans le schéma suivant:

Comme on peut le voir, il faut plusieurs opérations pour référer au mot mémoire désiré:

 accès au registre I contenant la valeur d'indexage

 addition de la partie adresse A

 accès à la mémoire à l'adresse résultante R(I) + A

Notons qu'il peut y avoir plusieurs registres internes à accès très rapide pouvant servir de registre index. Seul le numéro du registre servant à l'indexation apparaît dans l'instruction machine. Ce numéro peut aussi apparaître dans la zone indicatrice du mode d'adressage utilisé. L'indexation est l'un des modes les plus utilisés car il offre une très grande souplesse pour la gestion de la mémoire principale.

1.9.6 L'adressage relatif.

Ici encore, la zone d'adresse est divisée en deux partie appelées la base et le déplacement. Notons respectivement ces deux secteurs, B et D, D étant toujours positif. À l'exécution de la fonction d'adressage, l'adresse effective est donnée par R(B) + D, où B représente le numéro d'un registre spécial de contenu R(B), toujours selon notre notation. B est appelé registre de base.

L'intérêt de ce mode d'adressage est premièrement de pouvoir représenter une adresse d'une façon plus courte qu'une adresse en mode d'adressage direct. Donnons un exemple en supposant un

ordinateur muni de 8 registres de base de 28 bits de long. Supposons aussi que le déplacement D est étendu sur 13 bits. La longueur des registres permet alors d'adresser une mémoire de 228 mots, soit de 256 Mbits. Cela va demander 28 bits en adressage direct par adresse. Par contre, en adressage relatif, chaque adresse ne demandera que

13 bits pour le déplacement +

3 bits pour le numéro du registre de base soit 16 bits par adresse,

donc, une économie de 12 bits par adresse.

Exemple: Supposons une partie adresse de 16 bits dont 4 servent à indiquer le numéro d'un des 16 registres de base et les 12 autres à contenir la valeur du déplacement

zone d'adresse

B D

numéro du registre de base Déplacement

4 bits 12 bits

Considérons l'opérande 51FF en notation hexadécimale exprimée en adressage relatif. Les quatre bits de plus fort poids indiquent alors le registre portant le numéro 5 tandis que le déplacement a pour valeur 1FF. Supposons qu' on a comme contenu au registre numéro 5, la valeur suivante:

5 0 0 0 2 F 5

Nu m éro du registre de base

L'adresse physique sera alors donnée par l'addition de l'adresse de base 0002F5 et du déplacement 1FF, ce qui donne 0004F4.

Comme on peut s'en rendre compte, l'adresse effective réfère à une mémoire de 224 mots, soit 16 Mbits, malgré le fait que l'opérande n'a qu'une étendue de 16 bits, ce qui ne permettrait, en adressage direct, qu' un espace mémoire de 216 mots, soit de 64 K .

Cette économie de bits de position, raccourcissant d'autant les instructions, s'accompagne d'un gain marqué de souplesse dans la gestion de la mémoire. Pour illustrer cela, considérons un programme dont la taille maximale est inférieure 4K, soit 4096 octets. Cette restriction dans la taille du programme n'est là que pour simplifier la discussion. Rappelons qu'on doit loger ce programme à quelque part dans la mémoire principale. L'objectif maintenant est de former les instructions du programme en langage machine sans faire référence à des adresses réelles mais plutôt en faisant appel à des adresses relatives. Pour ce faire, on construit les instructions en

prenant pour acquis que la première instruction du programme occupera le mot d'adresse 0. Les opérandes sont alors établis par rapport à l'adresse de base 0.

Notons que le contrôle de l'allocation de la mémoire peut être fait par le programmeur au niveau du langage machine ou de façon automatique par le superviseur pour nos programmes écrits en langage évolué. La technique d'adressage relatif procure une méthode efficace pour la protection de la mémoire, particulièrement pour les zones interdites aux programmes externes comme celles occupées et réservées au système d'exploitation.

1.9.7 L'adressage par pile.

Les opérations associées à ce mode d'adressage sont sans opérande. Elles se réfèrent à un registre spécial appelé registre de pile qui contient un pointeur de pile, correspondant à l'adresse du sommet de la pile. Ce registre est matériellement associé à une adresse de début de pile ou de base. La plupart des ordinateurs possède cette structure particulière d'adressage. Les opérations nécessairement présentes en adressage de pile sont celle d'entrée de données (PUSH) et celle de sortie (POP). Voyons un exemple.

Supposons un registre de pile associé à l'adresse de base 100. Initialement, la pile est vide. Le pointeur a la valeur 100 et le contenu du mot d'adresse 100 est indéterminé. Voyons l'effet qu'aura le programme suivant sur cette pile:

0. Début

1. -3

2. PUSH

3. 20

4. PUSH

5. 30

6. ADD

7. MULT

8. POP

Les schémas suivants montrent l'état de la pile après chaque instruction de la séquence.

0. Début

0. Début 1. -3 2. PUSH 3. 20 4. PUSH 5. 30 6. ADD

7. MULT

100

-150 100

0. Début 1. -3 2. PUSH 3. 20 4. PUSH 5. 30 6. ADD 7. MULT 8. POP

100

100 -150

-150 1.9.8 L'adressage implicite

Dans ce mode d'adressage, l'opérande est fixe et connue implicitement par la machine. Il s'adresse donc aux instructions sans opérande. Aussitôt que le code opération détecté, l'ordinateur agit instantanément sur la mémoire impliquée implicitement. Les opérations d'entrée et de sortie d'une donnée dans une pile (PUSH et POP) sont des instructions de ce type. Certaines opérations de chargement de registres, de mise à zéro (RAZ) et de décalage sont de ce type et utilise l'adressage implicite.

Dans le document CHAPITRE 4 Unité centrale (Page 36-45)

Documents relatifs