01 GCC—从高级语言到机器语言的过程

GCC

命令gcc指的就是GCC C编译器 gcc命令调用了一整套的程序,将源代码转化成可执行代码。

  • C预处理器:扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏

  • 编译器:转汇编代码

  • 汇编器:将汇编代码转成二进制目标代码文件(目标代码是机器代码的一种形式,包含了所有指令的二进制表示,但还没有填入全局值的地址)

  • 链接器:将目标代码文件与实现库函数(如printf)的代码合并,并产生最终的可执行代码文件

示例

  1. 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开始的

  1. 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程序访问不到的,我们有两种方法去解决这个问题:

  1. 编写完整的函数,放进一个独立的汇编代码文件中,让汇编器和链接器把它和C代码合并起来

  2. 用GCC的内联汇编特性,用asm伪指令可以在C程序中包含简短的汇编代码

有兴趣请关注我吧,一起学习进步:

https://mp.weixin.qq.com/s/9FkDwOZWwk19Gp59uJ779Qhttps://mp.weixin.qq.com/s/9FkDwOZWwk19Gp59uJ779Q

相关推荐
曦月逸霜18 天前
深入理解计算机系统——学习笔记(持续更新~)
笔记·学习·计算机系统
bohejia1 个月前
计算机系统知识2
计算机系统
缘友一世2 个月前
计算系统安全速成之系统级I/O【11】
io·计算机系统
缘友一世2 个月前
计算系统安全速成之异常与进程控制【10】
异常·计算机系统
缘友一世2 个月前
计算系统安全速成之高速缓存存储器【6】
计算机系统·高速缓存存储器
缘友一世2 个月前
计算系统安全速成之动态内存分配【8】
内存分配·计算机系统
缘友一世2 个月前
计算系统安全速成之虚拟内存与物理内存【9】
计算机系统
缘友一世2 个月前
计算系统安全速成之链接:理解程序的构建过程【7】
汇编·计算机系统
缘友一世2 个月前
计算系统安全速成之内存层次结构【5】
计算机系统·存储器