non mi è chiara una cosa riguardo alla gestione dello stack quando scrivo in Assembly.
Ad esempio, so che se ho un registro da salvare e preservare devo inserirlo nello stack.
Mettiamo che debba salvare il registro s0; all'inizio della funzione, libero lo stack in questo modo:
- Codice:
addi $sp, $sp, -4
sw $s0, 0($sp)
Ma come faccio a capire se un determinato registro deve essere salvato oppure no?
Ad esempio, dato questo codice C:
- Codice:
int mul(int ar[], int dim)
{
int i, acc;
acc=1;
for (i=0; i<dim; i++)
acc = acc*ar[i];
return(acc);
}
alla variabile i è associato il registro s0 mentre ad acc è associato il registro s1.
Il professore l'ha tradotto in Assembly così:
- Codice:
addi $sp, $sp, -8
sw $s0, 0($sp)
sw $s1, 4($sp)
sll $t4, $t0, 2 # $t4 <- i*4
add $t4, $a0, $t4 # $t4 <- &a[i]
lw $t5, 0($t4) # $t5 <- a[i]
mul $t1, $t5
mflo $t1 # $t1 <- acc*ar[i];
lw $s0, 0($sp)
lw $s1, 4($sp)
addi $sp, $sp, 8
jr $ra
ha quindi inserito (e poi eliminato) nello stack due registri, che corrispondono ad i e ad acc.
Ma perchè devo salvarli?