asm程序中的递归

时间:2011-11-14 23:19:41

标签: assembly recursion x86 fibonacci gas

我有一个关于asm(x86 / GAS)程序返回分段错误的问题。 这是关于Fibonacci:我认为算法没问题:(伪代码)

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)

你能帮我找一下segfault的位置吗?

谢谢!

PS:这是ret:

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

2 个答案:

答案 0 :(得分:3)

  1. 如何从您的功能返回?
  2. 您希望call保留寄存器中的值吗?
  3. 答案将为您提供解决方案。

答案 1 :(得分:1)

正如其他人所指出的那样,你不会出示你的指令,这很重要。此外,您还可以在edx中保存add的中间结果。这不会起作用 - 接下来的递归调用也会这样做,并且会破坏你在这个调用级别所拥有的价值。您还需要将该中间值存储在堆栈中。

相关问题