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.
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
@Zack Ich habe den ursprünglichen Post aktualisiert. – qwr
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