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)

你能帮我找出段错误在哪里吗?

谢谢 !

PS:这里是 ret :

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

2 回答 2

3
  1. 你如何从你的函数中返回?
  2. 您是否希望您call保留寄存器中的值?

答案将为您提供解决方案。

于 2011-11-14T23:23:57.303 回答
1

正如其他人指出的那样,您没有显示 ret 指令,这很重要。此外,您将 add 的中间结果保存在 edx 中。那是行不通的——接下来的递归调用也会这样做,并且会破坏你在这个调用级别上的值。您还需要将该中间值存储在堆栈中。

于 2011-11-15T01:14:08.847 回答