Попытка реализовать эту рекурсивную последовательность Фибоначчи дает неверные результаты - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь реализовать последовательность Фибоначчи в сборке с помощью рекурсии. Я впервые пытаюсь реализовать рекурсию в сборке x86.

Код компилируется нормально, но выдает неправильные результаты. Выход для 1 равен 1, выход для 2 равен 0, выход для 3 равен 1, выход для 4 равен 2, выход для 5 равен 3.

Правильно выводится только при подключении 5.

Что-то не так с алгоритмом?

.DATA
  n1 DWORD ?

  prompt1 BYTE "Please enter the first value", 0

  prompt3 BYTE "No negative numbers!",0
  string BYTE 40 DUP (?)
  resultLbl BYTE "The Fib is: ", 0
  fib BYTE 40 DUP (?), 0

  .CODE
  _MainProc PROC

    input prompt1, string, 40
    atod string
    test eax, eax 
    js signed 
    mov n1, eax

    jmp procName
    signed:
    output prompt3, string
    jmp end1

   procName:
     mov eax, n1
     push n1
     call fib1
     add esp,4


      dtoa fib, eax
      output resultLbl, fib
      end1:
       mov eax, 0
       ret

  _MainProc ENDP

  Fib1 proc
    PUSH EBP          ; save previous frame pointer
    MOV  EBP, ESP     ; set current frame pointer

    MOV  EAX, [EBP+8] ; get argument N
    CMP  EAX, 1       ; N<=1?
    JA   Recurse      ; no, compute it recursively
    MOV  ECX, 1       ; yes, Fib(1)--> 1
    JMP  exit

    Recurse:
     DEC  EAX          ; = N-1
     MOV  EDX, EAX     ; = N-1
     PUSH EDX          ; save N-1
     PUSH EAX          ; set argument = N-1
     CALL Fib1   ; compute Fib(N-1) to ECX
     POP  EAX          ; pop N-1
     DEC  EAX          ; = N-2
     PUSH ECX          ; save Fib(N-1)
     PUSH EAX          ; set argument = N-2
     CALL Fib1    ; compute Fib(N-2) to ECX
     POP  EAX          ; = Fib(N-1)
     ADD  ECX, EAX     ; = Fib(N-1)+FIB(N-2)
     exit:
      MOV  ESP,EBP      ; reset stack to value at function entry 
      POP  EBP          ; restore caller's frame pointer
      RET 
Fib1 endp

END             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...