【发布时间】:2015-05-10 11:50:25
【问题描述】:
我有两个文件:f1.S 用汇编语言编写的斐波那契函数(计算斐波那契数列的第 n 个成员)在哪里,以及调用斐波那契函数的 f2.c。
以下是这些文件: f1.S
.global fibonacci
fibonacci:
push %rbp
movq %rsp, %rbp
push %rax
movq 16(%rbp), %rax
cmp $0, %rax
je zeroValue
cmp $1, %rax
je oneValue
jmp more
zeroValue:
addq $0, %r8
jmp end
oneValue:
addq $1, %r8
jmp end
more:
movq 16(%rbp), %rax
dec %rax
pushq %rax
call fibonacci
movq 16(%rbp), %rax
dec %rax
dec %rax
pushq %rax
call fibonacci
end:
mov %rbp, %rsp
pop %rbp
ret
f2.c
#include <stdio.h>
extern int fibonacci (int);
int main ()
{
int n = 6;
int res;
res = fibonacci(n);
printf ("N-th member of Fibonacci sequence is: %d", res);
return 0;
}
为了编译和链接,我正在执行以下命令:
as f1.S -o f1.o
gcc f2.c -c -o f2.o
gcc f2.o f1.o -o program
在我尝试运行我的 exe 文件(程序)之前一切正常。我无法运行它,因为我收到消息:分段错误。我究竟做错了什么? 斐波那契函数肯定没问题,因为我在干净的汇编器中使用它,然后它就起作用了。
【问题讨论】:
-
文件在哪里?
-
如果发生崩溃,请在调试器中运行以尝试定位 崩溃的位置。
-
抱歉,这是我在这里的第一条消息,我不小心发送了它...现在已编辑,我添加了代码。当我试图在 gdb 中运行它时,我得到了:
Program received signal SIGSEGV, Segmentation fault. 0x000000000040056f in more () -
看来你应该对齐堆栈。在线阅读以了解更多信息。
-
学习使用调试器。另外,注释您的代码,特别是如果您希望其他人提供帮助。也就是说,我可以看到你丢弃了第一次递归调用的结果,错误可能是由于错误的终止条件导致的堆栈溢出。调试器中的单步操作。
标签: c assembly linker segmentation-fault