Partie 4 : les modes d'adressage


Un mode d'adressage est un moyen qui permet au microprocesseur d'avoir accès à une donnée. Cette donnée peut être un nombre quelconque dont on aura besoin dans le programme, un nombre qui se trouve déjà dans un registre, ou encore un nombre qui se trouve écrit quelque part en mémoire.

La connaissance des principaux modes d'adressage est obligatoire : elle permet d'écrire les programmes de la façon la plus courte, la plus simple et la plus lisible possible.

4-1 L'adressage inhérent

L'adressage inhérent est habituellement réservé aux instructions qui agissent directement sur les valeurs contenues par les registres. Ces instructions se composent d'elles-mêmes et n'ont aucunement besoin qu'on leur ajoute des indications.

Exemple : CPL

Tous les microprocesseurs possèdent ce genre d'instruction :elle signifie que le registre A (lui et pas un autre) se verra complémenté. En clair, cela veut dire que chacun de ses bits prendra l'autre valeur binaire ; les chiffres 1 seront remplacés par des 0 et réciproquement.

A contenait 143 décimal (par exemple) ; soit 10001111 binaire.

CPL

A contient 112 décimal, c'est à dire 01110000 binaire


4-2 L'adressage immédiat

Dans ce mode, une valeur apparaît après l'instruction assembleur.

Prenons par exemple LD A,100

La formule LD signifie que l'on va placer (charger) un nombre dans le registre A. Il est facile de voir qu'ici l'instruction LD n'aurait pu être écrite toute seule, comme dans l'adressage inhérent. Il nous faut absolument rajouter des indications à la suite : et, si l'on doit mettre un nombre dans l'accumulateur A, il faut bien dire lequel.

Dans le mode d'adressage immédiat, c'est la valeur marquée après la virgule (ici 100) qui sera écrite dans le registre que l'on aura choisi en écrivant son nom devant la virgule. Dans notre exemple, c'est le registre A qui est concerné mais n'importe quel autre registre de 8 bits ou 16 bits aurait fait l'affaire.

A contenait, par exemple, 50

LD A,100

A contient maintenant 100. Mais…

LD A,300

Cette ligne devrait, en principe, écrire dans A le nombre 300. Vous l'aurez deviné ; cela n'a aucun sens puisque A est un registre 8 bits et que le nombre maximal qu'il peut contenir est 255.


4-3 L'adressage étendu

On l'appelle souvent adressage absolu car c'est un mode qui permet d'avoir accès directement au contenu de n'importe quel octet de la mémoire.

LD A,(10)

L'accumulateur A sera chargé non par le nombre 10, comme il l'aurait été dans l'adressage immédiat, mais avec la valeur écrite dans l'octet n°10. L'instruction BASIC équivalente est la suivante :

PRINT PEEK(10) => réponse : 185

En fin de compte, le registre A contiendra 185. Les parenthèses qui englobent la valeur 10 sont là pour éviter la confusion entre les modes immédiat et étendu. Lorsqu'une valeur est " parenthésée ", elle correspond à l'adresse d'un octet de la mémoire et c'est cet octet qu'il faut prendre ne compte. Un deuxième exemple :

LD A,(5000)

Un piège, comme dans le paragraphe précédent ? 5000 paraît bien trop important pour notre accumulateur 8 bits. Mais non, cette ligne n'est pas un contre-sens : elle signifie que le registre A va contenir non pas le nombre 5000 mais le nombre qui se trouve écrit dans l'octet ayant 5000 pour adresse.

PRINT PEEK(5000) => réponse : 0

Ce qui fait que A sera chargé, une fois l'instruction exécutée, par la valeur 0.


4-4 L'adressage registre

Ce mode d'adressage ne fait apparaître aucun nombre dans l'instruction et n'est utilisable que lorsque l'on veut intervenir sur les contenus des registres. Exemple :

INC B

Cette instruction donne au microprocesseur l'odre d'incrémenter le registre B, c'est à dire d'augmenter sa valeur d'une unité. B contenait 200 (par exemple).

INC B

B contient 201. Autre exemple :

LD C,D

Nous retrouvons le mnémonique de chargement LD. Il n'y a aucune difficulté à interpréter cette instruction. Si 20 et 30 sont, par exemple, écrits dans les registres C et D, l'exécution de l'instruction inscrira la valeur 30 dans C (et D restera inchangé).


4-5 L'adressage indirect

Il est noté comme l'adressage étendu, mais l'expression qui se trouve entre parenthèses est, cette fois, le nom d'un registre. Voici quelques exemples :

LD C,(HL)

Le simple registre C va être chargé avec la valeur qui se trouve dans l'octet ayant pour adresse le nombre écrit dans HL. Supposons que, dans ce registre 16 bits, il y ait le nombre 48000.

PRINT PEEK(48000) => réponse : 146

Après LD C, (HL), il y aura dans le registre C la valeur 146. Cette instruction est donc tout à fait équivalente à LD C,(48000) en adressage étendu. Deuxième exemple :

LD HL,45000
LD B,(HL)

Il faut considérer que la première instruction LD place directement dans le registre HL le nombre 45000 (mode d'adressage immédiat. La seconde instruction va recopier dans le registre B le contenu de l'octet 45000.

PRINT PEEK(45000) => réponse 222

B contiendra donc la valeur 222.


4-6 L'adressage indexé

Prenons l'exemple suivant:

LD C,(IX+10)

Cette fois, le processeur va aller chercher, pour l'écrire dans C, la valeur qui se trouve dans l'octet ayant pour adresse le nombre contenu dans IX auquel on ajoute 10. C'est plus facile à comprendre qu'à expliquer ! admettons que IX contienne la valeur 46000. On ajoute 10 à 46000 et l'octet concerné est alors le n°46010.

PRINT PEEK(46010) => réponse : 63

Ainsi dans cet exemple, C va être chargé avec le nombre 63. Un dernier exemple :

LD H,(IY-20)

En considérant que IY contient le nombre 47000 (par exemple), cette instruction indique à la machine qu'elle doit placer dans H le nombre écrit dans l'octet 46980. Si l'on sait que le PEEK de cet octet vaut 132 , on en déduit que le registre H aura vu son contenu porté à 132. remarquons que seuls les registres IX et IY ont le privilège de pouvoir accéder à une case mémoire dont l'adresse est donnée par leurs contenus auxquels est ajoutée ou retranchée une valeur comprise entre +127 et -128 (un octet signé). Les instructions du type :

LD A,(BC+5)
Ou
LD A,(DE-3)

N'éxistent pas.