Ciao,
Voglio scrivere questo programma da pseudo C a linguaggio assembly che prende in input il parametro n intero e restituisce un intero.
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;
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?
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.
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
Cioè riuscite a spiegarmi in modo semplice come procedere con procedure ricorsive e annnidate?
Grazie