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?