递归的斐波那契函数既是调用者又是被调用者(x86程序集)

时间:2016-05-29 06:24:30

标签: recursion assembly x86 calling-convention

我试图写一个递归函数,它返回斐波纳契数列中的第n个数字(1,1,2,3,5 ......)

我有点困惑,因为这个函数既是正常调用约定中的调用者又是被调用者,并且在此之上是递归的。到目前为止,我的代码输出了每种情况的输入(n)。

        push ebp
        mov ebp, esp
        push edx
        push ecx
        push eax
        push ebx
        push esi
        push edi

        //body
        mov ecx, [ebp + 8] // n parameter
        cmp ecx, 2
        jge Else
        mov eax, 1
        jmp Epilouge

    Else:
        //mov edx, ecx // save n
        dec ecx
        push ecx
        call fibonacci
        add esp, 4
        mov ebx, eax // move first returned result into ebx
        sub ecx, 2
        push ecx
        call fibonacci
        add esp, 4
        add eax, ebx // add the two returned values


    Epilouge:
        pop edi
        pop esi
        pop ebx
        pop eax
        pop ecx
        pop edx

        pop ebp

1 个答案:

答案 0 :(得分:2)

您的代码存在以下几个问题:

  1. 您正在序言和结语中保存并恢复eax
    由于eax用于返回函数值,因此有效地阻止了函数返回任何值。

  2. sub ecx, 2应为sub ecx, 1 否则你计算 f(n)= f(n - 1)+ f(n - 3)这不是Fibonacci函数,而first values类似于身份图。

  3. 使用jge代替jae(通过有效添加初始条件 f(k)= 1,,您已经被牙齿保存了∀ k <2 )否则 f(-1)将被视为 f(2 32 -1)

    最后我认为结语丢失了

    ret
    

    由于简单的复制粘贴错误。