计算机系统的工作原理
一, “存储程序” 工作方式
“存储程序” 工作方式规定, 程序执行前, 需要将程序所含的指令和数据送入主存储器, 一旦程序被启动执行, 就无须操作人员的干预, 自动逐条完成指令的取出和执行任务.如下如所示, 一个程序的执行就是周而复始地执行一条一条指令的过程.
每条指令的执行过程包括:
- 根据PC从主存储器中取指令
- 对指令进行译码,
- 计算下一条指令地址(2和3)
- 取操作数并执行
- 将结果送回存储器.
程序执行前, 先将程序第一条指令的地址存放到PC中, 将PC的内容作为地址访问主存储器.
在每条指令执行过程中, 都需要计算下一条将执行指令的地址, 并送至PC.
若当前指令为顺序型指令, 则下一条指令地址为PC的内容加上当前指令的长度;若当前指令为跳转型指令, 则下一条指令地址为指令中指定的目标地址.
当前指令执行完后, 根据PC的内容到主存储器中取出的是下一条将要执行的指令, 因而计算机能周而复始地自动提取并执行一条一条的指令.
二, 从源文件到可执行文件
翻译过程的四个阶段
在计算机中编写的C语言程序, 都必须被转换为一系列的低级机器指令, 这些指令按照一种称为可执行目标文件的格式打好包, 并以二进制磁盘文件的形式存放起来.
以UNIX系统中的GCC编译器程序为例, 读取源程序文件hello.c, 并吧=把它翻译成一个可执行目标文件hello, 整个翻译过程可分为四个阶段完成, 如下图
- 预处理阶段: 预处理器(cpp)对源程序中以字母#开头的命令进行处理, 例如将#include命令后面的h文件内容插入程序文件. 输出结果是一个以.i为扩展名的源程序hello.i.
- 编译阶段: 编译器(cc1)对预处理后的源程序进行编译, 生成一个汇编语言源程序hello.s.
汇编语言源程序中的每条语句都以一种文本格式描述了一条低级语言指令系统. - 汇编阶段: 汇编器(as)将hello.s翻译成机器语言指令, 这些指令打包成一个称为可重新定位目标代码文件hello.o, 它是一种二进制文件, 因此用文本编辑器打开会显示乱码.
- 链接阶段: 链接器(ld)将多个可重定位目标代码文件和标准库函数合并为一个可执行目标文件, 简称可执行文件.
本例中, 链接器将hello.o和标准函数库printf所在的可重新定位目标模块printf.o合并, 生成可执行文件hello, 最终生成的可执行文件被保存在磁盘上.