既是调用者又是被调用者的递归斐波那契函数(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
您的代码有几个问题:
您正在保存和恢复 eax
在序言和结语中。
由于 eax
用于 return 函数值,这有效地防止您的函数 returning 任何值。
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
由于简单的复制粘贴错误。
我正在尝试编写一个递归函数,它 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
您的代码有几个问题:
您正在保存和恢复
eax
在序言和结语中。
由于eax
用于 return 函数值,这有效地防止您的函数 returning 任何值。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
由于简单的复制粘贴错误。