递归Fibonacci IA32汇编

时间:2012-11-18 18:24:15

标签: assembly recursion x86 fibonacci

我试图解决一项家庭作业 - 我设法制作了一段可靠的代码,但却产生了错误的答案。我尝试使用gdb进行调试,但我仍然无法查看代码的错误。

.data
        a : .long 6                                                                                                                                                             
        r : .long 0
        out : .string "result %d\n"
.text
.global main                                                                                                                                                                    
fib:
        pushl %ebp
        movl %esp, %ebp
        movl 8(%ebp), %eax
        cmpl $0, %eax #fib(0)=0
        je endf
        cmpl $1, %eax #fib(1)=1
        je endf
        decl %eax #eax=n-1
        movl %eax, %edx #edx=n-1
        pushl %edx  #save n-1
        pushl %eax #set arg
        call fib #re in ecx                                                                                                                                                     
        popl %eax #get n-1
        decl %eax #eax=n-2
        pushl %ecx #save result for n-1                                                                                                                                         
        pushl %eax #set arg
        call fib #res in ecx                                                                                                                                                    
        popl %eax # eax=fib(n-1)                                                                                                                                                
        addl %eax, %ecx #fib(n)=fib(n-1)+fib(n+2)                                                                                                                               
        movl %ebp,%esp #Exit                                                                                                                                                    
        popl %ebp
        ret
endf:
        movl %eax, %ecx#fib(0) or fib(1) to %ebx                                                                                                                                
        movl %ebp,%esp                                                                                                                                                          
        popl %ebp
        ret

main:
        pushl a  #stack [a]                                                                                                                                                     
        call fib #result in %ecx                                                                                                                                                
        pushl %ecx                                                                                                                                                              
        pushl $out                                                                                                                                                              
        call printf 

1 个答案:

答案 0 :(得分:1)

请注意,您不会删除在任何地方传递给fib的任何参数,因此您的堆栈会变得不平衡。请参阅the fixed version in operation

此外,典型的调用约定返回eax中的值。没有充分理由使用ecx令人困惑。查看更符合惯例的simplified version