MIPS: utilisation pertinente pour un pointeur de pile ($ sp) et la pile
Actuellement, je suis étudiant pour mon organisation de l'ordinateur à mi-parcours, et j'essaie de comprendre pleinement le pointeur de pile et la pile. Je sais que ces faits suivants qui entourent le concept:
- Il suit de la première à la dernière principe
- Et d'ajouter quelque chose à la pile prend un processus en deux étapes:
addi $sp, $sp, -4 sw $s0, 0($sp)
Ce que je pense m'en empêche de pleinement comprendre, c'est que je ne peux pas venir avec une pertinente, l'autonomie apparente de la situation où j'aurais besoin et/ou envie de garder une trace des données avec un pointeur de pile.
Quelqu'un pourrait-il préciser le concept dans son ensemble et de me donner quelques exemples de code?
source d'informationauteur Connor Black
Vous devez vous connecter pour publier un commentaire.
Une importante utilisation de la pile est d'imbrication de sous-programme d'appels.
Chaque sous-routine peut avoir un ensemble de variables locales de cette sous-routine. Ces variables peuvent être facilement stockés sur un tapis dans un frame de pile. Certaines conventions d'appel de passer des arguments sur la pile.
À l'aide des sous-routines signifie également que vous devez garder une trace de l'appelant, qui est l'adresse de retour.
Sur certaines architectures, une pile à cette fin, tandis que d'autres utilisent implicitement la "normale" de la pile. MIPS par défaut utilise uniquement un registre, mais dans des feuilles de fonctions (ie. des fonctions qui appellent d'autres fonctions) que l'adresse de retour est écrasé. Par conséquent, vous devez enregistrer la valeur d'origine, généralement sur la pile entre vos variables locales. Les conventions d'appel peut également déclarer que certaines valeurs de registre doit être conservé à travers les appels de fonction, vous pouvez même les enregistrer et de les restaurer à l'aide de la pile.
Supposons que vous avez cette C fragment:
MIPS assemblée peut alors ressembler à ceci:
Le MIPS convention d'appel exige d'abord de quatre paramètres de la fonction pour être dans les registres
a0
para3
et le reste, s'il y a plus, sur la pile. De plus, elle nécessite également la fonction de l'appelant pour allouer de quatre logements sur la pile pour les quatre premiers paramètres, en dépit de ceux passés dans les registres.Donc, si vous souhaitez accéder au paramètre de cinq (et d'autres paramètres), vous devez utiliser
sp
. Si la fonction appelle à son tour à d'autres fonctions et utilise ses paramètres après les appels, il sera nécessaire de stockera0
para3
dans ces quatre fentes sur la pile pour éviter de les perdre/écrasés. Encore une fois, vous utilisezsp
d'écrire ces registres sur la pile.Si votre fonction a des variables locales et ne peut pas suivre tous d'entre eux dans les registres (comme quand il ne peut pas garder
a0
para3
lors de l'appel à d'autres fonctions), il faudra utiliser l'espace de pile pour ceux variables locales, ce qui nécessite l'utilisation desp
.Par exemple, si vous avez eu ce:
son démontage serait quelque chose comme:
Voir,
sp
est utilisé pour accéder àx5
.Et puis si vous avez le code à quelque chose comme ceci:
c'est ce à quoi il ressemble dans le démontage après la compilation:
J'espère que j'ai annoté le code sans faire de fautes.
Notez que le compilateur choisit d'utiliser
r16
etr17
dans la fonction, mais les conserve sur la pile. Puisque la fonction en appelle une autre, il doit également préserver son adresse de retour sur la pile au lieu de le garder dansr31
.PS Rappelez-vous que l'ensemble de la branche/instructions de saut sur le MIPS exécuter le immédiatement en suivant les instructions avant de transférer le contrôle à un nouvel emplacement. Cela pourrait être source de confusion.