0

セグメンテーション違反を返す asm (x86 / GAS) プログラムについて質問があります。フィボナッチについてです:アルゴリズムは大丈夫だと思います:(疑似コード)

fibo(int number){
    if (n < 2)
        return number;
    return fib(n - 1) + fib(n - 2);

エラーになる理由がわかりません。AC プログラムは 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)

segfault の場所を見つけるのを手伝ってくれませんか?

ありがとう !

PS: ここに ret があります:

quit:   movl    %ecx, %eax  #result in %ecx
        ret
4

2 に答える 2

3
  1. How to you return from your function?
  2. Do you expect your call to preserve the values in registers?

The answers will get you the solution.

于 2011-11-14T23:23:57.303 に答える
1

他の人が指摘しているように、あなたはあなたのret命令を示さない、それは重要である。また、addの中間結果をedxに保存します。それは機能しません-続く再帰呼び出しもそれを実行し、この呼び出しレベルで持っていた値を壊してしまいます。その中間値もスタックに保存する必要があります。

于 2011-11-15T01:14:08.847 に答える