Rekursive Fibonacci in MASM Montage
So, ich bin Programm erstellen zu geben, die te Glied der Fibonacci-Folge. Ich soll die Umsetzung der folgenden Logik, die mit rekursiven MASM Montage.
int fib(int n){
if ((n == 1) || (n == 2))
return n - 1;
else
return fib(n-1) + fib(n-2);
}
Das Problem, das ich scheinen zu haben, ist die Beibehaltung der Werte, die das Programm durchläuft, bis Sie zum 1. Ich bin ziemlich unerfahren mit Rekursion und ich fühle mich wie ich bin etwas fehlt in diesem Aspekt. Ich bin nicht sicher, wie Sie Sie behalten die Werte, um Sie hinzuzufügen.
.code
main PROC
mov ecx,0
push 4 ; calculate the nth fib
call Fib ; calculate fib (eax)
call WriteDec
call Crlf
exit
main ENDP
Fib PROC
add ecx,1
push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,2 ; n == 2?
je exception2
cmp eax,1 ; n == 1?
je exception2
dec eax
push eax ; Fib(n-1)
call fib
add eax,
jmp Quit
Exception2:
dec eax
Quit:
pop ebp ; return EAX
ret 4 ; clean up stack
Fib ENDP
END main
- Die Verwendung der stack zum speichern der Werte der Register, die Sie gerade ändern, müssen aber später wiederherstellen.
- Ich hatte Probleme beim Zugriff auf Sie aus dem Stapel. Ich benutze push-und [ebp] aber wenn ich drücken Sie ein register an der falschen Stelle zu einem Absturz. Die versuchen auf die vorherigen Werte in den stack liefert nur dann Zufallszahlen, weil ret 4 löscht den stack, wenn es beendet eine Runde von fib.
- Jeder
push
muss eine entsprechendepop
(oderadd esp,n
,ret n
, ...). Ohne genau gesehen, was du getan hast, es ist schwer zu sagen, was das problem ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Am Ende der Prozedur, die Sie wiederherstellen müssen
ESP
nicht nurEBP
.ret 4
(stdcall) ist in diesem Fall nicht praktisch, weil man Sie wiederverwenden kann, den Wert auf dem stack für den zweiten Anruf.Für das Ergebnis des ersten Anrufs Sie können eine lokale variable erzeugt, auf die "aktuelle" stack.
Nicht mischen groß-und Kleinbuchstaben in Symbolen, auch wenn eine OPTION-Direktive erlaubt es!
Ich änderte Sie Ihren code entsprechend:
montieren in VS