samedi 16 novembre 2019

Chapitre 72 : Assembleur ARM 64 : tests instructions, nombres aléatoires, saisie chaine et nombre


Dans ce petit programme, testRegSup.s, je vérifie les instructions add avec le mot clé supplémentaire UXTW ou SXTW qui permettent d’additionner des registres de tailles différentes avec en plus la possibilité d’effectuer une multiplication du registre avant son addition.
Je teste aussi le même mot clé pour les accès mémoire. Et enfin je réecit en 64 bits la routine de génération de nombre aléatoires. Je ne me souviens plus d’où j’ai tiré la première série de nombres servant au calcul !! mais j’ai mis en commentaire une deuxième série tiré d’un livre sur les algorithme en langage C de Robert Sedgewick.

Dans le programme suivant saisie.s: https://github.com/vincentARM/ARMassembly64/blob/master/projet64_003/saisie.s, je teste la saisie d’une chaine de caractère en utilisant le call système Linux Read. Comme il faut un buffer de réception de la chaine saisie et à la place d’une zone réservée dans la .bss, je reprends la procédure d’allocation sur le tas avec le call system Linux BRK. Cette procédure effectue 2 appels, le premier pour récupérer l’adresse du tas et qui sera donc l’adresse de début de notre zone réceptrice et l’autre qui alloue la place demandée. Vous remarquerez que la procédure alloue une place de telle façon que la fin soit sur une frontière de 8 octets suivante. En effet lorsque je mettrais cette sous-routine dans le fichier routinesarm64, il faudra qu’elle fonctionne pour tous les appels futurs et en particulier pour des utilisations du tas pour des tables de double mots alignées sur une frontière de 8 octets.
Le test de la saisie chaine étant ok, je teste la conversion d’une chaine en un nombre positif ou négatif.
Petite curiosité : quand j’ai écrit cette routine en 32 bits au début de ma découverte de l’assembleur arm, j’effectuais la conversion de la saisie en nombre négatif en multipliant le résultat par – 1 . ensuite j’ai découvert que l’on pouvait utiliser les 2 instructions mvn r1,r1  et add r1,#1 et maintenant en 64 bits la seule instruction :    cneg x0,x0,eq
Vous remarquerez qu’au fur et à mesure de ma découverte de l’assembleur 64 bits, j’adapte les routines pour utiliser les nouvelles instructions : par exemple pour tester un registre à zéro : l’instruction cbz ou son contraire l’instruction cbnz. Pour gérer éventuelle erreur de calcul, je positionne le carry avec les instructions cmp x0,0 et cmn x0,0. Vous pouvez vérifier que quel que soit la valeur de x0, le carry est ou non positionné dans tous les cas : astucieux non !!

Aucun commentaire:

Enregistrer un commentaire