J'étudie MIPS32 pour un examen et récemment je me promenais de traduire une structure C dans MIPS. Je suis assez nouveau au code MIPS et le code de montage en général, mais j'ai essayé de rassembler tout ma connaissance de faire de la solution.
Disons que j'ai une structure C simple: p> Ce que j'ai à l'esprit consiste à stocker toutes les données de la pile, comme celle-ci: p> et si j'ai plus d'un élève, je crée simplement un routine qui stocke les arguments dans la pile.
J'ai un problème cependant, comment puis-je garder une trace de tous les étudiants?
Peut-être avec un pointeur de cadre? p> Je ne sais pas si c'est le moyen approprié de représenter une structure dans MIP, faites-moi savoir s'il y a de meilleures solutions. P> P>
3 Réponses :
Vos données peuvent être allouées locales, statiques ou dynamiquement. Il n'y a personne de règle.
Voir: https://godbolt.org/z/gfdvd8
J'ai un problème cependant, comment puis-je suivre tous les étudiants? peut-être avec un pointeur de cadre? P> blockQuote>
Vous n'avez pas besoin d'un pointeur de cadre pour garder une trace de tous les étudiants. De plus, le problème de garder une trace d'eux n'est pas unique à leur structure - vous auriez le même problème de garder une trace de nombreux entiers. Et encore encore, le problème de garder une trace de nombreux articles n'est également pas unique à l'assemblage. P>
Ce dont vous avez besoin est une variable distincte pour chaque élément (souvent irréalisable, surtout si le nombre d'éléments est variable) ou une structure de données: une collection de quelque sorte, par exemple. une liste ou une liste liée, par exemple. P>
avec une variables locales distinctes en C nécessite chacune un nom différent et, en montage, chacun aurait un décalage / emplacement différent dans le cadre de pile. L'espace de pile pour tous serait attribué dans une seule instruction et ils sont tous référencés via leur compensation individuelle du pointeur de pile. P>
Un pointeur de cadre peut être utilisé si vous le souhaitez, mais puisque avec MIPS, l'espace de pile d'une fonction de pile de fonction est alloué dans une instruction dans prologue de la fonction , le pointeur de pile ne bouge pas autrement pendant le corps de la fonction - et cela signifie que les variables individuelles restent à des décalages constants du pointeur de pile. P>
Un pointeur de cadre peut être utile si: p>
- La machine ne fait pas de pile de piles de compensation relative, mais que le pointeur de l'image se décalage facilement, ou Li>
- La machine nécessite une poussée fréquente et une poussée qui déplace le pointeur de pile, ce qui modifie les décalages nécessaires pour accéder aux mêmes emplacements dans le cadre de pile - un pointeur de trame reste constant indépendamment de la poussée et du saut. (La poussée et la poussée peuvent être utilisées pour le passage de l'argument et / ou le stockage temporaire s'il existe des registres de la CPU insuffisants, par exemple lors de l'évaluation de l'expression.) LI>
- une fonction allouer de manière dynamique de l'espace de pile, par ex. Via c's
Alloca code>
. Li> ul>De manière générale, les deux premières ne s'appliquent pas aux mips, des fonctions n'ont généralement pas besoin d'un pointeur de trame. P>
Alternativement, vous pouvez utiliser une structure de données comme une matrice pour garder une trace de nombreux articles. Le tableau lui-même doit être mentionné par une variable (en C, un nom et une assemblage d'un décalage) - mais au moins il n'y a qu'une seule variable quel que soit le nombre d'articles à suivre. Et puis vous êtes bas pour indexer pour accéder aux éléments individuels. (L'indexation consiste à calculer l'adresse des éléments et dépend de la taille des éléments, mais elle fonctionne sinon la même chose pour une matrice INT ou un tableau de struct.) P>
Merci pour la réponse détaillée. Si j'ai bien compris le moyen le plus simple de représenter une struct consiste à utiliser une collection et si je veux utiliser la pile, le pointeur de trame est inutile (sauf si je n'ai pas à allouer dynamiquement la mémoire)
Oui, mais vous avez seulement besoin d'une collection pour plusieurs articles. Une seule structure peut être stockée en mémoire ou en registres comme un int.
Une bonne idée ici serait d'allouer de l'espace avec le .space, puis alignez-le via la directive .Align n (Soyez prudent MIPS a besoin d'alignement de Word), puis chargez simplement l'adresse de cette zone de mémoire dans votre »Main: ".
Supposons que vous souhaitiez allouer de l'espace pendant 10 étudiants: p>
.align code> doit être sur une ligne séparée et avant i> le
.space code>. (Il peut être après l'étiquette; Assembly MIPS classique permet par magiquement
.Align code> insérer le rembourrage avant i> l'étiquette précédente)
OK, donc essentiellement STD_STRUCT est une collection d'étudiants et je peux les analyser en ajoutant 4bytes * n à l'adresse. Pouvez-vous m'expliquer le rôle de .Align 2?
Le commentaire @petercordes est à peu près ici, je me suis trompé que. En ce qui concerne la directive .Align n, il alignera le premier octet du bloc de 40 octets dans l'adresse disponible suivante qui est multiple de 2 ^ n. Cette procédure est liée avec le "alignement de mots" dans MIPS, qui nécessite essentiellement l'espace alloué de chaque variable pour démarrer sur une adresse qui est un multiple de la taille de (typeof (variable)).
Oui, je sais ce que .Align code> est dans Mars / Mips Assembly, même si c'est
@Petercordes oui je ne savais pas comment l'utiliser
@Petercordes définitivement, bien que je ne l'ai jamais mentionné
Vous pouvez jeter un coup d'œil à ce qu'un compilateur ferait .