GCC
命令gcc指的就是GCC C编译器 gcc命令调用了一整套的程序,将源代码转化成可执行代码。
-
C预处理器:扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏
-
编译器:转汇编代码
-
汇编器:将汇编代码转成二进制目标代码文件(目标代码是机器代码的一种形式,包含了所有指令的二进制表示,但还没有填入全局值的地址)
-
链接器:将目标代码文件与实现库函数(如printf)的代码合并,并产生最终的可执行代码文件
示例
-
mstore.c示例
// mstore.c
long mult2(long, long);void multstore(long x, long y, long *dest)
{
long t = mult2(x, y);
*dest = t;
}
通过objump可以查看机器代码文件内容(反汇编器),而反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,它并不需要访问该程序的源代码或汇编代码,如下所示:

而设计指令格式的方式是,从某个给定位置开始,可以将字节唯一地解码成机器指令。比如,只有指令 push %rbx是以字节53开始的
-
main.c示例 生成实际可执行的代码需要对一组目标代码文件运行链接器,而这一组目标代码文件中必须含有一个main函数
#include<stdio.h>
void multstore(long, long, long *);
int main()
{
long d;
multstore(2, 3, &d);
printf("2 * 3 == %ld\n", d);
return 0;
}long mult2(long a, long b)
{
long s = a * b;
return s;
}
接下来我们就可以生成可执行文件了

我们依旧可以用objdump反汇编prog文件

我们可以看到这段和之前几乎完全一样。主要区别是call的调用地址不同
c程序与汇编的结合
因为有一些机器特性是C程序访问不到的,我们有两种方法去解决这个问题:
-
编写完整的函数,放进一个独立的汇编代码文件中,让汇编器和链接器把它和C代码合并起来
-
用GCC的内联汇编特性,用asm伪指令可以在C程序中包含简短的汇编代码
有兴趣请关注我吧,一起学习进步:
https://mp.weixin.qq.com/s/9FkDwOZWwk19Gp59uJ779Q
https://mp.weixin.qq.com/s/9FkDwOZWwk19Gp59uJ779Q