Escribiendo un método usando código MIPS

Estoy tratando de entender cómo convertir código C a código MIPS y tengo problemas para entender por qué el puntero de pila ($sp) debe manipularse antes y después del código de procedimiento. ¿No se supone que el programa incrementa automáticamente el puntero de pila después? cada instrucción?

CÓDIGO C:

int myMethod (int g, h, i, j)
{ 
  int f;
  f = (g + h) - (i + j);
  return f; 
}

Si hacemos que g, h, i, j = $a0, $a1, $a2, $a3 y f = $s0 y resultado = $v0 entonces, CÓDIGO MIPS:

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

Realmente no sé por qué el puntero de la pila se reduce en 1 tamaño de palabra y luego su valor se carga en la variable f, si observa la declaración de resta, notará que el valor de f se sobrescribe con el resultado de la resta Entonces, ¿cuál fue el uso?

Respuestas (1)

¿No se supone que el programa incrementa automáticamente el puntero de la pila después de cada instrucción?

No. Estás confundiendo el puntero de la pila con el contador del programa. El PC se incrementa después de cada instrucción.

Realmente no sé por qué el puntero de la pila se reduce en 1 tamaño de palabra

Para hacer espacio en la pila para la variable local f.

y luego su valor cargado en la variable f, si observa la declaración de resta, notará que el valor de f se sobrescribe con el resultado de la resta, entonces, ¿cuál fue el uso?

Ninguno. es redundante Una bandera de optimización probablemente habría eliminado eso.

Así que aumentamos la pila en una palabra y luego movimos el contenido del registro $s0 a la primera posición de la pila para que pudiéramos usar el registro para almacenar la variable local f durante el proceso de ejecución del método, y luego restauramos $s0 en el final verdad? Si no necesitáramos almacenar el contenido de $s0, ¿necesitaríamos aumentar la pila? Podríamos usar $ s0 y no nos importaría qué valor final quedaría allí, ¿verdad?
Eso es todo correcto. Si escribiera un método más complejo, vería que el registro $ s0 se derrama en la ranura de la pila en el código generado.