17. appel de fonction Flashcards
En ARM, une fonction est
un ensemble d’instructions à une
adresse donnée.
*
On identifie la fonction par
une étiquette
On appelle la fonction avec
un branchement à cette étiquette
Pour pouvoir revenir à plus d’un endroit, il faut sauvegarder
l’adresse de retour (avant de faire le branchement)
Instruction de sauvegarde
BL (Branch and Link)
Tout d’abord, place l’adresse de retour dans LR
* Ensuite, branche à l’étiquette
À la fin de la fonction, on veut retourner à l’adresse de
retour
* Cette adresse a été stockée dans—– par —–
LR par le BL
Il suffit donc d’y brancher avec l’instruction BX, qui
place le contenu de LR dans PC
BX LR ; PC = LR
Structure de données des piles
LIFO = Last In, First Out
Deux opérations principales des piles
PUSH: rajoute un élément sur
« le dessus » la pile
* POP: enlève un élément du
« dessus » de la pile
numéro de registre du pointeur de pile
r13, sp
sp indique
la donnée retournée si on POP
est-ce que on peut modifier r13 directement
non. utiliser push et pop
comment fonctionne push
PUSH {Rs} ; (pile)
1) SP = SP - 4
; 2) place le contenu de Rs à l’adresse
indiquée par SP
comment fonctionne pop
POP {Rd} ; (dépile)
1) Place le contenu à l’adresse indiquée
par SP
; 2) SP = SP + 4
Lors d’un PUSH, les registres sont empilés du
plus —- au plus —- numéro de registre
Lors d’un PUSH, les registres sont empilés du
plus grand au plus petit numéro de registre
Lors d’un POP, les registres sont dépilés du
plus —- au plus — numéro de registre
Lors d’un POP, les registres sont dépilés du
plus petit au plus grand numéro de registre
est-ce que l’ordre des registres dans l’instruction est importante
non
Pour préparer la pile x3
on alloue un espace mémoire (ALLOC)
* on charge l’adresse de la pile dans SP
* on incrémente SP pour aller « à la fin » de la pile (car la pile
est descendante)
Les paramètres sont les « —– » de la fonction
Les paramètres sont les « entrées » de la fonction
Exemple, pour une fonction qui calcule la puissance
on doit lui donner la base et
l’exposant
registres des paramètres
si 4 paramètres ou moins, r0 à r3
S’il y en a plus (pas dans le cadre du cours), on peut
utiliser la pile
La valeur de retour est la « —–» de la fonction
La valeur de retour est la « sortie » de la fonction
registre de la valeur de retour
On se sert de R0 lorsqu’il y en a 1.
* S’il y en a plus (pas dans le cadre du cours), on peut
utiliser la pile.
comment se servir de 1 paramètre et 1 valeur de retour
On place la valeur du paramètre dans R0 juste avant l’appel
* L’instruction BL commande un branchement
* R0 contient la valeur de retour une fois la fonction exécutée
problème des appel de fonction
Le nombre de registres étant limité, on ne veut pas qu’une fonction
remplace le contenu des registres
La fonction ne connait pas le nom des registres qui sont utilisés par le code
qui fait l’appel de la fonction
- Le code qui fait appel à la fonction ne connait pas le nom des registres qui
sont utilisés par la fonction
quelle est la solution?
La fonction « protège » le contenu des registres qu’elle utilise
comment on fait cette solution?
On protège le contenu d’un registre en le sauvegardant sur la pile avec PUSH
- On récupère ce contenu avec POP