预编译 | 1.删除#define并做文本替换 |
---|---|
2.处理#if,#denif等预编译指令 | |
3.处理#include递归展开的过程 | |
4.删除注释 | |
5.添加行号和文件标识 | |
6.保留#program指令 | |
编译 | 1.词法分析 |
2.语法分析 | |
3.语义分析 | |
4.代码优化 | |
5.生成指令 | |
汇编 | 翻译指令 |
链接 | 1.合并段和符号表 |
2.符号解析 | |
3.分配地址和空间 | |
4.符号的重定位 |
#include<stdio.h>
/*
.data 已初始化且初始化不为零的数据
.bss 未初始化或初始化为零的数据
*/
int gdata1=20;//数据 .data
int gdata2=0;//数据 .bss
int gdata3;//数据 .bss
static int gdata4=20;//数据 .data
static int gdata5=0;//数据 .bss
static int gdata6;//数据 .bss
int main()
{
int ldata1=30;//指令 .text
int ldata2=0;//指令 .text
int ldata3;//指令 .text
static int ldata4=40;//数据 .data
static int ldata5=0;//数据 .bss
static int ldata6;//数据 .bss
return 0;//指令
}
mian.o 文件部分核心段描述
其中.bss段缺少4个字节 静态全局变量gdata3并没有存放在.bss 而是存放在* COM *
main.o目标文件布局
1).bss 段不存放在程序文件中,由于 .bss 段中的变量不需要初始化成除0外的特定值,所以不需要保存其内容。