Les articles Amstrad >Les produits Amstrad > Les CPC > Programmation > Assembleur > 4 : Les modes d'adressages [fr-en] (Amstradeus)

4 : Les modes d'adressages [fr-en] (Amstradeus)

[fr]

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'existent pas.

[/fr] 

[en] 

An addressing mode is a way for the processor to access a data. This data can be a number needed in the program, a number already in the registry or a number written somewhere in the memory.

Knowing the main addressing modes is mandatory: it allows to write program in a much shorter, simplier and readable way ever.

4-1 The inherent addressing

This addressing is usually reserved to the instructions which interact directly on the values contained by the registries. These instructions do not need any indication.

Example: CPL

Every processor has this kind of instruction: it means that the A registry will be added. That means that every of its bytes will take the other binary value. The 1s will be replaced by 0 and the other way out too.

A contained 143 decimal (for example): that is 10001111 binary.

CPL

A contains 112 decimal, that is 01110000 binary


4-2 The immediate addressing

In this mode, the value appears after the assembler instruction.

Take for example LD A,100

The LD formula means that we will place (charge) a number in the A register. It's easy to see that this instruction couldn't have been written by itself. Therefore, we must add indications: and if we want to put a number in the stack, we have to say which one.

In the immediate addressing mode, it's the value after the point (here 100) which will be written in the register chose by writing its name before the point. In our example, its the A register which is important but any 8 or 16 bits register would have been ok.

A contained, for example, 50

LD A,100

A contains now 100. But...

LD A,300

This line should normally write 300 in A. But this has no sens since A is a 8 bits register and can only contain values up to 255.


4-3 The extended addressing mode

Also called absolute addressing mode because it allows to have direct access to the value of any memory byte.

LD A,(10)

The A stack will not be loaded with the value 10, like it would have been in the immediate addressing mode, but by the value written in the byte #10. The equivalent BASIC instruction is:

PRINT PEEK(10) => answer: 185

At the end, the A register will contain 185. The parenthesis for the figure 10 are here to avoid the confusion between the immediate and extended modes. When a value is " in parethesis ", it is the same as the address of a memory byte.

Another example:

LD A,(5000)

5000 seems much too important for our 8 bits stacker. But this line is not a non-sense: it means that the A register will not contain the figure 5000 but the figure written in the byte having 5000 for address.

PRINT PEEK(5000) => answer: 0

Therefore A will be loaded, once the instruction executed, by 0.


4-4 The register addressing

This addressing mode does not make appear any figure in the instruction and can only be used when we want to modify the registers. Example:

INC B

This instruction gives the processor the order to increment the B register. This meaning to raise its value by one. B contained 200 (for example/

INC B

B contained 201. Another example

LD C,D

There's no difficulty in the understanding of this instruction. If 20 and 30 are, for example, written in the C and D registers, the execution of this instruction will write the value 30 in C (and D will remain unchanged).


4-5 The indirect addressing

It is noted as the extended addressing, but the expression between the parenthesis is, this time, the name of the register. Here are some examples:

LD C,(HL)

The register C will be loaded with the value which will be in the byte having for address the number written in HL. Let's suppose that, in this 16 bits register, there is the figure 48000.

PRINT PEEK(48000) => answer: 146

After LD C,(HL), the value 146 will be in the C register. This instruction is therefore as equivalent as LD C,(48000) in extended addressing mode. Second example:

LD HL,45000
LD B,(HL)

One must consider that the first LD instruction puts directly in the HL register the value 45000. The second instruction will copy in the B register the value of the byte 45000.

PRINT PEEK(45000) => answer 222

B will contain the value 222.


4-6 The indexed addressing

Example:

LD C,(IX+10)

This time, the processor will seek to write it in C, the value in the byte having for address the number contained in IX to which we sum 10. It's easier to understand than to explain! Let's admit that IX contains the value 46000. We add 10 to 46000 and the byte concerned is then the #46010.

PRINT PEEK(46010) => answer: 63

In this example, C will be loaded with 63. One last example:

LD H,(IY-20)

Considering that IT contains the number 47000, this instruction indicates to the machine that it has to load H wil the figure written in the byte 46980. Knowing that the PEEK of this byte is 132, therefore H value will be 132. See that IX and IY registers can access a memory value which address is given by their values to which is added or substracted a value between +128 and -128 (a signed byte). The instructions:

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

Don't exist.

[/en]

  Voir cet article au format PDF Imprimer cet article

* Donathon 2018 *

310 €

 

 

 

 En savoir plus

RECHERCHE
Chat
 Smiles  Loading...
Connexion
Nom d'utilisateur :

Mot de passe :

Se souvenir de moi



Mot de passe oublié?

Inscrivez-vous!
EN LIGNE
16 utilisateur(s) en ligne (2utilisateur(s) en ligne sur Les articles Amstrad)

Membres: 5
Invités : 11

Golem13, Moonbeam, eboulat, BDCIRON, rity, plus...
Musiques CPC

Lecteur MP3
CPC-Scene Radio

 

 

ROLAND RADIO

 

Informations
________________________________

Suivre Amstrad.eu

________________________________

Autres Créations web

________________________________

 

Declaration CNIL : 1005884

Association : 0540200002843

Charte

Avertissements

Plan du site

Carte de France des membres

 

 

 

Facebook.

Twitter.

RSS forum.

RSS News.

Contact.

 

Gaston-Phoebus.com

Amstrad.eu

untour.fr

Cathydeco.com

Higoogle

Harloup.fr

** Faire un don **

 

Conception Phenix © 2000 - 2014