Dans les précédents programmes, nous avons déjà rencontrés
les instructions d’accès à la mémoire (par exemple avec les sauvegardes de
registres sur la pile, l’adresse de la pile n’étant qu’une adresse d’une zone
mémoire).
Dans le programme instLdrStr, nous commençons avec les
instructions de stockage d’un octet, demi mot mot et double mot. On remarque que
c’est la même instruction str qui sert pour un mot et un double mot mais c’est
le registre d’origine (x ou w) qui fait la différence. Puis nous lisons les mêmes
informations avec l’instruction ldr. J’ai teste aussi l’instruction ldur mais je
n’ai pas vu de différence avec ldr. C’est à approfondir.
Pour les accès avec déplacement, j’ai eu une erreur de compilation
avec l’instruction str x0,[x1,x2,lsl 2] que j’ai eu du mal à résoudre. En fait
la valeur pour un double mot ne peut être que supérieure à 2 (mais pour un mot,
elle peut être égale à 2). Je teste aussi la possibilité d’avoir un déplacement
avec un indice contenu dans un registre 32 bits grâce au mot clé supplémentaire
UXTW (voir la documentation pour d’autres possibilités).
Ensuite nous restons les lectures d’octet négatif avec
recopie du bit de signe. Il reste encore des instructions particulières à
tester.
Nous terminons le programme par un exemple simple de
manipulation d’une table avec des enregistrements comportant plusieurs champs. Nous
décrivons les champs d’un enregistrement à l’aide d’une structure (.struct),
nous déclarons dans la section .bss la place nécessaire pour gérer 10
enregistrements.
Dans le code nous écrivons une routine pour insérer un
nouvel enregistrement dans la table et une routine pour afficher un
enregistrement. L’adresse de chaque enregistrement est calculée grâce à l’instruction
madd qui permet d’ajouter à l’adresse de la table, la longueur d’un
enregistrement * numéro de l’enregistrement.
Ici, pour chaque insertion, nous balayons toute la table
pour trouver un emplacement vide, mais nous aurions pu stocker l’enregistrement
directement dans le dernier poste vide puisque nous avons le registre x28 qui
contient le nombre d’enregistrements déjà stockés.
Vous remarquerez que j’utilise les instructions ldrsb x0,
ldrsh x0 et ldrsw x0 à la place de ldrb w0,ldrh w0 et ldrw w0. Ces instructions
complètent le registre 64 bits en dupliquant le signe.
Aucun commentaire:
Enregistrer un commentaire