PDA

View Full Version : Progetto Assembly Ricorsivo


matrixola10
30-10-2005, 11:32
Ciao a tutti, sto facendo un progetto assembly, sono in crisi perchè la ricorsione mi fa impazzire :muro: qualcuno mi da una mano con questa formula?
D(n)=(n-1)(D(n-1)+D(n-2)
grazie mille

cdimauro
31-10-2005, 10:13
Assembly x86? 8086 o 80386+?

O altro?

matrixola10
31-10-2005, 10:15
Assembly x86? 8086 o 80386+?

O altro?
Mips!!!

bottomap
31-10-2005, 10:30
Ciao,

Qual'è esattamente il problema? La ricorsione in sé, la formula in particolare o la sua implementazione in asm?

La struttura (pesudocodice poco ottimizzato 386+ di quello che chiedi) dovrebbe essere all'incirca:

diciamo che in eax hai n, immagino che la ricorsione si arresti per n==2, il risultato sarà sempre in eax. D(1) e D(0) non so esattamente quanto possano valere, in caso il codice dovrà essere leggermente modificato... quello che posto ritorna 0 in questi due casi. Ovviamente non faccio niente ai registri (push/pop/impostazione di uno stack frame e simili), in caso dovrai provvedere tu...

ricors_proc

mov ebx,eax //Salvo n

cmp eax,2
jle tornaZero

dec eax //prendo n-1
call ricors_proc
mov ecx,eax //salvo D(n-1)

mov eax,ebx //Riprendo n
sub eax,2 //o due dec
call ricors_proc
add ecx,eax //in ecx ho D(n-1)+D(n-2)

xchg eax,ecx //scambio ecx con eax
dec ebx //riprendo n-1 (ebx non mi serve più)
mul ebx //moltiplico eax*ebx (n-1)*(D(n-1)+D(n-2))
jmp esci

tornaZero:
xor eax,eax
esci:
ret
ENDP

Ovviamente trasformarlo in asm 8086 non è difficile (occhio alla moltiplicazione, comunque), trasformarlo in MIPS o altri asm può richiedere un po' di lavoro in più visto che in asm x86 il primo operando è la destinazione dell'operazione e che i nomi dei registri sono diversi...

Ciaociao :)

matrixola10
31-10-2005, 12:18
Ciao,

Qual'è esattamente il problema? La ricorsione in sé, la formula in particolare o la sua implementazione in asm?

La struttura[...]diversi...

Ciaociao :)

Grazie mille già così ho un'idea più chiara