Ciao,
Voglio scrivere questo programma da pseudo C a linguaggio assembly che prende in input il parametro n intero e restituisce un intero.
Potete spiegarmi secondo le regole del metodo chiamante e del metodo chiamato dove e quando si devono salvare determinati registri nello stack e quando si devo ripristinare?codice:•function calcola (n : integer) : integer; •var m,x : integer; •begin •x := resto di n diviso 3 # usare la divisione del MIPS •if (x<2) •thenrisultato := 2 •else m := call(x)# calle’ una funzione data •risultato := calcola (m) + calcola (x) •end;
La regola sarebbe:
Quando il Main chiama Procedura:
1.Dentro Proc creo spazio, nello stack, per tutte le variabili usate
2.memorizzo tali variabili nello stack
QuandoProc rida’ il controllo al Main:
3.rimetto nei registri utilizzati da Proc i valori iniziali
4.puliscolo stack
Inoltre in questo codice che ho trovato online non ho capito esattamente perchè vengono ripristinati i registri due volte.
Cioè riuscite a spiegarmi in modo semplice come procedere con procedure ricorsive e annnidate?codice:addi$sp, $sp, -8 # alloco spazio nello stack sw$ra, 4($sp) sw$a0, 0($sp) slti$t0, $a0, 1 # se a0<1, $t0 diventa1 beq$t0, $zero, Else # Controllon < 1 addi$v0, $zero, 1 lw$a0, 0($sp) lw$ra, 4($sp) addi$sp, $sp, 8 # aggiorno stack jr$ra Else: sub $a0, $a0,1 # calcolo n-1 jal Fatt # chiamo il fattoriale lw$a0, 0($sp) # ripristino $a0 lw$ra, 4($sp) # ripristino $ra addi$sp, $sp, 8 # aggiorno stack mul$v0, $a0, $v0 # setto il risultaton * fatt (n-1) jr $ra
Grazie


ma pare faccia moltiplicazioni usando le somme, ad occhio.
