1946年,美国发明了世界上第一台计算机ENIAC,可用于比较快速的数据计算,但是其运算速度却受到了人工数据的输入速度的限制,为此我们现在所广为人熟悉的大佬 冯诺依曼提出了程序存储的概念:
当采用程序存储概念以后的计算机,其运算速度得到了明显提升,比如第一台采用冯诺依曼体系结构的计算机EDVAC(electronic discrete variable automatic computer),翻译过来就是电子离散变量自动计算机;

冯诺依曼体系结构由五大设备组成,分别是: 输入设备, 运算器, 控制器, 存储器和输出设备,它们之间的关系如下:
输入设备的作用是: 将信息转换为机器能识别的形式,即二进制数据;
运算器设备的作用是: 作为其输入设备和输出设备的中转站; 把数据从存储器来回运输; 进行算术运算和逻辑运算; (这里说的是冯诺依曼结构里的运算器作用);
存储器设备的作用是: 存储计算机数据和程序,注意数据和程序在本质上都是二进制,属于等价关系,所以存储器对它们一视同仁;
控制器设备的作用是: 从存储器设备读取和解析相关指令,比如加减乘除运算指令,然后指挥程序运行;
输出设备的作用是: 将二进制数据转换为人类能识别的形式,比如文本,图像;

冯诺依曼体系结构的特点:
因此,现代计算机避免了此缺点,将计算机设计成了让输入输出设备和存储器进行直接相连,即以存储器为中心

而我们所熟悉的CPU,其实就是控制器和运算器的集合体,所以现代计算机模型大致如下:

因此本文的所有硬件结构大致可以如下展示:

这里需要提醒一下:
主存这里指的主存储器,即我们常说的内存条,或者手机说的运行内存,属于通电闪存;
而辅存指的是硬盘等大容量容器,比如电脑的SSD,或者手机上的256G等大容量
主存储器结构主要又三个部分组成:

为了方便理解,主存储器的结构可以用快递驿站进行类比:其存储体相当于驿站的存物架(具有表示哪个架子,几层,几号的标记),MAR相当于柜员,MDR相当于柜台,而我们相当于CPU;
当我们想取地址为10-8-3上面的包裹时,我们可以将该地址告诉柜员(MAR),然后MAR根据地址去取第10个柜台,第8层,上面排列着的第3个包裹放到柜台上(MDR),然后我们(CPU)从MDR上取走快递(数据)
当然这仅仅只是为了方便理解进行的类比,并不一定准确
而存储体的结构如下:

存储体被划分为了一个个单元,称为存储单元,每个存储单元里面存放着一串二进制代码
而每个存储单元中存储的所有二进制内容的组合称为一个word,即字,有时也称为存储字
而word的长度,我们称为存储字长,即二进制的位数;
运算器的基本作用是实现算术运算(如加减乘除)和逻辑运算(如与或非),它的内部主要由ACC,MQ,ALU和X寄存器构成;
也就是说前三者都是用来存放数据,后者用来进行计算

其中ACC,MQ,和X存放的数据如下表
| 加 | 减 | 乘 | 除法 | |
|---|---|---|---|---|
| ACC | 被加数,和 | 被减数,差 | 乘积高位 | 乘积低位 |
| MQ | ***** | ***** | 乘数,乘积低位 | 商 |
| X | 加数 | 减数 | 被乘数 | 除数 |
控制器的作用是统筹全局,用以发布各种控制信号,其内部主要由三个部件组成:

了解冯诺依曼体系结构的三大核心模块以后,我们就可以开始进行尝试进行程序执行模拟
假设这里有一段C代码:
int main(){
int a = 2,b = 3,c = 1,y = 0;
y = a * b + c;
return 0;
}
计算机为了执行出y最终的值,编译软件会首先将该程序进行编译为机器语言存储到了主存储器,最后形成了如下数据(实际存储器只会存储有中间只能栏的数据,其他地方只是为了方便理解添加的),这里温馨提醒后面的操作要多看这张表格

根据该表,计算机CPU中的PC(程序计数器program counter)初始位置存放的是地址0
(PC)—>MAR,PC寄存器将自己的地址告诉给MAR,此时(MAR) = 0,然后PC自增1
M(MAR)—>MDR,控制器给MAR发送读信号,主存储器中的MAR去存储体中的0地址位置读取数据,然后放到MDR中,
此时的(MDR) = 0000010000000101
M(MDR)—>IR,MDR将自己的数据交给控制器中的IR存放,此时的(IR) = 0000010000000101
(IR)—>CU, IR将指令的**控制码(000001)**发给CU,CU进行分析,发现是“取数操作”指令
(IR)—>MAR, IR将指令的**地址码(0000000101,十进制为5)**发给主存储器的MAR,此时的(MAR) = 5
(MAR)—>MDR, 主存器中的MAR去存储体中的5地址读取数据,然后放到MDR中,此时的(MDR) = 0000000000000010,即十进制数字2
(MDR)—>X, MDR将值传给X进行存储
(1-3)步骤可以看做在取指令,(4)步骤可以看做在分析指令,(5-7)可以看做在执行指令(即读数据)
(上面的操作过程路径)

到这里算完成了把a的数据放进CPU中的运算器;
然后此时的PC值为1(前面步骤已经自增过):
(1-3)步骤可以看做在取指令,(4)步骤可以看做在分析指令,(5-7)可以看做在执行指令(即读数据),(8)是CPU在进行计算
(上面过程的操作路径)

现在PC的值为2:
(上面操作过程路径)

此时的PC=3:
(PC)—>MAR,PC寄存器将自己的地址告诉给MAR,此时(MAR) = 3,然后PC自增1
M(MAR)—>MDR,控制器给MAR发送读信号,主存储器中的MAR去存储体中的3地址位置读取数据,然后放到MDR中,
此时的(MDR) = 0000100000001000
M(MDR)—>IR,MDR将自己的数据交给控制器中的IR存放,此时的(IR) = 0000100000001000
(IR)—>CU, IR将指令的**控制码(000010)**发给CU,CU进行分析,发现是“存储操作”指令
(IR)—>MAR, IR将指令的**地址码(0000001000,十进制为8)**发给主存储器的MAR,此时的(MAR) = 8
(ACC)—>MDR,控制器发送给运算器信号,ACC将数据发送给MDR;
然后MDR根据控制器发送的存储信号,去地址MAR=8处存数据(ACC) = 7;

最后同理,此时PC=4
继续按照上面的逻辑进行读数据,最后当IR给CU控制码时候,CU发现是停机指令,所以控制器就会发送中断信号,终止程序继续运行;

