(1) 使用intel语法的GCC内联汇编打印字符串
建立一个源文件,叫​​​source.c​​​,编辑内容如下,定义一个char数组,然后在屏幕上显示出来,下面的代码gcc之后,会在屏幕上打印出​​abc​

int main(int a,char arg[]){
char arr[]="abc\n";
__asm__(
"mov rax,1;"
"mov rdi,1;"
"syscall;"
:
:"S"(arr),"d"(4);注意此处大写S小写d
);
}
//使用intel汇编翻译,会生成一个a.out的文件
//-masm=intel表示使用英特尔的汇编指令集
gcc source.c -masm=intel
//执行a.out程序
./a.out

(2) 修改上述代码,并编译成目标文件
目标文件:接下来我们让​​​source.c​​中只有一个打印的功能函数,由于没有main函数,所以这种文件只能使用-c命令将其编译成目标文件,代码如下

void printf(char * arr,int lenth){
__asm__(
"mov rax,1;"
"mov rdi,1;"
"syscall;"
:
:"S"(arr),"d"(lenth)
);
}

使用如下命令编译

// 下面命令执行完毕会生成一个叫做source.o的文件
gcc -c source.c -masm=intel

接下来新建一个main.c文件,写一个main函数,在main函数中调用printff函数

void printff(char *,unsigned int len);

int main(){
char arr[] ="hello world!";
printff(arr,12);
}

使用如下命令编译

// 下面命令执行完毕会生成一个叫做main.o的文件
// 因为main.c使用了printf函数,而main.c并不知道printf函数在哪里
// 所以该文件也需要编译成链接文件才行
gcc -c main.c

(3) 此时,有main.o和source.o两个目标文件了,执行下面的命令将这两个文件链接起来(合并起来)

// 下面的命令执行完毕会生成一个叫做a.out的文件
gcc source.o main.o

运行a.out

// 下面的命令执行完毕会打印出hellow world!(没换行)
./a.out

上面的步骤有些繁琐,但是能很好的说明什么是目标文件和链接文件,下面的代码可以一步完成

// 下面的命令执行完毕会生成一个叫做a.out的文件
gcc main.c source.c -masm=intel

下一篇:​​库的创建​