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?
¿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.
KillaKem
usuario207421