現在、私はアセンブリ言語(Motorola 68K Assembler)コースに登録しています。私は、最大30のフィボナッチ数の結果を印刷するプロジェクトがあります。たとえば、ユーザーが4を入力すると、結果は3になります(これは前の2つの数値の合計であるためです) )。しかし、私のメインプログラム(prog4.s)は継続的に0を出力します。問題は再帰的メソッドのロジックと何か関係がありますか?問題は他の場所にあるのでしょうか? FIBにコメントアウトアルゴリズム:ここでは、再帰的な方法の私のコード(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
何かを呼び出すプログラムのための私のコードがあるです。私は使用する必要があります。どんな助けやアドバイスも大歓迎です。
デバッガでコードをシングルステップ実行しようとしましたか? 68kシミュレータにはデバッガが内蔵されていると仮定します。これは、asm開発に不可欠なツールであるためです。 –
マイナーコードの最適化では、 'n == 0'または' n == 1'をチェックするのではなく、 '(n <2)return n; 'とすることができます。 –
@FrankC、ただし、fib.sでコメントアウトされたアルゴリズムは、このプロジェクトで使用する必要があります。 –