私は、セグメント化エラーを返すasm(x86/GAS)プログラムに関する質問があります。 それはフィボナッチについてです:私はalgorithはOKだと思い:(擬似コード)asmプログラムでの再帰
fibo(int number){
if (n < 2)
return number;
return fib(n - 1) + fib(n - 2);
にエラーが発生した理由を私は理解していません。 Cプログラムがasm関数を呼び出します。ここで
はコードです:
fibo:
movl 4(%esp), %ebx #argument n in %ebx
cmpl $2, %ebx # test: is n < 2 ?
jnl recur # no, recursion
jmp quit # yes : quit
recur:
movl %ebx, %eax # get value of argument n
subl $1, %eax # n-1
pushl %eax # push n-1
call fibo # recursive call : fib(n-1)
movl %eax, %edx # save result in %edx
movl %ebx, %eax # get value of argument n
subl $2, %eax # n-2
pushl %eax # push n-2
call fibo # recursive call : fib(-2)
addl %edx, %eax # add fib(n-1) + fib(n-2)
あなたはどこセグメンテーションフォールトさを見つけるために私を助けることができますか?
ありがとうございました!
PS:ここにRETです:
quit: movl %ecx, %eax #result in %ecx
ret
このコードは書き留めましたが、デバッガで問題を突き止めることができません。 –
関数のスタックフレームを正しく設定していないようです - どこでも調整された 'ebp'は表示されません... –
ひどく、それを引き起こした入力は何ですか?その特定の再帰的実装はスタック上で非常に困難になるでしょう。 –