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