|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 459
|
[Assembly] chiarimenti
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 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:07.