我试图解决一项家庭作业 - 我设法制作了一段可靠的代码,但却产生了错误的答案。我尝试使用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
答案 0 :(得分:1)
请注意,您不会删除在任何地方传递给fib
的任何参数,因此您的堆栈会变得不平衡。请参阅the fixed version in operation。
此外,典型的调用约定返回eax
中的值。没有充分理由使用ecx
令人困惑。查看更符合惯例的simplified version。