我有一个使用递归创建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时,不会停止。
感谢任何帮助。
答案 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