Ich versuche zu verstehen, wie C-Code in MIPS-Code konvertiert wird, und ich habe Probleme zu verstehen, warum der Stapelzeiger ( $ sp ) vor und nach dem prozeduralen Code manipuliert werden muss. Soll das Programm den Stapelzeiger danach nicht automatisch erhöhen? jede Anweisung?
C-CODE:
int myMethod (int g, h, i, j)
{
int f;
f = (g + h) - (i + j);
return f;
}
Wenn wir g, h, i, j = $a0, $a1, $a2, $a3 und f = $s0 und result = $v0 lassen, dann MIPS CODE :
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1 #SUB STATEMENT
add $v0, $s0, $zero
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Ich weiß nicht wirklich, warum der Stapelzeiger um 1 Wortgröße dekrementiert und dann sein Wert in die f-Variable geladen wird. Wenn Sie sich die Subtraktionsanweisung ansehen, werden Sie feststellen, dass der Wert von f dann durch das Ergebnis der Subtraktion überschrieben wird was hat es also genützt?
Soll das Programm den Stapelzeiger nicht nach jeder Anweisung automatisch inkrementieren?
Nein. Sie verwechseln den Stapelzeiger mit dem Programmzähler. Der PC wird nach jeder Anweisung inkrementiert.
Ich weiß nicht wirklich, warum der Stapelzeiger um 1 Wortgröße dekrementiert wird
Um auf dem Stack Platz für die lokale Variable zu schaffen f
.
und dann wird sein Wert in die f-Variable geladen. Wenn Sie sich die Subtraktionsanweisung ansehen, werden Sie feststellen, dass der Wert von f dann durch das Ergebnis der Subtraktion überschrieben wird. Was war also der Zweck?
Keiner. Es ist überflüssig. Ein Optimierungs-Flag hätte das wahrscheinlich entfernt.
KillaKem
Benutzer207421