0
votes

représenter une structure dans MIPS32

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: xxx

Ce que j'ai à l'esprit consiste à stocker toutes les données de la pile, comme celle-ci: xxx

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?

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.


1 commentaires

Vous pouvez jeter un coup d'œil à ce qu'un compilateur ferait .


3 Réponses :


0
votes

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 xxx < / p>


0 commentaires

2
votes

J'ai un problème cependant, comment puis-je suivre tous les étudiants? peut-être avec un pointeur de cadre?

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.

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.


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.

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.


Un pointeur de cadre peut être utile si:

  • La machine ne fait pas de pile de piles de compensation relative, mais que le pointeur de l'image se décalage facilement, ou
  • 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.)
  • une fonction allouer de manière dynamique de l'espace de pile, par ex. Via c's Alloca .

    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.


    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.)


2 commentaires

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.



0
votes

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: xxx


6 commentaires

.align doit être sur une ligne séparée et avant le .space . (Il peut être après l'étiquette; Assembly MIPS classique permet par magiquement .Align insérer le rembourrage avant 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 est dans Mars / Mips Assembly, même si c'est Un peu différent des assembleurs" normaux ". La 2e moitié de votre commentaire était-elle censée être une réponse à l'OP, @purplekiwi?


@Petercordes oui je ne savais pas comment l'utiliser


@Petercordes définitivement, bien que je ne l'ai jamais mentionné