深入理解计算机系统002——第一章(编译过程)
2014-09-25 12:06
579 查看
在计算机当中,源代码以文本文件的形式存储;经过编译系统的处理后,会产生机器语言级别的指令序列。那么编译系统是如何将源代码转换为指令序列的呢?
什么是指令集
指令集是CPU能够识别并执行的指令集合。
什么是指令
指令是0\1序列,序列内容由硬件决定(通常说的 “机器相关。。。。。。” “不具有可移植性。。。。。。”),功能是驱动(可以简单理解为供电)硬件电路(CPU的运算部件),使得输入(数据)经过硬件电路后产生一个特定的输出(结果)。 例如 数据 8和18 经过加法电路后 输出为26。
这里我们以一段代码为例:
编译系统的处理划分为四个阶段:
预处理阶段(preprocessoring phase) 预处理阶段,源程序当中定义的宏被处理掉了。所有以'#'开头的语句被处理了。生成的文件为xxx.i。
![](http://img.blog.csdn.net/20140925105403322?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNwZW5saWFueQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
编译阶段(compilation phase) 在这个阶段,源代码被转换为汇编代码。生成的文件为xxx.s。
![](http://img.blog.csdn.net/20140925110118157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNwZW5saWFueQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20140925110154271?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNwZW5saWFueQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20140925110238903?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNwZW5saWFueQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20140925110303332?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanNwZW5saWFueQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
汇编阶段(assembly phase) 源代码被转换为机器码,生成文件为 xxx.o。内容上跟上一个阶段差不多,但是,精简了部分内容;并且,xxx.o文件的内容是(内存地址)可重定位的。
组装可执行文件阶段(linking phase) 生成可执行文件,同时将共享代码printf()插入到调用的位置。
PS:在早期的计算机系统中,系统运行在实模式下。实模式下,CPU仅识别16bit的指令,但是地址总线为20bit。导致程序划分段;在指令寻址的过程中,采用16bit的段基址(仅其中的四位是有效的段地址) 左移4位后,加上 偏移量(段内偏移量最大为64KB,占据16bit)。这个运算获得的地址才是指令的存储地址(内存VS硬盘)。
Problem remained: 可重定位是什么时候出现的?
是在286保护模式出现的时候,就集成在汇编器中了吗?
什么是指令集
指令集是CPU能够识别并执行的指令集合。
什么是指令
指令是0\1序列,序列内容由硬件决定(通常说的 “机器相关。。。。。。” “不具有可移植性。。。。。。”),功能是驱动(可以简单理解为供电)硬件电路(CPU的运算部件),使得输入(数据)经过硬件电路后产生一个特定的输出(结果)。 例如 数据 8和18 经过加法电路后 输出为26。
这里我们以一段代码为例:
#include<stdio.h> int main(void) { printf("hello, world\n"); return 0; }
编译系统的处理划分为四个阶段:
预处理阶段(preprocessoring phase) 预处理阶段,源程序当中定义的宏被处理掉了。所有以'#'开头的语句被处理了。生成的文件为xxx.i。
编译阶段(compilation phase) 在这个阶段,源代码被转换为汇编代码。生成的文件为xxx.s。
汇编阶段(assembly phase) 源代码被转换为机器码,生成文件为 xxx.o。内容上跟上一个阶段差不多,但是,精简了部分内容;并且,xxx.o文件的内容是(内存地址)可重定位的。
组装可执行文件阶段(linking phase) 生成可执行文件,同时将共享代码printf()插入到调用的位置。
PS:在早期的计算机系统中,系统运行在实模式下。实模式下,CPU仅识别16bit的指令,但是地址总线为20bit。导致程序划分段;在指令寻址的过程中,采用16bit的段基址(仅其中的四位是有效的段地址) 左移4位后,加上 偏移量(段内偏移量最大为64KB,占据16bit)。这个运算获得的地址才是指令的存储地址(内存VS硬盘)。
Problem remained: 可重定位是什么时候出现的?
是在286保护模式出现的时候,就集成在汇编器中了吗?
相关文章推荐
- 深入理解计算机系统学习之程序编译过程
- 读书笔记_深入理解计算机系统_第1章_计算机系统漫游 (代码编译链接详细过程)
- 【深入理解计算机系统[2]】第一章 计算机系统漫游
- 深入理解计算机系统(3.7)---汇编世界当中过程的经典(十分重要)(难度较高)
- 深入理解计算机系统(3.7)---汇编世界当中过程的经典(十分重要)(难度较高)
- 深入理解计算机系统读书笔记之第一章:漫游
- 深入理解计算机操作系统(第二版) 读书笔记(第一章 计算机系统漫游)
- 深入理解计算机系统 第一章 计算机系统漫游
- 深入理解计算机系统第一章学习笔记
- 深入理解计算机系统--读书笔记(第一章)
- 【深入理解计算机系统笔记】Linux 下 程序的链接过程
- 链接器解析外部符号的过程 深入理解计算机系统 P475 注:在链接时的注意事项
- 深入理解计算机系统 第一章
- 读书笔记《深入理解计算机系统》(第三版) 第一章 计算机系统漫游
- 读书笔记-深入理解计算机系统(第一章)
- 深入理解计算机系统中网络编程一节echo客户端服务器的源码编译和运行
- 深入理解计算机系统001——前言和第一章
- 深入理解计算机系统003——第一章(进程及并发)
- Computer Systems A Programmer's Perspective(深入理解计算机系统)第一章读书笔记
- &lt;&lt;深入理解计算机系统&gt;&gt;家庭作业3.38, 分析全过程