尝试实现此递归斐波那契序列会产生错误的输出

时间:2018-11-05 04:43:18

标签: recursion assembly x86

我正在尝试通过递归在汇编中实现斐波那契数列。这是我第一次尝试在x86 Assembly中实现递归。

代码可以正常编译,但是输出错误。输出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             

0 个答案:

没有答案