Escribiendo un método usando el código MIPS

0

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

CÓDIGO C:

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

Si permitimos 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 pila se reduce en un tamaño de 1 palabra y luego se carga el valor en la variable f. Si observa la instrucción de resta, notará que el resultado sobrescribe el valor de f. de la resta entonces cual fue el uso?

    
pregunta KillaKem

1 respuesta

4
  

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

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

  

Realmente no sé por qué el puntero de pila se reduce en un tamaño de 1 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. ¿Cuál fue el uso?

Ninguna. Es redundante Una bandera de optimización probablemente habría eliminado eso.

    
respondido por el user207421

Lea otras preguntas en las etiquetas