2017-03-28 20 views
0

再帰を使用してフィボナッチスイートを作成する割り当てがあります。以下のコードはいくつかのケースでは動作しますが、すべてではありません。再帰フィボナッチ関数

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 

が、問題は、私はVALに-0003hのような0または1または負の数のような数を置くしようとすると、停止しませんです。

ご協力いただきありがとうございます。

+0

私の悪い英語のために申し訳ありません^^ –

答えて

1

主な問題は、jae finを使用していました。これは、符号なし比較の条件分岐です。これを符号付き比較の条件分岐であるjge finを使用するように変更しました。

以下のコードは、Microsoft Masmで動作するように変更されています。私は実際のモードでインデックスレジスタとしてspを使用するのか分からないので、私はbpを使用しました。私はfiboを最初に通過するように2回のプッシュを変更しました.dxはゼロに終わります。

これは割り当てが意図したものではないと思います。通常、入力はnであり、fiboはnthフィオナッチ数をax(n = {0,1,2,3,4、...}の場合、return {0,1,1,2,3 ,. ..})。これは、fib(n)= fib(n-1)+ fib(n-2)に基づいて、fibo自身を2回呼び出す必要があります。あなたは返信用@rcgldr

 .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 
0

おかげで、私は新しいコード、よりシンプルを作成しようとしましたが、私は例えば、MOVなどの別の指示にこの指示

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

を変更する必要があり、新しいプログラム

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