【发布时间】:2016-11-19 08:00:18
【问题描述】:
我编写了一些代码(c 中的 main,x86 中的子程序)以递归方式计算所有二项式系数并打印出所有 n=10 且受 m
所以基本上我正在尝试输出 n=10 的帕斯卡三角形。 (没有三角形的完整格式)
我的问题是我在编译时遇到了段错误,我无法弄清楚如何打印递归函数生成的各个值。
Segmentation fault (core dumped)
这是主程序:
#include <stdio.h>
unsigned int result,m,n,i;
unsigned int binom(int,int);
int main(){
n=10;
for (i=0; i<n+1;i++){
printf("i=%d | %d \n", i, binom(n,i) );
}
return;
}
还有递归子程序:
.text
.globl binom
binom:
mov $0x00, %edx #for difference calculation
cmp %edi, %esi #m=n?
je equalorzero #jump to equalorzero for returning of value 1
cmp $0x00, %esi #m=0?
je equalorzero
cmp $0x01, %esi #m=1?
mov %esi,%edx
sub %edi, %edx
cmp $0x01, %edx # n-m = 1 ?
je oneoronedifference
jmp otherwise
equalorzero:
add $1, %eax #return 1
ret
oneoronedifference:
add %edi, %eax #return n
ret
otherwise:
sub $1, %edi #binom(n-1,m)
call binom
sub $1, %esi #binom(n-1,m-1)
call binom
这就是 gcc 给我的
./runtimes
i=0 | 12
Segmentation fault (core dumped)
【问题讨论】:
-
标签
otherwise:之后有 4 行,但没有什么可以结束代码。是否缺少ret?在最后一个call binom之后,CPU 将继续执行内存中的任何半随机数据,并且会出现段错误、挂起或通常行为不正确。您应该在调试器中运行您的代码。 -
我的理解是,当调用 binom 时,它会递归为 equalorzero 或 oneoronedifference,其中包含 ret。 - 我会在那里添加一个 ret 以阻止它这样做。
-
这并没有修复 segfault - 也许它修复了另一个,我确定我需要 ret 最后以防止你提到的内容
-
你应该试试 gdb...
-
@Egyptian_Coder 请花点时间阅读此评论。现在是您学习如何使用调试器的时候了。您目前在 SO 职业生涯中提出了 8 个问题,它们都是关于调试的。如果您在第一次使用 gdb 之后学会了使用 gdb,那么您现在已经精通了。您的代码有很多初学者错误(错误的寄存器使用、虚假指令、缺少条件),可以通过快速调试轻松修复,并且在您的所有问题中都是不变的。我投票结束这个问题,我希望今后能在你身边看到更成熟的行为。
标签: c recursion assembly segmentation-fault x86-64