Schreiben einer Methode mit MIPS-Code

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?

Antworten (1)

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.

Also haben wir den Stack um ein Wort erhöht und dann den Inhalt des Registers $s0 an die erste Position des Stacks verschoben, damit wir das Register verwenden konnten, um die lokale Variable f während des Methodenausführungsprozesses zu speichern, und dann haben wir $s0 at wiederhergestellt das ende richtig? Wenn wir den Inhalt von $s0 nicht speichern müssten, müssten wir dann den Stack erhöhen? Wir könnten einfach $s0 verwenden und es wäre uns egal, welcher Endwert dort drin verbleibt, richtig?
Das ist alles richtig. Wenn Sie eine komplexere Methode schreiben, würden Sie sehen, wie das Register $s0 im generierten Code in den Stack-Slot übergeht.