0

私は現在、アセンブリ言語 (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 でコメントアウトされているアルゴリズムは、私が使用する必要があるものです。ヘルプ/アドバイスをいただければ幸いです。

4

2 に答える 2

0

問題は呼び出し側プログラム prog4.s にあります。値を正しく読み取りましたが、間違ったレジスタをスタックに渡していました。マクロ linein は、2 の補数の整数を D1 ではなく D0 に格納します。D1 には、渡す前にゼロが含まれていたため、毎回ゼロが返されていました。呼び出し元プログラムの正しいコードは次のとおりです。

fib:    EQU             $7000
start:  initIO                  * Initialize (required for I/O)
        setEVT                  * Error handling routines
*       initF                   * For floating point macros only


lineout         title
lineout         prompt
linein          buffer
cvta2           buffer,D0


* Place parameters on the stack and move the stack pointer
move.w          D0,-(SP)


* Jump to the fib subroutine
JSR             fib


* Pop starting parameters off of the stack
adda.l          #2,SP


cvt2a           buffer,#6
stripp          buffer,#6
lea             buffer,A0
adda.l          D0,A0           * Sets A0 to the address of D0
clr.b           (A0)
lineout         answer


break                           * Terminate execution
*
*----------------------------------------------------------------------
*       Storage declarations


title:  dc.b    'Program #4, Christopher Moussa, cssc0702',0
prompt: dc.b    'Enter a number between 1 and 30: ',0
answer: dc.b    'The Fibonacci number is: '
buffer: ds.b    80
    end
于 2016-12-09T15:54:06.787 に答える