编译
通过指令gcc test.i -S
编译完成后会得到test.s文件
编译部分会在计算机专业一门叫做:《编译原理》的课上讲解如果大家感兴趣可以听一听在哪一节课上会讲
语法分析
词法分析
语义分析
符号汇编
符号汇总我会在汇编这一步提一嘴(毕竟汇编生成了符号表)
汇编
通过指令gcc test.s -c
将汇编指令转换成了二进制指令并形成符号表然后放在text.o(此文件为elf格式)文件内
文件内容:
我们虽然肉眼看不懂二进制指令但是我们可以通过工具readelf来看此文件.
生成符号表
readelf-s就可以得到
对比一下之前的代码
不难发现我们的文件里有函数和全局变量
可是这个的作用是什么呢?
我们不妨将Add函数拆开到另一个源文件
然后经过编译的全部过程就得到了这些
这个时候我们就需要链接来继续后面的操作了
链接
我们知道链接的作用有
符号表的合并和重定位
合并段表
将符号表重定位并合并之后就可以交给我们的运行环境来操作了.
题外话
不得不说的是之前的程序员才是真正的大佬
推荐书:《程序员的自我修养》当然这是后期看的书现在看多少有点劝退.(买之前看一下豆瓣评分不要买成同名的书了!!!
VIM作为极强一个编译器也可以搞一下
VIM学习资料
简明VIM练级攻略:
简明 Vim 练级攻略 | 酷 壳 - CoolShell
VIM速查卡
给程序员的VIM速查卡 | 酷 壳 - CoolShell
运行环境
程序必须载入内存中。在有操作系统的环境中: 一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
程序的执行便开始。接着便调用main函数。
开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。
终止程序。正常终止main函数;也有可能是意外终止。
对第3的小讲
执行程序时就在栈区分配的main函数和Add函数的空间将临时变量放入栈区来后运行程序.
关于函数栈帧的建立和摧毁我会再出一篇博客继续聊.