2014-07-15 4 views
3

Je ne peux absolument pas comprendre la pile de MIPS. L'espace sur la pile est attribué en soustrayant le registre $ sp, la pile se développe dans la direction du programme, quand elle croît trop, elle déborde en écrasant (ou au moins en essayant) le programme. Une fois la fonction exécutée, je dois supprimer la pile en ajoutant la même valeur que j'ai soustraite en premier. Tout cela me va bien. On m'a dit, cependant, que lorsque je sauvegarde des arguments, je dois allouer quatre espaces, correspondant aux quatre premiers arguments ($ a0- $ a3), et ne jamais les utiliser (comme indiqué here). Pourquoi? De plus, lorsque je construis la pile, je dois sauvegarder des arguments supplémentaires. Devrais-je sauvegarder les arguments "non extra" aussi? par exemple. l'assemblage de ce programme C:La pile de MIPS provoque un débordement de mon cerveau

void f (int x, int y, int z) { 
    int array[5], a, b; 

    if (x >= y && x != z) 
     g(x+1, y+2, z+3, 4, 5); 
    else 
     h(x-1, y-2, z-3, 4, 5, 6, 7); 

    while (z != 0) 
     x++ 
} 

Dois-je économiser $ A0- $ sur leurs a3 positions respectives de la pile? Dois-je les enregistrer dans $ s0- $ s3? Si je n'avais pas la pièce alors que, est-ce que je devrais pas les enregistrer?

+0

La page que vous avez lié est décrit une convention d'appel spécifique à Microsoft. Ce n'est pas la seule façon d'utiliser la pile sur les processeurs MIPS. –

+0

Euh, vous n'avez besoin d'allouer aucun espace de pile dans C. En fait, C ne nécessite pas de pile. Vous déclarez des variables avec une durée de stockage automatique, le compilateur fait le reste. En outre, +1 pour les conventions d'appel Microsoft intimidées. – EOF

+0

@EOF Je suis désolé, ce que je voulais dire, c'est comment l'assemblage de ce programme C serait. – gabrieljcs

Répondre

3

C'est juste une convention que les arguments sont passés de cette façon. Si vous écrivez un programme et que l'une de vos fonctions appelle une autre fonction écrite par vous, vous pouvez aussi décider de passer tous les arguments sur la pile (au lieu de $ a0- $ a3) ou de faire quelque chose de différent ...

lorsque vous appelez une fonction non écrite par vous (par exemple une fonction générée par un compilateur C) ou que votre fonction est appelée par une telle fonction, vous devez supposer que la fonction non écrite par vous se comporte comme elle est décrite ici. Que lorsque j'économise des arguments, je dois allouer quatre espaces correspondant aux quatre premiers arguments ($ a0- $ a3) et ne jamais les utiliser (comme indiqué ici). Pourquoi?

Les premiers processeurs MIPS ont été conçus pour les ordinateurs haut de gamme. L'objectif principal derrière ces conventions était la rapidité et non la facilité d'utilisation.

Je pensais juste à cette convention "étrange": Il y a beaucoup de cas où cette convention va générer le code le plus rapide possible. Donc, c'est la raison.

Dois-je également sauvegarder les arguments "non extra"?

Vous pouvez le faire; Cependant, la fonction que vous appelez ignore les données qui y sont stockées.

Lorsque j'écris un propre compilateur (ce que j'ai déjà fait), cela devrait être beaucoup plus facile lorsque vous stockez les "arguments non-supplémentaires" sur la pile - donc cela pourrait être une raison de le faire.

2

MIPS conventions d'appel de Wikipedia

Le 1 le plus couramment utilisé pour la convention d'appel 32 bits MIPS est le O32 [2] ABI qui passe les quatre premiers arguments à une fonction dans les registres $ A0- $ a3 ; les arguments suivants sont passés sur la pile. L'espace sur la pile est réservé pour $ a0- $ a3 dans le cas où l'appelé a besoin de sauvegarder ses arguments, mais les registres ne sont pas stockés là par l'appelant. La valeur de retour est stockée dans le registre $ v0; une deuxième valeur de retour peut être stockée dans $ v1.

Vous pouvez modifier les $t0, ... $t9 registres sans les enregistrer sur la pile, mais ils peuvent être modifiés par toutes les fonctions de vos appels de code. Si vous devez utiliser $s0, ..., $s7, vous devez les enregistrer sur la pile et les restaurer avant de les retourner.

Questions connexes