我试图写一个递归函数,它返回斐波纳契数列中的第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
答案 0 :(得分:2)
您的代码存在以下几个问题:
您正在序言和结语中保存并恢复eax
。
由于eax
用于返回函数值,因此有效地阻止了函数返回任何值。
sub ecx, 2
应为sub ecx, 1
否则你计算 f(n)= f(n - 1)+ f(n - 3)这不是Fibonacci函数,而first values类似于身份图。
使用jge
代替jae
(通过有效添加初始条件 f(k)= 1,,您已经被牙齿保存了∀ k <2 )否则 f(-1)将被视为 f(2 32 -1)。
最后我认为结语丢失了
ret
由于简单的复制粘贴错误。