您的位置:首页 > 理论基础

深入理解计算机系统002——第一章(编译过程)

2014-09-25 12:06 579 查看
在计算机当中,源代码以文本文件的形式存储;经过编译系统的处理后,会产生机器语言级别的指令序列。那么编译系统是如何将源代码转换为指令序列的呢?

什么是指令集

指令集是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保护模式出现的时候,就集成在汇编器中了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐