2017-03-28 1 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 

하지만 -0003h 같은 0 또는 1 또는 음수처럼 발에 숫자를 넣어하려고 할 때 문제가, 멈추지 않을 것입니다.

감사합니다. 감사드립니다.

+0

죄송합니다. 영어가 유창합니다 ^^ –

답변

1

부호없는 비교의 조건부 분기 인 jae fin이 주된 문제였습니다. 나는 부호가있는 비교를위한 조건부 분기 인 jge fin을 사용하도록 변경했습니다.

아래 코드는 Microsoft Masm에서 작동하도록 수정되었습니다. 나는 실제 모드에서 인덱스 레지스터로 sp를 사용하는 것에 대해 확신하지 못하기 때문에 bp를 사용했습니다. 나는 fibo를 처음으로 두 번 눌러서 dx가 0이되도록 두 푸시를 변경했습니다.

할당이 의도 한 것 같지 않습니다. 일반적으로 입력은 n이고 fibo는 nth 피보나치 수를 ax (n = {0,1,2,3,4, ...}의 경우)로 반환하도록되어 있습니다. {0,1,1,2,3,. ..}). fibo는 fib (n) = fib (n-1) + fib (n-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