我有一个关于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
答案 0 :(得分:3)
call
保留寄存器中的值吗?答案将为您提供解决方案。
答案 1 :(得分:1)
正如其他人所指出的那样,你不会出示你的指令,这很重要。此外,您还可以在edx中保存add的中间结果。这不会起作用 - 接下来的递归调用也会这样做,并且会破坏你在这个调用级别所拥有的价值。您还需要将该中间值存储在堆栈中。