-1

私の課題は、フィボナッチ数列の最初の 7 つの値を計算するプログラムを作成することです。与えられた式は次のとおりです。

Fib(1) = 1, Fib(2) = 1, Fib(n) = Fib(n-1) + Fib(n-2)

それは機能だと思いますが、コードに組み込む方法がわかりません。値を EAX レジスターに配置する必要があります。私はMASMを使用していますが、違いはありません。ヒントはありますか?

4

2 に答える 2

7

これは学術的な課題だと思うので、質問に部分的に答えるだけにします。

フィボナッチ数列は、非負の整数に対して次のように正式に定義されています。

F(n) = n                   | n < 2
     = F(n - 1) + F(n - 2) | n >= 2

これは与える:

  n | F(n)
  0 |   0
  1 |   1
  2 |   1
  3 |   2
  4 |   3
  5 |   5
  6 |   8
  7 |  13
etc etc...

いくつかのレジスタでそれを行うことができます。それらを識別しましょう。

  • R n(要求されたフィボナッチ数の数)
  • R f1(フィボナッチ数の計算に使用)
  • R f2(フィボナッチ数の計算にも使用されます)
  • R x(戻り値を保持するレジスタ。他のレジスタとオーバーラップできます)

R nは、関数の引数として渡されます。R f1は0から始まり、Rf2は1から始まります。

答えを得るために私たちが行うことは次のとおりです。ルーチンごとに分割します。

始める

  1. Rf1を0に初期化します。
  2. Rf2を1に初期化します。
  3. ループを続けます。

ループ

  1. Rnから2を引きます。
  2. R nが0未満の場合は、[完了]にジャンプします。
  3. Rf2Rf1に追加し、結果をRf1に格納します。
  4. Rf1Rf2に追加し、結果をRf2に格納します。
  5. ループにジャンプします。

終了

  1. R n AND 1がfalseの場合(R nが偶数であることを意味します)、FinishEvenにジャンプします。
  2. Rf1を戻り値として格納します。
  3. 戻る。

FinishEven

  1. Rf2を戻り値として格納します。
  2. 戻る。

R n = 5のトレーススルー:

  1. R f1 = 0
  2. R f2 = 1
  3. R n = R n -2 // R n = 3
  4. テストRn <0 // false
  5. R f1 = R f1 + R f2 // R f1 = 0 + 1 = 1
  6. R f2 = R f1 + R f2 // R f2 = 1 + 1 = 2
  7. ループへの無条件ジャンプ
  8. R n = R n -2 // R n = 1
  9. テストRn <0 // false
  10. R f1 = R f1 + R f2 // R f1 = 1 + 2 = 3
  11. R f2 = R f1 + R f2 // R f2 = 3 + 2 = 5
  12. ループへの無条件ジャンプ
  13. R n = R n -2 // R n = -1
  14. テストRn <0 // true
  15. ジャンプして終了
  16. テストRn&1//真
  17. R x = R f2 // 5

この表は、F(5)= 5であることを示しているので、これは正しいです。

于 2012-10-12T20:10:42.407 に答える
1
TITLE  Chapter 4 Exercise 6                (ch04_06.asm)

Comment !
Description: Write a program that uses a loop to calculate the first
seven values in the Fibonacci number sequence { 1,1,2,3,5,8,13 }.
Place each value in the EAX register and display it with a
call DumpRegs statement inside the loop.

Last update: 05/02/2002
!
INCLUDE Irvine32.inc

.code
main PROC
    mov   eax,1
    call  DumpRegs
    mov   ebx,0 ; initial setup
    mov   edx,1
    mov   ecx,6 ; count
L1:
    mov  eax,ebx    ; eax = ebx + edx
    add  eax,edx
    call DumpRegs   ; display eax
    mov  ebx,edx
    mov  edx,eax
    Loop L1

    exit
main ENDP
END main
于 2016-03-26T12:36:04.823 に答える