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

本文详细介绍了从源代码到可执行文件的编译过程,包括预处理、编译、汇编和链接四个阶段,并解释了指令集和指令的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


什么是指令集

    指令集是CPU能够识别并执行的指令集合。

什么是指令

    指令是0\1序列,序列内容由硬件决定(通常说的 “机器相关。。。。。。”  “不具有可移植性。。。。。。”),功能是驱动(可以简单理解为供电)硬件电路(CPU的运算部件),使得输入(数据)经过硬件电路后产生一个特定的输出(结果)。  例如  数据 8和18  经过加法电路后  输出为26。


这里我们以一段代码为例:

#include<stdio.h>

int main(void)
{
     printf("hello, world\n");
     
      return 0;
}



编译系统的处理划分为四个阶段:

  1.   预处理阶段(preprocessoring phase)                                                                                                                                                                                                             预处理阶段,源程序当中定义的宏被处理掉了。所有以'#'开头的语句被处理了。生成的文件为xxx.i。

            hello.i文件的部分内容


  2. 编译阶段(compilation phase)   在这个阶段,源代码被转换为汇编代码。生成的文件为xxx.s。汇编文件汇编文件2汇编文件3汇编文件4
  3. 汇编阶段(assembly phase)   源代码被转换为机器码,生成文件为  xxx.o。内容上跟上一个阶段差不多,但是,精简了部分内容;并且,xxx.o文件的内容是(内存地址)可重定位的。
  4. 组装可执行文件阶段(linking phase)  生成可执行文件,同时将共享代码printf()插入到调用的位置。

         

PS:在早期的计算机系统中,系统运行在实模式下。实模式下,CPU仅识别16bit的指令,但是地址总线为20bit。导致程序划分段;在指令寻址的过程中,采用16bit的段基址(仅其中的四位是有效的段地址) 左移4位后,加上 偏移量(段内偏移量最大为64KB,占据16bit)。这个运算获得的地址才是指令的存储地址(内存VS硬盘)。

Problem remained: 可重定位是什么时候出现的?

                                是在286保护模式出现的时候,就集成在汇编器中了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值