我目前正在学习汇编语言(Motorola 68K Assembler)课程。我有一个项目,我的任务是打印最大为 30 的斐波那契数的结果。例如,如果用户输入 4,结果应该是 3(因为它是前两个数字的总和)。但是,我的主程序(prog4.s)连续打印出0。问题与递归方法的逻辑有关吗?问题出在其他地方吗?这是我的递归方法代码(fib.s)
* fib.s
* long fib(int n) {
* if(n==0) {
* return 0;
* }
* else if(n==1) {
* return 1;
* }
* return fib(n-1) + fib(n-2);
* }
ORG $7000
fib:
link A6,#0
movem.l D1-D2,-(SP)
move.w 8(A6),D1
TST.w D1
BNE next
BRA out
next:
cmpi.w #1,D1
BNE recurse
add.w #1,D0
BRA out
recurse:
move.w D1,D2
subq.w #1,D1
move.w D1,-(SP)
JSR fib
move.w D0,D1 * save copy of fib(n-1)
adda.l #2,SP
subq.w #2,D2
move.w D2,-(SP)
JSR fib
add.w D2,D1
add.w D1,D0 * return fib(n-1) + fib(n-2)
adda.l #2,SP
out:
movem.l (SP)+,D1-D2
unlk A6
rts
end
这是我调用 fib.s 的程序的代码
fib: EQU $7000
start: initIO
setEVT
lineout title
lineout prompt
linein buffer
cvta2 buffer,D1
* Place parameter on the stack and move the stack pointer
move.w D1,-(SP)
*Jump to the fib subroutine
JSR fib
*Pop starting parameter off the stack
adda.l #2,SP
cvt2a buffer,#6
stripp buffer,#6
lea buffer,A0
adda.l D0,A0
clr.b (A0)
lineout answer
break
prompt: dc.b 'Enter a number between 1 and 30: ',0
answer: dc.b 'The Fibonacci number is: '
buffer: ds.b 80
end
需要注意的一点:fib.s 中注释掉的算法是我需要使用的算法。任何帮助/建议将不胜感激。