LES MODES D'ADRESSAGE PREM/TERM LE MICROCONTROLEUR Le mode d'adressage est un élément important ; c'est une étape qu'il faut bien comprendre car toute la programmation en découle. Je vais vous expliquer les différentes manières de manipuler les données dans la mémoire. Il existe 6 modes d'adressage distincts, chacun a sa propre syntaxe : attention, c'est une source fréquente d'erreurs. 1. Adressage immédiat La donnée est dans l'instruction. En assembleur, on indique que l'on utilise une donnée immédiate (et non pas une adresse) par le symbole # (dièze). Dans l'exemple suivant, on charge la valeur décimale 100 dans l'accumulateur A. Exemples : LDAA #100 Avant Après A 03 64 Note : on exprime le contenu des registres en hexadécimal pour une conversion plus facile en binaire et c'est plus court à écrire. On a donc ici écrit directement la valeur 100=(64)hex dans A ; la valeur (03)hex est quelconque. Deux autres exemples, où l'on charge la valeur hexadécimale puis binaire d'un nombre : LDX #$E000 X Avant Après FFFF E000 LDAB #%01001001 B Avant Après B7 49 Vous aurez noté le symbole % qui désigne une valeur binaire. L'écriture binaire, bien qu'un peu lourde, peu se révéler plus pratique pour réaliser un masque. Cependant, nous utiliserons surtout l'écriture hexadécimale. 2. Adressage direct Dans ce mode, l'instruction contient l'adresse 8 bits de l'opérande. Cette fois ci, on ne prend pas la valeur telle quelle car il n'y a plus de # ; le nombre écrit n'est pas la valeur à charger mais le contenu de la position mémoire d'adresse $25. Hop, un exemple : LDAA $25 A Avant Après 3D 2A A la position mémoire $25, il y a la valeur suivante : 2A L'espace d'adressage est bien sûr limité à 1024 octets, de ($0000 à $03FF) c'est à dire la RAM. Dès lors, dès que vous aurez une variable à aller chercher en RAM, vous utiliserez cette instruction. Compris ? Allez, un dernier exemple plus dur J : Microcontroleur - adressage Lycée SARDA GARRIGA 1/3 S SI Section GENIE ELECTRIQUE LDY $1A Y Avant Après 264B 351F A la position mémoire $1A, il y a la valeur suivante : 35 A la position mémoire $1B, il y a la valeur suivante : 1F Petite explication : Y étant un registre de 16 bits, il faut qu'il y ait la même nombre de bits ; les bits de poids faibles du registre Y seront complétés en prenant la valeur à l'octet suivant dans la mémoire (l'octet 1B). 3. Adressage étendu Ah, Ah J ! bien ici c'est pareil que l'adressage direct sauf que l'adresse est cette fois ci codée sur 16 bits. Cela étend l'espace d'adressage à 64Ko. Souvenez vous ces chapitres précédents : le bus d'adresse d'un 68HC11 est de 16 bits, donc celui-ci peut gérer une mémoire externe (RAM, EEPROM etc...) de 64Ko maximum, soit 65536 octets. Un petit exemple pour la route, un peu compliqué, il utilise le registre D, c'est à dire A + B : LDD $425A D Avant Après 0000 351F A la position mémoire $425A, il y a la valeur suivante : 35 A la position mémoire $425B, il y a la valeur suivante : 1F Toujours pareil, le registre D faisant 16 bits on prend la donnée à l'adresse puis à l'adresse+1. Nous avons donc A qui contient $35 et B qui contient $1F. 4. Adressage indexé Dans ce mode, l'adresse de l'opérande est obtenue par addition du contenu d'un registre d'index (X ou Y) désignée dans l'instruction, et d'une valeur non signée 8 bits contenue dans l'instruction. Un exemple pour clarifier tout ça : LDAA X+0 A Avant Après 5B 42 Dans le registre X il y a la valeur suivante : 425A A la position mémoire $425A, il y a la valeur suivante : 19 Là on cherche à l'adresse X+0, soit X. En assembleur, on marquera X simplement ; marquer X+0 fonctionne aussi mais ça sert à rien. Un dernier exemple : STAB Y+2 Dans le registre B il y a la valeur suivante : ED Microcontroleur - adressage Lycée SARDA GARRIGA 2/3 S SI Section GENIE ELECTRIQUE Dans le registre Y il y a la valeur suivante : 4355 Contenu des positions mémoires avant : Adresse Donnée 4355 23 4356 58 4357 00 Contenu des positions mémoires après : Adresse Donnée 4355 23 4356 58 4357 ED Bon, ça me parait assez clair comme cela ; on va écrire la donnée à la position mémoire pointée par Y plus 2. Cela donne 4355 (donnée dans le registre Y) + 2 (index) = 4357. La donnée à écrire est ED, situé dans l'accumulateur B. 5. Adressage inhérent Dans ce mode, l'opérande est toujours un registre et son nom est codé directement dans le code opératoire de l'instruction. C'est assez simple à comprendre, et je pense que l'exemple suivant suffira. ABA A Avant Après 1B 22 Dans l'accumulateur B, il y a la valeur suivante : 07 6. Adressage relatif Ce mode n'est utilisé qu'avec les instructions de rupture de séquence. Le déplacement relatif (valeur signée) codée dans l'instruction est ajoutée au contenu du compteur programme PC pour définir l'adresse de branchement, si la condition testée est vrai. Le déplacement relatif est codé sur 8 bits, l'amplitude du saut par rapport à PC est de 126 adresses en arrière et de 129 adresses en avant. On peut comparer ça à un GOTO (langage Basic). Pas d'exemple car il s'agit, si vous regardez la liste des mots clés dans le chapitre suivant, de toutes les instructions de branchement (branch). Microcontroleur - adressage Lycée SARDA GARRIGA 3/3 S SI Section GENIE ELECTRIQUE