Oppure

Loading
31/01/11 12:58
mark86
1)    E(n, k) = (n − k + 1)E(n − 1, k − 1) + kE(n − 1, k)
il mio programmino deve fare questo:

void main (m){

inserisci m
if m>=0 {
for x= 1 to m do {
print “E(m,x)” :
print Eulerian(m,x);
print “/n”;
}
}else{
Stampa errore inserimento m
}

}
function Eulerian(n,k){

if (k=1) return 1
if (k>n) return 0
T1= (n-k+1)* Eulerian(n-1, k-1) + k* Eulerian(n-1, k)
return T1

}

quando lo traduco in Assembly , la ricorsiva mi da problemi.ora la posto:
eulerian:
addi     $sp, $sp, -32        # creo lo spazio nello stack
sw    $ra, 0($sp)        # salvo return address
sw    $a0, 4($sp)        # salvo il valore di k in a0 sullo stack
sw     $a1, 8($sp)     # salvo $a1 salvo il valore di n
sw     $a2, 12($sp)     # salvo $a2
sw $a3, 16($sp)     # salvo $a3
ble    $a0,1,equal_1
# calcolo il primo blocco : (n - k + 1)E(n - 1, k -1) #
# E(n-1,k-1)
addi     $a0, $a0, -1     # decremento k di 1 ----> k-1
addi    $a1, $a1, -1        # decremento n di 1 ----> n-1
jal     eulerian        # calcolo E(n - 1, k -1)
                # $v0 = E(n - 1, k -1)
#(n-k+1)
lw     $a0, 4($sp)     # riprendo il valore di k dallo stack
lw    $a1, 8($sp) # riprendo il valore di n dallo stack    
sub     $a1, $a1, $a0     # decremento n di k
addi     $a3, $a1, 1     # $a3= n-k+1
mul    $a2,$a3,$v0        # $a2=(n - k + 1)E(n - 1, k -1)
move     $a3, $a2     # sposto in $a3 il contenuto di $a2
sw     $a3, 16($sp)          # salvo $a3 sullo stack
# calcolo il secondo blocco : kE(n - 1, k) #
lw     $a0, 4($sp)     # riprendo il valore di k dallo stack
lw    $a1, 8($sp)        # riprendo il valore di n dallo stack
addi     $a1, $a1, -1        # decremento n di 1 ----> n-1
addi    $a0,$a0, 0        # lascio il k così com'è
jal     eulerian            # calcolo E(n - 1, k)
                    # $v0 = E(n - 1, k )
lw    $a0,4($sp)        # riprendo il valore di k dallo stack
mul    $a2, $a0, $v0        # calcolo kE(n - 1, k)
sw    $a2,12($sp)
lw    $a2,12($sp)
lw     $a3, 16($sp)     # riprendo il primo blocco dallo stack
add     $a3, $a3, $a2 # sommo (n - k + 1)E(n - 1, k -1) con kE(n-1, k)
move $v0, $a3     # sposto risultato totale in $v0
j end            # Salta alla procedura di ripristino dello stack
equal_1:
li $v0, 1                # salvo 1 in $v0
end:    
# Ripristina valori dello stack
lw $a3, 16($sp)     # ripristina i valori sullo stack
lw $a2, 12($sp)          #     
lw $a1, 8($sp)         #     
lw $a0, 4($sp)
lw $ra, 0($sp)
    
addi $sp, $sp, 32        # ripristino $sp
    
jr $ra                # ritorno ricorsione


non riesco a trovare l'errore........x' quando richiamo la ricorsiva nel 2°blocco mi va in loop.........qualcuno mi può aiutare per favore?:d
aaa
31/01/11 20:17
TheKaneB
riformatta il codice dentro i tag [ code ] perchè non si capisce niente...

Poi di che Assembly sai parlando? A occhio sembra MIPS o SPARC, potresti essere più specifico?

Ciao
Ultima modifica effettuata da TheKaneB 31/01/11 20:18
aaa