Recursion IA86程序集中的重新创建函数计数-意外值

Recursion IA86程序集中的重新创建函数计数-意外值,recursion,assembly,x86,intel-syntax,Recursion,Assembly,X86,Intel Syntax,我已经编写了汇编程序,该程序应计算以下递归函数: 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

我已经编写了汇编程序,该程序应计算以下递归函数:

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。
现在它适用于基本条件。在我看来,堆栈溢出似乎有问题,但我看不出它在哪里。

您的
弹出ebx
没有相应的
推送,弄乱了堆栈。很可能还有其他错误,但这就是我突然发现的错误。

您的
弹出ebx
没有相应的
推送,弄乱了堆栈。很可能还有其他错误,但这正是我突然发现的错误。

如果0:mov eax,1
,处理器执行后,您希望处理器做什么?当ebx等于0或1时,将1移动到eax,eax是存储结果的寄存器。请再次阅读我的问题。一旦处理器执行
if0:mov eax,1
,您希望它做什么?对不起,我没听懂,我看到我的错误,我想停止执行程序。我知道我应该在这里添加
jmp end
。既然您更改了问题中的代码,它是否仍然失败?一旦处理器执行
if0:mov eax,1
,您希望处理器做什么?当ebx等于0或1时,将1移动到eax,eax是存储结果的寄存器。请再次阅读我的问题。一旦处理器执行
if0:mov eax,1
,您希望它做什么?对不起,我没听懂,我看到我的错误,我想停止执行程序。我知道我应该在这里添加
jmp end
。既然您更改了问题中的代码,它是否仍然失败?不幸的是,这根本不能解决问题,尽管看起来您是对的。不幸的是,这根本不能解决问题,尽管看起来您是对的。