我正在使用At-t语法气体文件在Ubuntu x86-32bit上的GCC中编译程序。我在main.c文件中定义了要在汇编文件子例程中调用的函数。程序对我的c定义的函数进行调用时出现段错误,但会调用malloc fine。
我已经宣布
.extern num_combs
在我的.s文件中声明状态num_combs()在我的main.c文件中定义。
在main.c
int combs = 1;
int i;
for(i = n; i > max(k, n-k); i--){
combs *= i;
}
for(i = 2; i <= min(k, n - k); i++){
combs /= i;
}
return combs;
}
尝试在例程get_combs中调用num_combs
.globl get_combs
.extern num_combs
.equ ws, 4
.text
get_combs:
get_combs_prologue:
push %ebp
movl %esp, %ebp # make stackframe
subl $4*ws, %esp # make room for locals
.equ len, 4*ws
.equ k, 3*ws
.equ items, 2*ws
.equ tempArray, -1*ws
.equ num_combs, -2*ws
.equ matrix, -3*ws
.equ row, -4*ws
get_combs_body:
# int* tempArray = malloc(k*sizeof(int));
movl k(%ebp), %esi
imul $4, %esi
push %esi
call malloc
addl $1*ws, %esp
movl %eax, tempArray(%ebp)
# int numCombs = num_combs(len, k);
push k(%ebp)
push len(%ebp)
call num_combs
addl $2*ws, %esp
movl %eax, num_combs(%ebp)
这是一项家庭作业,必须使用以下make文件进行编译
combs.out: combs.o main.o
gcc -g -Wall -m32 -o combs.out combs.o main.o
main.o: main.c combs.h
gcc -g -Wall -m32 -c -o main.o main.c
combs.o: combs.s
gcc -g -Wall -m32 -c -o combs.o combs.s
clean:
rm *.o *.out
当程序调用外部函数num_combs()时,发生分段错误。
我相信这是由于num_combs尝试接收其参数的方式,还是gcc将文件链接在一起的方式所致。