从C编译错误gcc调用程序集

时间:2017-05-05 03:49:30

标签: c gcc assembly

尝试在C中运行程序集,但不能使用gcc

进行编译

的main.c

#include <stdio.h>
#include "assem.s"
void extern testing(int * a);

int main(){
    int b = 8;
    int * a = &b;
    testing(a);
    printf("%d",*a);

}

assem.s

.globl testing

testing:
    ret 

GCC

gcc main.c assem.s -o test.exe

错误

expected identifier or '(' before '.' token .globl testing

2 个答案:

答案 0 :(得分:2)

执行#include "assem.s"时,它会获取文件assem.s的内容,并在此时将其放入 C 。结果会让编译器尝试编译它:

#include <stdio.h>
.globl testing

testing:
    ret 

void extern testing(int * a);

int main(){
    int b = 8;
    int * a = &b;
    testing(a);
    printf("%d",*a);

}

当然,这不是你想要的。编译器尝试编译行.globl testing并失败,因为它不是正确的 C 语法并导致您得到的错误。您所要做的就是删除#include "assem.s"

assem.s将被汇编,然后使用命令gcc main.c assem.s -o test.exe链接到可执行文件中。除了不会生成中间对象文件之外,这一个 GCC 命令等效于以下内容:

gcc -c main.c -o main.o
gcc -c assem.s -o assem.o
gcc main.o assem.o -o test.exe

您以与.s文件相同的方式汇编/编译.S.c个文件。 .s.S文件不应与 C #include指令一起使用。一些新的 GCC 用户之间存在一种误解,认为它们应该包含在内,而不是单独组装/链接。

答案 1 :(得分:-1)

您应该像这样更改main.c。然后他们就可以工作了。

#include <stdio.h>
//#include "assem.s"
void extern testing(int * a);

int main(){
    int b = 8;
        int * a = &b;
    testing(a);
    printf("%d",*a);

    return 0;
}