Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Architettura degli elaboratori e delle reti
 
Esercizio ricorsione
Clicca QUI per vedere il messaggio nel forum
pintu
é un vecchio esercizio trovato qui su dsy. Ho provato a risolverlo. Può andare??

F(n) = n se n < 2
F(n) = F(n/2) * F(n/3) altrimenti

F: bge $a0, 2, funct # se n >= 2 salta a funct
move $v0, $a0 #se n<2 , $v0 = n (ritorna n)
jr $ra


funct: addi $sp $sp -12
sw $ra, 0($sp)
sw $a0, 4($sp)
div $a0, $a0, 2 #n = n/2
jal F #richiamo F con parametro n/2
sw $v0, 8($sp) #metto nello stack il risultato parziale
div $a0, $a0, 3 #n = n/3 (qui $a0 contiene sempre n oppure ora contiene n/2?)
jal F #richiamo F con parametro n/3
lw $t0, 8($sp) #recupero il risultato parziale dallo stack
mul $v0, $v0, $t0
lw $ra, 0($sp)
lw $a0, 4($sp)
lw $v0, 8($sp)
addi $sp, $sp, 12
jr $ra

uLori
ciao, allora è abbastanza giusto secondo me, ma ci sn degli errori:

funct: addi $sp $sp -12
sw $ra, 0($sp)
sw $a0, 4($sp)
div $a0, $a0, 2 #n = n/2 il risultato della div finisce in mflo, da li lo devi spostare..e la div non puoi farla così la devi fare tra 2 registri, quindi devi mettere il valore 2 in un registro e poi dividere..
jal F #richiamo F con parametro n/2
sw $v0, 8($sp) #metto nello stack il risultato parziale

qui devi ricaricare nuovamente $a0 con il valore originale se no ti utilizzerà quello modificato precedentemente e tutto l'esercizio sballa
lw $a0, 4($sp)

div $a0, $a0, 3 #n = n/3 (qui $a0 contiene sempre n oppure ora contiene n/2?)

il risultato di una div o di una mult vanno a finire nel registro mflo..da li lo devi spostare facendo mflo $.. e il registro dove vuoi metterlo

jal F #richiamo F con parametro n/3
lw $t0, 8($sp) #recupero il risultato parziale dallo stack
mul $v0, $v0, $t0 non è mul ma mult :) e il risultato si trova in mflo..quindi non va scritta così, ma mult $v0,$t0

lw $ra, 0($sp)
lw $a0, 4($sp) #non serve che ricarichi $a0 tanto ora non ti serve piu
lw $v0, 8($sp) #questa non ha senso..
addi $sp, $sp, 12
jr $ra

pintu
grazie uLori ;) comunque ho fatto oggi l'esame dovrebbe essere andato bene attendo i risultati!

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate