2016-04-16 3 views
1

In MIPS, ein Doppel (8 Bytes) zu speichern, der Stapelzeiger $sp um 4 dekrementiert wird:MIPS Doppelwortgrenze und Stapelzeiger

addi $sp, $sp, -4 
s.d  $f10, 0($sp) 

Dies macht keinen Sinn für mich machen, als 8 Bytes ist in den Speicher aufgenommen werden, aber der Stapelzeiger bewegt sich, als ob er eine einzelne Wortgrenze verwendet. Zum Speichern von zwei Doppelzimmern, so scheint es, der Stapelzeiger sollte um 12 verringert wird, nicht 16 wie erwartet:

addi $sp, $sp, -12 
s.d  $f10, 0($sp) 
s.d  $f12, 8($sp) 

Warum tritt dieses Verhalten auftreten? Es verursacht dann Probleme, wenn das Unterprogramm rekursiv aufgerufen wird (das erste Mal ist ausgerichtet, das zweite ist nicht)

Bearbeiten: Ich verwende diesen Code mit MARS 4.5. s.d $f10, 8($sp) übersetzt in

lui $1,0 
addu $1,$1,$29 
sdc1 $f10,8($1) 

Der Stapelzeiger während dieser Zeit nicht verschoben wird. Beim Durchschreiten sieht es so aus, als ob sdc1 sowohl $f10 als auch gleichzeitig in den Stapel bringt.

+0

Was/wer generiert diesen Code (d. H. Was/wer entscheidet, um wie viel der Stackzeiger dekrementiert wird)? In MARS ist 's.d' eine Peso-Anweisung. Vielleicht hilft Ihnen die Pseudo-Instruktionserweiterung im Kontext des kompletten Programms, Ihre Frage zu beantworten. – Zack

+0

@Zack Ich habe den ursprünglichen Post aktualisiert. – qwr

+0

Ich denke auch, dass der Stapelzeiger um 8 nicht dekrementiert werden sollte 4. Was führt Sie zu der Annahme, dass 8 nicht korrekt ist? – Zack

Antwort

0

Überprüfen Sie, ob der $ sp nur auf einen Wert gesetzt ist, der kein Vielfaches von 8 ist. Falls ja, versuchen Sie dies: andi $sp, $sp, 0xfffffff8. Das sollte $ sp auf das nächste Vielfache von 8 zurücksetzen. Sie müssen jedoch vorsichtig sein, damit Sie $ sp auf seinen ursprünglichen Wert zurückgeben können.

+0

Ich verwende 'add $ sp, $ sp , -4 'und 'addieren $ sp, $ sp, 4', was im Wesentlichen äquivalent ist. Die Gründe hinter MARS Fehler ist, was ich mehr interessiert bin. – qwr

+1

MIPS erfordert, dass Daten "ausgerichtet" werden. Das bedeutet, dass Adressen von Wortdaten ein Vielfaches von 4 sein müssen und Adressen von Doppelwortdaten ein Vielfaches von 8 sein müssen. Nehmen wir an, dass $ sp zufällig auf ein Vielfaches von 8 initialisiert wird, dann eine Ganzzahl und dann ein Doppelwort-Float. Der zweite Push wird einen Laufzeitfehler verursachen, da $ sp nicht mehr ein Vielfaches von 8 ist. Das "andi" oberhalb "rundet" ab; Es subtrahiert nicht. – Zack