概述
预编译(.i)
1.删除#define 文本替换
2.处理#include 递归展开
3.处理#if #endif 等预编译指令
4.删除注释
5.添加行号和文件标识
6.保留#pragma
编译(.s)
1.词法分析
2.语法分析 一行表达式
3.语义分析 结合上下文
4.代码优化
5.生成汇编指令 低级语言
**汇编(.o)**目标文件 可重入的二进制文件
1.翻译指令 (把低级语言翻译为机器语言)
链接(.exe) 能运行 可执行文件
数据段(.data 和 .bss)存放数据的区别
1…data 已初始化且初始化不为0的数据
2…bss 未初始化或初始化为0的数据
#include<stdio.h>
int gdata1 = 10;//全局变量生成的都是数据 数据都在数据段存放 .data段
int gdatal = 0;//.bss段
int gdata3;//.bss段
static int gdata4 = 20;//静态的全局变量也是数据 .data段
static int gdata5 = 0;//.bss段
static int gdata6;//.bss段
int main()//函数名生成的是指令 .text段
{
static int ldata = 30;//静态局部变量生成的也是数据 .data段
static int ldata2 = 0;//.bss段
static int ldata3;//.bss段
int ldata4 = 40;//普通局部变量生成的是指令 .text段
int ldata5 = 0;//.text段
int ldata6;//.text段
return 0;
}
问题1:汇编过程 int ldata = 20 是在text段,而不在stack区?
运行前 所有东西都在文件中
运行后 程序才在内存中 栈是内存区域
问题2:汇编后,文件中存在什么内容?
1.汇编阶段 bss少了4个字节 1个数据 少了那个数据 为什么?
gdata3在comment段
2.bss段不存在?为什么?信息从哪里来?REL布局
ELF
.o的布局,数据和指令存放的位置。指令数据生成的符号存放位置和属性
文件 虚拟地址空间映射 方便映射
文件标识 main.c
段信息 .text .data .bss
数据 gdata1 gdata3
函数 main()
方便映射
文件标识 main.c
段信息 .text .data .bss
数据 gdata1 gdata3
函数 main()
最后
以上就是鲜艳春天为你收集整理的2 c++ 编译原理的全部内容,希望文章能够帮你解决2 c++ 编译原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复