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

Recursive fibonacci function that is both the caller and callee (x86 assembly)

我正在尝试编写一个递归函数,它 returns 斐波那契数列中的第 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. 您正在保存和恢复 eax 在序言和结语中。
    由于 eax 用于 return 函数值,这有效地防止您的函数 returning 任何值。

  2. sub ecx, 2 应该是 sub ecx, 1.
    否则你计算 f(n) = f(n - 1) + f(n - 3) 这不是斐波那契函数并且 first values 类似于恒等映射。

jge代替jae(有效地添加了初始条件f(k) = 1, k < 2) 否则 f(-1) 将被视为 f(232-1)

最后我假设尾声不见了

ret

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