私は現在、アセンブリ言語 (Motorola 68K Assembler) コースに登録しています。私は 30 までの数値のフィボナッチ数の結果を出力することを任されているプロジェクトを持っています。たとえば、ユーザーが 4 を入力した場合、結果は 3 になるはずです (前の 2 つの数値の合計であるため) )。しかし、私のメイン プログラム (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 でコメントアウトされているアルゴリズムは、私が使用する必要があるものです。ヘルプ/アドバイスをいただければ幸いです。