GDB를 통해 실행하려고 시도하고 C 메인 프로그램이 주 기능으로 들어가면 분할 오류가 계속 발생합니다.C/어셈블리 서브 프로그램 세그먼트 화 오류
GDB 오류 :
Breakpoint 1, main() at binom_main.c:7
7 n=10;
(gdb) s
10 0;
(gdb) s
12 +){
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005c4 in otherwise()
(gdb)
I는 다음과 같은 코드를 컴파일 :
as binom.s -o binom.o
gcc -S -Og binom_main.c
gcc -c binom_main.s
gcc binom_main.o binom.o -o runtimes
가 좀 더 효율적으로 여기 GDB를 사용하는 방법을 배우려고 노력하고있어하지만 이런 세그먼테이션 폴트 (segfault)이 매우 모호하고 제한 . 기능이 시작되는 순간이 segfault가 왜 발생합니까? 두 파일을 잘못 연결 했습니까?
홈페이지 :
#include <stdio.h>
unsigned int result,m,n,i;
unsigned int binom(int,int);
int main(){
n=10;
i=0;
for (i=1; i<2;i++){
result = binom(n,i);
printf("i=%d | %d \n", i, result);
}
return 0;
}
하위 : 디버그 ASM에 GDB를 사용할 때
.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
call printf
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
ret
실행 한 명령이 모두 있습니까? 두 개의'.o' 파일이 어디에 링크되어 있는지 나는 알 수 없습니다. 'gcc -o binom binom_main.o binom.o'와 같은 것을 할 필요가 있습니다. – kaylum
두 번째보기에서 스택 오버플로 (하하)의 교과서 같은 소리가납니다. 당신이'otherwise()'에서 오류를 얻었음에 유의하여'main'을 입력하는 것이 옳지 않습니다. 추신 : 당신도'printf' 잘못 사용, 또는 기여 요인이되지 않을 수도 있습니다. – Jester
@kaylum 네! 나는 그것을 OP에 포함하는 것을 잊었다. 나는 그것을 편집했다. 미안합니다. –