编译与连接

CPU是用来运算数据的,CPU在ALU(算数逻辑单元)中运行。CPU的位数是指ALU宽度即数据总线的条数,是指一次性能加以运算的最长的整数的宽度。
虚拟地址空间(4G)
编译与连接

全局变量、静态局部变量、静态局部变量属于数据。
局部变量属于指令。
.data存储已初始化的且不为0的数据
.bss存储未初始化的或初始化为0的数据(不存在于文件中,节省了文件空间)
stack存储局部变量
*COM*块存储未初始化的已定义数据
强类型:已初始化的数据
弱类型:未初始化的数据
编译与连接

编译程序可以分解为4个步骤,分别是预处理(.i文件)、编译(.s文件)、汇编(.o/obj文件)和链接
预编译过程主要处理源代码文件中的以#开始的预编译指令。比如#include、#define等,主要处理规则如下:
  • 将所有的#define删除,并且展开所有的宏定义。
  • 处理所有条件预编译指令,比如#if、#ifdef、#endif。
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
  • 删除所有的注释//和/* */。
  • 添加行号和文件名标识,比如#2 “hello.c”2,以便于编译时编译器产生调试用的行号信息及 用于编译时产生编译错误或警告是能够显示行号。
  • 保留所有的#pragma编译器指令,因为编译器需要使用它们。
编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件,这个过程是整个程序构建的核心部分,也是最复杂的部分之一。
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
人们把每个源代码模块独立地编译,然后按照需要将它们“组装”起来,这个组装模块的过程就是链接。链接过程主要包括了地址和空间分配、符号决议和重定位等步骤。
链接有两步:
1、合并所有obj文件的段(所有相同属性的段进行合并,组织在一个页面上),并调整段偏移和段长度,合并符号表,进行符号解析(所有的obj符号表中对符号引用的地方都要找到该符号定义的地方),分配内存地址。
2、核心:符号的重定义。