X86斐波那契计划

时间:2012-10-12 19:42:04

标签: assembly x86 masm

我的任务是编写一个程序来计算斐波那契数列的前七个值。给出的公式是:

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

我认为这是一个功能,但我不明白如何将其合并到代码中。我需要将值放在EAX寄存器中。我使用MASM并没有任何区别。任何提示?

2 个答案:

答案 0 :(得分:6)

我怀疑这是一项学术任务,所以我只会部分回答这个问题。

斐波那契序列正式定义为非负整数,如下所示:

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. 继续循环。
  4. <强>循环

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

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

        1. 将R f2 存储为返回值。
        2. 返回。
        3. 追踪R n = 5:

          1. R f1 = 0
          2. R f2 = 1
          3. R n = R n - 2 // R n = 3
          4. 测试R n &lt; 0 //假
          5. R f1 = R f1 + R f2 // R f1 = 0 + 1 = 1 < / LI>
          6. R f2 = R f1 + R f2 // R f2 = 1 + 1 = 2 < / LI>
          7. 无条件跳转到循环
          8. R n = R n - 2 // R n = 1
          9. 测试R n &lt; 0 //假
          10. R f1 = R f1 + R f2 // R f1 = 1 + 2 = 3 < / LI>
          11. R f2 = R f1 + R f2 // R f2 = 3 + 2 = 5 < / LI>
          12. 无条件跳转到循环
          13. R n = R n - 2 // R n = -1
          14. 测试R n &lt; 0 // true
          15. 跳转到完成
          16. 测试R n &amp; 1 // true
          17. R x = R f2 // 5
          18. 我们的表显示F(5)= 5,所以这是正确的。

答案 1 :(得分: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