mardi 31 mars 2020

Chapitre 85 : assembleur ARM 32 et 64 bits : affichage des variables d'environnement


Dans ce chapitre nous verrons dans 2 petits programmes comment récupérer les variables d’environnement qui peuvent être utiles dans un programme (par exemple la variable USER ou le répertoire courant comme PWD).
En fait la récupération est très simple puisque l’adresse de ces variables sont stockées sur la pile par LINUX avant l’appel à notre programme.

Dans le programme 32 bits varEnv.s  nous commençons par stocker dans le registre fp (frame register) la pile puis nous stockons plusieurs adresses de la pile dans les registres pour examiner leur contenu après l’affichage par la macro vidregtit.
Comme déjà vu, l’adresse 0 contient le nombre de paramètres passés à notre programme dans la ligne de commande. Ici nous avons un seul paramètre (le nom du programme) dont l’adresse est passée à +4. En +8, nous trouvons l’adresse de retour qui est ici à zéro puisque nous revenons au système d’exploitation.
En +12, nous trouvons l’adresse de la première variable d’environnement. Et il nous suffit donc de remonter toutes les adresses jusqu’à en trouver une à zéro pour afficher une à une les variables.
Dans la deuxième partie du programme, je place les différentes adresses des sections dans des registres pour regarder leur emplacement.
Et enfin, nous effectuons une recherche d’une variable pour afficher son contenu. Sur mon raspberry, la variable USER contient pi. Pour démarrer la recherche à la bonne adresse quelque soit le nombre de paramètres passés dans la ligne de commande, l’indice de recherche est initialisé avec le nombre de paramètre + 2.

Le programme varEnv64.s effectue la même chose en 64 bits, sauf que les adresses sont sur 8 octets et non plus sur 4 octets.
Peut être vous posez vous la question du pourquoi du save du registre x1 et lr en début de la routine de recherche alors que ces 2 registres ne sont pas modifiés dans la routine. Et bien c’est pour les avoir toujours en exemple et pour éviter une anomalie si je suis obligé d’ajouter une routine d’affichage en cas de problème. Vous remarquerez que dans cette routine j’utilise les registres r12 etc donc il n’est pas nécessaire de les sauver (cf norme d’appel des routines).

Aucun commentaire:

Enregistrer un commentaire