Explication du pointeur de cadre

28

Dans l' assemblage MIPS , il existe un registre pour le pointeur de pile et un autre registre pour le pointeur de trame. Qu'est-ce que le pointeur de cadre et quel est son objectif? En quoi diffère-t-il du pointeur de pile?

qwaserdftyghuijkiii
la source
1
Quelles recherches avez-vous déjà effectuées - et quelle est votre connaissance des termes? À quel système est-ce destiné (différents systèmes ont une terminologie différente)?
Je veux juste me familiariser avec le pointeur de cadre (assemblage de mips). Je ne comprends pas comment cela aide, pourquoi en avons-nous besoin? Merci beaucoup
qwaserdftyghuijkiii

Réponses:

44

Dans l'assemblage MIPS, le pointeur de pile pointe vers le haut de la pile. Lorsque vous allouez de l'espace sur la pile, le pointeur de pile ($ sp) se déplace pour pointer vers la mémoire libre.

Lors de l'appel d'un sous-programme dans un assemblage MIPS (les registres étaient à une prime à l'époque - les paramètres basés sur les registres n'étaient pas conventionnels), on écrit les paramètres dans la pile, puis fait avancer le pointeur de la pile.

Lorsque la méthode démarre, un paramètre peut être à un décalage de 16($sp). Cependant, comme les variables sont placées sur la pile, le pointeur de la pile se déplace et le même paramètre peut désormais se trouver à la 24($sp)place. Cela peut rendre le code un peu déroutant.

Le pointeur de trame ($ fp) pointe vers le début de la trame de pile et ne se déplace pas pendant la durée de l'appel de sous-routine. Cela pointe vers la base du cadre de pile et les paramètres qui sont passés au sous-programme restent à un point constant par rapport au pointeur de cadre.

Sachez que le pointeur de trame devra être stocké et restauré avec des appels de sous-programme qui le modifient.

Lectures complémentaires:


la source
Je ne sais pas ce que l'on entend par "les registres étaient à une prime à l'époque - les paramètres basés sur les registres n'étaient pas conventionnels", mais des paramètres peuvent également être mis sur la pile lorsque le nombre de registres est limité. Si vous avez 35 paramètres par exemple (je crois que MIPS a 32 paramètres), alors vous devrez mettre les 3 derniers paramètres sur la pile.Plus plus spécifique à l'implémentation, le FP serait à l'adresse en mémoire où se trouve l'adresse de retour.
Jonathan
1
@Jonathan MIPS De ces 32 registres, $ 0 était 0. $ at était réservé, $ v0 et $ v1 étaient pour la valeur de retour des appels de fonction, $ a0 - $ a3 étaient des paramètres de fonction, $ t0 - $ t9 étaient temporaires (l'appelant conserve) , $ s0 - $ s7 ont été enregistrés et $ gp, $ sp, $ fp et $ ra ont été utilisés par le système lui-même. Dans l'ensemble, il n'y avait que 24 registres à usage général et certains de ces frais généraux si vous vouliez les utiliser. Vous n'utilisiez généralement que les registres $ t (10). Comparez cela avec l'Itanium qui a 128 registres. En appelant une fonction dans MIPS avec 35 paramètres, vous les mettriez probablement tous sur la pile.
@Jonathan Je signalerai également ce commentaire : "AMD Bulldozer: 96 GPR physiques, Intel Sandy Bridge: 160 GPR physiques, Intel Haswell: 168 GPR physiques". Les choses deviennent drôles avec plusieurs machines de base. La SPARC comptait 160 registres . Je vous conseille également d' enregistrer une fenêtre qui est entrée dans une partie de la philosophie de conception de MIPS avec deux fois moins de registres que ses contemporains.
Donc, c'est la même chose que l'utilisation conventionnelle du %ebpregistre «pointeur de base» dans la convention d'appel x86? (Je suis nouveau dans tout cela, mais cela ressemble à la même chose que d'utiliser quelque chose comme ça MOV 8(%ebp), %eax?)
ELLIOTTCABLE
La ligne Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.n'est pas tout à fait claire de ce que cela signifie
zadane