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 entsprechende pop (oder add esp,n, ret n, ...). Ohne genau gesehen, was du getan hast, es ist schwer zu sagen, was das problem ist.
InformationsquelleAutor user1989292 | 2014-05-07
Schreibe einen Kommentar