MIPS - Comment MIPS allouer de la mémoire pour les tableaux dans la pile?
Je suis assez nouveau dans le langage assembleur MIPS et je suis actuellement en train de prendre un cours sur l'architecture de l'ordinateur qui a une grande section sur les MIPS de codage. J'ai étudié plusieurs autres de haut niveau des langages de programmation (C, C#, Python) dans le passé afin de ont quelques bases en programmation.
Ma question ici spécifiquement pose la question: Comment ne MIPS allouer de la mémoire pour les tableaux dans la pile? J'espère que la réponse à cette question sera, nous l'espérons me donner une meilleure compréhension complète de MIPS comme je suis encore un peu beaucoup sur la conceptualisation de l'idée de la MIPS de la langue et de son architecture. Je n'arrive pas à comprendre comment les pointeurs de travail dans l'ensemble de cette matière...
Serait génial si quelqu'un pouvait prendre le temps de les aider à sortir de cette confusion, étudiant! 🙂
OriginalL'auteur Sam O'Mahony | 2013-10-26
Vous devez vous connecter pour publier un commentaire.
Bien.. vous devez être conscient que les MIPS, comme C, a essentiellement trois façons différentes d'allocation de mémoire.
De considérer les éléments suivants du code C:
MIPS assemblée prend en charge tous ces types de données.
Pour allouer un tableau int dans le segment de données, vous pouvez utiliser:
Pour allouer un tableau int sur la pile, vous pouvez utiliser:
Pour allouer de l'espace sur le tas, un appel système est nécessaire. Dans le simulateur spim c'est système d'appel 9:
OriginalL'auteur Konrad Lindenbach
MIPS contrairement à d'autres architectures n'ont pas de pousser ou de la pop s'inscrire/exécution de l'instruction. Si vous comptez sur la gestion de la pile vous-même. C'est effectivement constaté dans la plupart de l'arc à l'extérieur de mul/div où vos registres n'ont pas un usage spécifique, juste une utilisation préconisée. Maintenant, si vous avez utilisé quand vous le voulez, vous casser quelque chose si vous avez essayé de l'intégrer avec le C par exemple.
Dans le but de pousser quelque chose à la pile, vous devez utiliser un magasin d'instruction. Ce sont
sb, sh, sw, swl, swr
. octet, la moitié, un mot, un mot à gauche, le mot à droite respectivement.Afin de pop quelque chose à partir de la pile, vous avez juste besoin de deincrement avec addiu trop. Cependant, vous pouvez charger les données à partir de l'utiliser
lb, lh, lw, lwl, lwr
.Voici un exemple d'utilisation avec deux mot push.
Voici un exemple d'utilisation pour l'adresse de retour ainsi, les appels à la non-feuille de fonctions ne plaisante pas.
Voici un exemple de pousser plusieurs éléments dans une rangée. Popping est l'inverse bien sûr.
Voici un exemple d'utilisation de malloc/calloc de celle-ci.
Comme je l'ai mentionné plus tôt, rien n'a beaucoup de mal définie utilisation spécifique, de sorte que vous pouvez également utiliser votre propre pile et oubliez l'utilisation de $sp si vous le souhaitez. J'ai montré des exemples où j'ai été en utilisant $t* $s*. Cela fonctionne dans le cas de forcer chaque fonction de sa propre pile, par exemple, ou certains autres cas d'utilisation que vous pouvez penser. Comme un exemple, Lua (https://lua.org) est-ce que dans une certaine mesure. Cependant, pas de MIPS. Plusieurs piles sont belles surtout lorsqu'il s'agit d'objectifs multiples.
sw 0($sp), 0($t0)
Un magasin d'instruction doit avoir un registre source, commesw $t1, 0($t0)
! Vous ne pouvez pas faire cela, même sur x86. J'ai vérifié, et même sur MARS n'est pas à la traiter comme une pseudo-instruction à l'aide de LW en$at
pour vous, alors vous avez besoin pourlw
vous-même. Sauf si vous êtes vraiment confiant dans votre connaissance / expérience de l'architecture, assurez-vous que votre code au moins compile/assemble, même si vous n'avez pas de test (parce que vous êtes seulement en montrant un fragment qui ne fonctionne pas sur son propre).syscall 9
est pour l'allocation de tas, pas de gestion de la pile.J'ai pensé que je fixe ça lol. Je l'ai fait pour ma propre référence.
OriginalL'auteur user2262111