-1

My assignment is to write a program that calculates first seven values of fibonacci number sequence. the formula given is:

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

I believe that is a function but I do not understand how to incorporate it into code. I need to place the values in EAX register. I am using MASM not that makes any difference. Any hints?

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 开始,R f2应从 1 开始。

以下是我们为获得答案所做的工作,按例程划分:

开始

  1. 将 R f1初始化为 0。
  2. 将 R f2初始化为 1。
  3. 继续循环。

环形

  1. 从 R n中减去 2 。
  2. 如果 R n小于 0,则跳转到 Finish。
  3. 将 R f2与 R f1 相加,将结果存储在 R f1中。
  4. 将 R f1与 R f2 相加,将结果存储在 R f2中。
  5. 跳到循环。

结束

  1. 如果 R n AND 1 为假(暗示 R n是偶数)跳转到 FinishEven。
  2. 将R f1存储为返回值。
  3. 返回。

完成均匀

  1. 将R f2存储为返回值。
  2. 返回。

跟踪 R n = 5:

  1. R f1 = 0
  2. R f2 = 1
  3. R n = R n - 2 // R n = 3
  4. 测试 R n < 0 // 假
  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. 测试 R n < 0 // 假
  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. 测试 R n < 0 // 真
  15. 跳转到完成
  16. 测试 R n & 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 回答