모든 이항 계수를 반복적으로 계산하고 n = 10 인 모든 이항 계수를 인쇄하려면 몇 가지 코드 (주 : 어셈블리 x86의 서브 프로그램)를 작성했습니다 , 제한 m < = n.어셈블리 x86/C- 반복 이항 계수 Segfault/인쇄 파스칼 삼각형
그래서 기본적으로 n = 10에 대해 파스칼 삼각형을 출력하려고합니다. (삼각형의 전체 형식없이)
제 문제는 컴파일시 segfault가 발생하고 재귀 함수에 의해 생성 된 개별 값을 출력하는 방법을 알아 내려는 데 문제가 있다는 것입니다.
#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;
}
그리고 재귀 서브 프로그램 :
Segmentation fault (core dumped)
여기에 메인 프로그램 것은
.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 :'이면 네 줄이 있지만 그 다음에는 코드를 끝낼 수 없습니다. 'ret'가 누락 되었습니까? 마지막'call binom '이후에 CPU는 세미 임의의 데이터가 메모리에 남아있는 것을 계속해서 수행하고 segfault, hang 또는 일반적으로 잘못 작동합니다. 디버거에서 코드를 실행해야합니다. –
저의 이해는 binom이 호출 될 때 equal이 0 또는 oneoronedifference로 재귀됩니다. - 그걸 막으려면 거기에 ret를 추가 할거야. –
이것은 segfault를 수정하지 못했을 것입니다 - 어쩌면 그것은 다른 것을 고쳤습니다, 여러분이 언급 한 것을 막기 위해 마지막에 ret를해야한다고 확신합니다 –