递归Fibonacci函数

时间:2017-03-28 17:50:35

标签: assembly fibonacci x86-16 emu8086

我有一个使用递归创建Fibonacci套件的任务。下面的代码在某些情况下有效,但不是全部。

org 100h
 jmp debut 
val dw 0008h 
debut: 
  push word ptr 0000h 
  push word ptr 0001h 
  call fibo
  Add  sp,04
  hlt 
fibo proc near
  Sub  sp,04
  mov  dx,[sp+6] 
  mov  [sp+02],dx
  add  dx,[sp+8]
  mov  [sp],dx
  cmp  dx,val
  jae  Fin 
  Call Fibo
Fin: 
  ret 04
endp fibo

但问题是当我尝试输入一个像0或1这样的数字或负数如-0003h时,不会停止。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

主要问题是使用jae fin,这是无符号比较的条件分支。我将其更改为使用jge fin,这是签名比较的条件分支。

以下代码已修改为可与Microsoft Masm配合使用。我不确定在实模式下使用sp作为索引寄存器,所以我使用了bp。我更改了两次推送,以便第一次通过fibo,dx最终为零。

我不认为这就是作业的意图。通常输入是n,而fibo应该在ax中返回nth斐波纳契数(对于n = {0,1,2,3,4,...}返回{0,1 ,1,2,3,...})。这将要求fibo根据fib(n)= fib(n-1)+ fib(n-2)自我调用两次。

        .286
        .model  tiny,c
        .code
        org     0100h

main    proc    far
        jmp     short debut 
val     dw      00008h
debut:
;       note - push immediate requires 80186 or later cpu 
        push    word ptr 0ffffh ;fib(-2) == -1
        push    word ptr 00001h ;fib(-1) ==  1
        call    fibo
        add     sp,4
        hlt
main    endp

fibo    proc    near
        push    bp              ;real mode doesn't allow [sp...]
        mov     bp,sp           ; using [bp...] instead
        sub     sp,4
        mov     dx,[bp+4] 
        mov     [bp-2],dx
        add     dx,[bp+6]
        mov     [bp-4],dx
        cmp     dx,val
        jge     fin             ;changed this line
        call    fibo
fin:    add     sp,4            ;added this line
        pop     bp              ;added this line
        ret     0               ;changed this line
fibo    endp

        end     main

答案 1 :(得分:0)

感谢@rcgldr为您回复,我试图创建一个新代码并且更简单,但我需要更改此说明

xchg dx,[bp+4] 
    xchg dx,[bp+6]

使用另一个像mov这样的指令,有新程序

    ORG 100H

jmp debut 

val dw 0005h 
F dw ? 

debut: mov al,1 
mov cx,val    
cmp cx,0000h
je stopp
cmp cx,0001h
je stopp 
push cx 
push 0000h 
push 0001h 
call fibo 
saut: add sp,4 
pop F 
stopp:
hlt 


fibo proc 
push bp 
mov bp,sp 
push dx 
mov cx,[bp+8] 
mov dx,[bp+4] 
add dx,[bp+6] 
inc al 
cmp cl,al 
je fin 
xchg dx,[bp+4] 
xchg dx,[bp+6] 
add sp,6 
call fibo 
jmp saut 

fin: mov [bp+8],dl 
pop dx 
pop bp 
ret 
endp fibo