如何在gcc中编译的gnu asm-32 x86子例程中调用用户定义的c函数

时间:2019-05-26 02:13:04

标签: c gcc assembly

我正在使用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将文件链接在一起的方式所致。

0 个答案:

没有答案