因为学校的课程设置是没有计组,计网和操作系统。但是总觉得这些很重要,一些底层基础东西还是有必要去掌握。所以自此打算花费一到两个月来自学计算机组成原理。可能学习的不是很深入,毕竟不是学校系统的学习,但是了解一点基础也是极好的。此博客只记载自己所学习到的新东西,欢迎大家指正错误。2020.1.22
目录
历史
计算机系统=硬件+软件
该课程主要探讨硬件
1.第一台计算机:电子管,使用机器语言编程(程序员通过在纸带上打孔来表示0和1,如果有小虫子死在纸带上,那么就会出问题,所以程序漏洞又叫做bug)、体积超大、耗电多。
2.第二代:晶体管、体积变小速度变快(要通过手动焊接晶体管)
3.第三代:中小规模集成电路
4.第四代:大规模和超大规模集成电路、开始出现微处理器、操作系统
这里面涉及到肖克利和八叛徒的故事,感兴趣的可以去了解一下。
冯诺依曼
冯诺依曼——“存储程序”,可以把所有指令一次放到主存里
1.存储器用来存放数据和程序
2.运算器主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中
3.控制器主要用来控制和指挥程序和数据的输入运行,以及处理运算结果(控制器是解析存储器中的程序,比如“+”这一运算,在存储器中的运算要先经过控制器解析才能到运算器。)
4.输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等
5.输出设备可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等
特点(可暂时不需要了解,后面会深入讲解):
1.五大部件
2.指令和数据以同等地位存放于存储器中,均可按地址寻访;
3.冯诺依曼体系结构的指令和数据均采用二进制码表示;
4.指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数所在存储器中的位置;
5.指令在存储器中按顺序存放,通常指令是按顺序执行的,特定条件下,可以根据运算结果或者设定的条件改变执行顺序;
6.机器以运算器为中心,输入输出设备和存储器的数据传送通过运算器。(这就有点多此一举,存储数据都要经过运算器,对比下图有所感悟)
现代计算机结构及各个部件作用
主存储器
硬盘属于外设存储器的一种。
MAR:存储地址寄存器,位数反应存储单元个数
MDR:存储数据寄存器,位数=存储字长
读入数据:存放地址写在MAR,根据MAR从存储体取出数据,并把数据写到MDR中
写入数据:CPU会指明写入地址,数据写到MDR中,通过控制总线告诉主存储器是读入还是写入。
数据在存储体内按地址存储。
存储单元:每个存储单元放一串二进制代码
存储字:存储单元中二进制代码的组合
存储字长:存储单元中二进制代码的位数
存储元:电容原理,存储二进制的电子元件,每个存储元可存1bit
Eg:MAR=4位 代表有个存储单元
MDR=16位 代表一个存储单元存储16bit,即一个字=16bit
运算器
https://blog.csdn.net/szlg510027010/article/details/82846696?locationNum=8
大致主要包括ACC(累加器)、MQ(乘商寄存器)、X(通用的操作数寄存器)、ALU(算数逻辑单元,通过内部复杂的电路实现运算)。
详细了解在后面。
控制器
CPU,也就是中央处理器。它是由控制器和运算器组成的。
计算机工作原理的例子
int a=2,b=3,c=1,y=0;
void main(){
y=a*b+c;
}
计算机是如何执行其过程是怎样的呢。
首先编译装入主存,高级语言转化为机器语言,如下:
每个存储单元为16bit,CPU会自动拆解为操作码和地址码。
第一步:
注:(寄存器)为寄存器中的数字
初: | (PC)=0 | PC指向第一条指令的存储地址 |
#1 | (PC)->MAR | PC通过地址总线传输到MAR中,导致(MAR)=0,控制器向主存指明了接下来要访问0号地址的数据,同时控制器会通过控制总线告诉主存储器进行读操作 |
#2-3 | M(MAR)->MDR | 导致(MDR)=0000010000000101 |
#4 | M(MDR)->IR | 取出来的数值放入IR进行分析指令,导致IR=0000010000000101 |
#5 | OP(IR)->CU | 指令的操作码送到CU,CU分析为取数指令 |
#6 | Ad(IR)->MAR | 分析得到地址为0000000101,即(MAR)=5 |
#7-8 | M(MAR)->MDR | 导致(MDR)=0000000000000010=2 |
#9 | (MDR)->ACC | 导致(ACC)=0000000000000010=2 |
其中#1~4为取指令,#5为分析指令,#6~9为执行取数指令,最后的结果就是ACC=2,在取指令之后PC会自加,变为1 |
初: | (PC)=1 | PC指向第二条指令的存储地址 |
#1 | (PC)->MAR | PC通过地址总线传输到MAR中,导致(MAR)=1,控制器向主存指明了接下来要访问2号地址的数据,同时控制器会通过控制总线告诉主存储器进行读操作 |
#2-3 | M(MAR)->MDR | 导致(MDR)=0001000000000110 |
#4 | M(MDR)->IR | 取出来的数值放入IR进行分析指令,导致IR=0001000000000110 |
#5 | OP(IR)->CU | 指令的操作码送到CU,CU分析为乘法指令 |
#6 | Ad(IR)->MAR | 分析得到地址为0000000110,即(MAR)=6 |
#7-8 | M(MAR)->MDR | 导致(MDR)=0000000000000011=3 |
#9 | (MDR)->MQ | 导致(MQ)=0000000000000011=3,(MQ乘商寄存器,放乘数) |
#10 | (ACC)->X | 导致(X)=2,X里面放被乘数 |
#11 | (MQ)*(X)->ACC | CU告诉ALU执行乘法操作,导致(ACC)=6,如果乘积过大,需要MQ辅助存储 |
其中#1~4为取指令,#5为分析指令,#6~11为执行取数指令,最后的结果就是ACC=6,在取指令之后PC会自加,变为2 |
初: | (PC)=2 | PC指向第三条指令的存储地址 |
#1 | (PC)->MAR | PC通过地址总线传输到MAR中,导致(MAR)=2,控制器向主存指明了接下来要访问3号地址的数据,同时控制器会通过控制总线告诉主存储器进行读操作 |
#2-3 | M(MAR)->MDR | 导致(MDR)=0000110000000111 |
#4 | M(MDR)->IR | 取出来的数值放入IR进行分析指令,导致 IR=0000110000000111 |
#5 | OP(IR)->CU | 指令的操作码送到CU,CU分析为加法指令 |
#6 | Ad(IR)->MAR | 分析得到地址为0000000111,即(MAR)=7 |
#7-8 | M(MAR)->MDR | 导致(MDR)=0000000000000001=1 |
#9 | (MDR)->X | 导致(X)=1 |
#10 | (ACC)+(X)->ACC | 导致(ACC)=7 |
其中#1~4为取指令,#5为分析指令,#6~10为执行取数指令,最后的结果就是ACC=7,在取指令之后PC会自加,变为3 |
初: | (PC)=3 | PC指向第四条指令的存储地址 |
#1 | (PC)->MAR | PC通过地址总线传输到MAR中,导致(MAR)=3,控制器向主存指明了接下来要访问4号地址的数据,同时控制器会通过控制总线告诉主存储器进行读操作 |
#2-3 | M(MAR)->MDR | 导致(MDR)=000100000001000 |
#4 | M(MDR)->IR | 取出来的数值放入IR进行分析指令,导致 IR=000100000001000 |
#5 | OP(IR)->CU | 指令的操作码送到CU,CU分析为存数指令 |
#6 | Ad(IR)->MAR | 分析得到地址为00000001000,即(MAR)=8 |
#7 | (ACC)->MDR | CU告诉存储体此次进行存储操作,导致(MDR)=7 |
#9 | (MDR)->地址为8的存储单元 | 导致y=7 |
其中#1~4为取指令,#5为分析指令,#6~9为执行取数指令,最后的结果就是y=7,在取指令之后PC会自加,变为4 |
根据IR传入的操作码,CU就知道应该做什么,就指挥MDR到底是进入到ACC还是MQ
CPU区分从内存取出的指令和数据的依据:指令周期不同阶段
现在在去体会一下冯诺依曼计算机的特点
主存就是指的主存储器,辅存运行需要先加载到主存