jeudi 14 novembre 2019

Chapitre 71 : Assembleur ARM 64 : accès mémoire


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