2

私は宿題の課題を解決しようとしています-私はなんとかコードの実用的な部分を生成することができましたが、それは間違った答えを生成しています。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 
4

1 に答える 1

1

どこにでも渡す引数を削除しないfibため、スタックが不均衡になることに注意してください。動作中の修正バージョンを参照してください。

また、一般的な呼び出し規約は、で値を返しますeaxecx正当な理由なしに使用することは混乱を招きます。規則に準拠した簡略化されたバージョンを参照してください。

于 2012-11-18T22:02:25.950 に答える