X86斐波那契计划

use*_*117 -2 x86 assembly masm

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

Fib(1) = 1, Fib(2) = 1, Fib(n) = Fib(n-1) + Fib(n-2)
Run Code Online (Sandbox Code Playgroud)

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

Wug*_*Wug 7

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

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

F(n) = n                   | n < 2
     = F(n - 1) + F(n - 2) | n >= 2
Run Code Online (Sandbox Code Playgroud)

这给出了:

  n | F(n)
  0 |   0
  1 |   1
  2 |   1
  3 |   2
  4 |   3
  5 |   5
  6 |   8
  7 |  13
etc etc...
Run Code Online (Sandbox Code Playgroud)

你可以用几个寄存器来做,让我们识别它们:

  • 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. 返回.

FinishEven

  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,所以这是正确的.