我编写了汇编程序,它应该计算下面的递归函数:
f(n) = f(n-1) + 2*f(n-2) - f(n-3)
对于n = 0且n = 1,它返回1,对于n = 2,它应返回0。 但是对于这个值程序总是返回0,看起来似乎从未满足以下条件。
if0:
mov eax,1
jmp end
if1:
mov eax,1
jmp end
if2:
mov eax,0
jmp end
对于任何其他值(大于2),我会重新获得分段值。 以下是整个代码:
.intel_syntax noprefix
.globl main
.text
main:
mov eax, 3
push eax
call f
push eax
push offset msg
call printf
add esp, 8
mov eax, 0
ret
f:
push ebp
mov ebp,esp
add ebp,12
mov ebx,[ebp]
cmp ebx, 0
jz if0
cmp ebx, 1
jz if1
cmp ebx, 2
jz if2
lea ecx, [ebx-1]
push ecx
call f
pop ecx
push eax
lea ecx,[2*ebx-2]
push ecx
call f
pop ecx
pop eax
add eax,ecx
push eax
lea ecx, [ebx-3]
push ecx
call f
pop ecx
pop eax
sub eax,ecx
jmp end
if0:
mov eax,1
jmp end
if1:
mov eax,1
jmp end
if2:
mov eax,0
jmp end
end:
pop ebx
pop ebp
ret
msg: .asciz "Output = %d\n"
我不知道自己做错了什么。 编辑:所以,我已经尝试了ebp,我已经改变了 添加ebp,8 至: 添加ebp,16。 而且,现在它适用于基本条件。在我看来,堆栈溢出有问题,但我不认为它在哪里。
答案 0 :(得分:2)
您的pop ebx
没有相应的push
,弄乱了您的筹码。可能还有其他错误,但这就是那个跳出来的错误。