Assembly X86斐波那契程序

Assembly X86斐波那契程序,assembly,x86,masm,Assembly,X86,Masm,我的任务是写一个程序来计算斐波那契数列的前七个值。给出的公式为: Fib(1) = 1, Fib(2) = 1, Fib(n) = Fib(n-1) + Fib(n-2) 我相信这是一个函数,但我不知道如何将它合并到代码中。我需要将这些值放在EAX寄存器中。我用的是MASM,这没什么区别。有什么提示吗?我怀疑这是一项学术作业,所以我只想部分回答这个问题 斐波那契序列正式定义为非负整数,如下所示: F(n) = n | n < 2 = F(n

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

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

我相信这是一个函数,但我不知道如何将它合并到代码中。我需要将这些值放在EAX寄存器中。我用的是MASM,这没什么区别。有什么提示吗?

我怀疑这是一项学术作业,所以我只想部分回答这个问题

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

F(n) = n                   | n < 2
     = F(n - 1) + F(n - 2) | n >= 2
您只需使用几个寄存器即可完成此操作,让我们来确定它们:

  • Rn(请求的斐波那契数)
  • Rf1(用于计算斐波那契数)
  • Rf2(也用于计算斐波那契数)
  • Rx(保存返回值的寄存器。可与任何其他寄存器重叠)
Rn作为参数传递给函数。Rf1应从0开始,Rf2应从1开始

下面是我们如何得到答案的步骤,按常规进行划分:

开始

  • 将Rf1初始化为0
  • 将Rf2初始化为1
  • 继续循环
  • 循环

  • 从Rn中减去2
  • 如果Rn小于0,则跳转到Finish
  • 将Rf2添加到Rf1,并将结果存储在Rf1中
  • 将Rf1添加到Rf2,并将结果存储在Rf2中
  • 跳转到循环
  • 完成

  • 如果Rn和1为false(表示Rn为偶数),则跳到FinishEven
  • 将Rf1存储为返回值
  • 返回
  • 完成甚至

  • 将Rf2存储为返回值
  • 返回
  • 对于Rn=5,跟踪到:

  • Rf1=0
  • Rf2=1
  • Rn=Rn-2//Rn=3
  • 测试Rn<0//false
  • Rf1=Rf1+Rf2//Rf1=0+1=1
  • Rf2=Rf1+Rf2//Rf2=1+1=2
  • 无条件跳转到循环
  • Rn=Rn-2//Rn=1
  • 测试Rn<0//false
  • Rf1=Rf1+Rf2//Rf1=1+2=3
  • Rf2=Rf1+Rf2//Rf2=3+2=5
  • 无条件跳转到循环
  • Rn=Rn-2//Rn=-1
  • 测试Rn<0//true
  • 跳到终点
  • 测试Rn&1//true
  • Rx=Rf2//5

  • 我们的表格显示F(5)=5,这是正确的。

    这可能是一个家庭作业,所以我会这样对待它。从1开始的第7个斐波那契数是13,所以只要
    mov eax,13
    就完成了。或者你没有给出完整的要求。我写了一篇文章,包括一个由两个版本展开的版本,处理奇偶输入的开销最小,以及一个使用SSE向量的版本,这样它可以在32位CPU上进行64位数学运算。请参阅该问题的另一个答案,了解一些有趣的斐波那契数学(例如,在O(log(N))时间内计算Fib(N)的函数)。谢谢,有用,但仍不符合我的水平。也许你可以用外行的话修改一下公式?
    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
    
    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