计算机基本工作原理
"存储程序"的工作方式
冯·诺依曼计算机的核心是存储程序,也就是将程序所含的指令和数据通过输入设备存储到主存储器(内存)中,然后执行。一旦程序被启动执行,就无须操作人员的干预,自动逐条完成指令的取出和执行任务。
一个程序的执行就是周而复始地执行一条一条指令的过程。一般情况下,每条指令的执行过程包括:
-
从主存储器中取指令:程序执行前,先将程序第一条指令的地址存放到
PC
中,取指令时,将PC
的内容作为地址访问主存储器。 -
对指令进行译码:分析指令,确定指令要执行的操作。
-
取操作数并执行,计算下条指令地址:在每条指令执行过程中,都需要计算下条将执行指令的地址,并送至
PC
:-
若当前指令为顺序型指令,则下条指令地址为
PC
的内容加上当前指令在存储器中占用的字节数(指令长度)。 -
若当前指令为转跳型指令,则下条指令地址为指令中指定的目标地址。
-
-
将结果送回存储器:当前指令执行完后,执行结果被送回存储器(或存放在寄存器),根据
PC
的内容到主存储器中取出的是下一条将要执行的指令,因而计算机能周而复始地自动取出并执行一条一条的指令。
从源文件到可执行文件
图片来源:王道计算机考研
-
预处理阶段:预处理器(cpp)对源程序中以字符
#
开头的命令进行处理,例如将#include
命令后面的h
文件(如 <stdio.h>)内容插入程序文件。输出结果是一个以i
为扩展名的源文件hello.i
。 -
编译阶段:编译器(ccl)对预处理后的源程序进行编译,生成一个汇编语言源程序
hello.s
。汇编语言源程序中的每条语句都以一种文本格式描述了一条低级机器语言指令。 -
汇编阶段:汇编器(as)将
hello.s
翻译成机器语言指令,把这些指令打包成一个可重定位目标文件hello.o
,它是一种二进制文件,因此用文本编辑器打开会显示乱码。 -
链接阶段:链接器(ld)将多个可重定位目标文件和标准库函数合并为一个可执行目标文件,简称可执行文件
.exe
。
本例中,链接器将 hello.o
和标准库函数 printf
所在的可重定位目标模块 printfo
合并,生成可执行文件 hello.exe
。最终生成的可执行文件被保存在磁盘上。
指令执行过程
可执行文件代码段是由一条一条机器指令构成的,指令是用 0 和 1 表示的一串 0/1序列,用来指示 CPU 完成一个特定的原子操作。我们以取数指令(送至运算器的 ACC 中)为例来说明指令的执行过程。
对指令进行取指:PC → MAR → M(主存) → MDR → IR
,根据 PC 取指令到 IR
完成对第一条指令取指操作后,还须为取下条指令做准备,程序计数器 PC
会自动形成下一条指令的地址,也就是自动加一功能,即 (PC)+1→PC
,此时 PC
会自动指向存储第二条指令的存储单元,PC 中的值自动从 0 增加到了 1。
完成对指令取指后,还要对其进行分析:OP(IR) → CU
,指令译码并送出控制信号
在完成对指令的分析后,控制器就知道了该指令所要执行的具体操作,于是就执行该指令:Ad(IR) → MAR → M → MDR → ACC
,进行取数操作
此时 (PC)=1,指向内存中的编号为 1 的存储单元,该存储单元的内容是第二条机器指令,“将 ACC 中的数乘 b 得 axb,结果存于 ACC 中”
之后 程序计数器 PC 中的值从 1 自动增加到了 2,也就是指向内存中编号为 2 的存储单元,而该存储单元的内容就是本程序的第三条机器指令。
对第二条指令进行分析:
对第二条指令进行执行:
之后继续按照 取指、分析、执行的顺序操作后续的指令
随着硬件技术的发展,内存都制成大规模集成电路芯片,而将 MAR
和 MDR
集成到了 CPU
芯片中。