我是靠谱客的博主 鲜艳春天,最近开发中收集的这篇文章主要介绍2 c++ 编译原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

预编译(.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++ 编译原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部