尝试在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
答案 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;
}