现代计算机硬件
![img](https://i-blog.csdnimg.cn/blog_migrate/dc9aeacdb25c7ae13a73411b4faf797f.png)
![img](https://i-blog.csdnimg.cn/blog_migrate/4f7b330cce03b0c50af090be107ed765.png)
注意:主存和CUP一起构成了主机,辅存和输入/输出设备一起构成了IO设备。
1,主存储器
![图1](https://typora-kevin.oss-cn-qingdao.aliyuncs.com/图1.png)
工作原理
存储数据:需要CPU给主存储器一个要存储数据的指令,然后将数据的地址放进地址寄存器,接着将数据放进数据寄存器。
取出数据:CPU将想要取出的数据的地址交给地址寄存器,并且CPU告诉存储器这次要执行的是读操作。然后存储体就会通过地址将对应的数据放在数据寄存器中,然后CPU就可以通过线路将数据寄存器中的数据取走。
基本组成
存储单元:在这个存储单元中放一串二进制代码(是个空间)(存储单元是通过地址访问的,每个存储单元都会赋予一个地址)
存储字:这就是存储单元中放的二进制代码的组合(是二进制代码)。
存储字长:存储字的二进制代码的长度。
存储元件:0/1
MAR(地址寄存器):它的位数与存储体中的存储单元的个数是对应的(MAR中也是有好几位的,只是用的时候将它转换成10进制的使用)。ex:地址存储器中的数都是4位的,那么存储体中的存储单元的个数就是2的4次方(从0000到1111)。相应的,如果存储体中的存储单元的个数是2的5次方,那么地址寄存器中的二进制的位数就是5.
MDR(数据寄存器):它的位数是和存储单元中的存储字长有关系的。如果MDR中的二进制都是16位的,那么代表着存储单元中存储字长就是16位的。
(注意上面的单位都是比特,不是字节。)
2,运算器
运算器的作用就是实现算术运算和逻辑运算。
![3](https://i-blog.csdnimg.cn/blog_migrate/3d08e8e3240b46b20d0b45fd9ec4901d.png)
其中ALU的结构是十分复杂的,因为它负责运算。其他三个只负责存储。
加法和减法都是单地址指令。
![6](https://i-blog.csdnimg.cn/blog_migrate/f298f6df4812c3481c0828551186617d.png)
![6](https://i-blog.csdnimg.cn/blog_migrate/a6adf1c95a2712c20c8a1f20d1a712cc.png)
加法:[ACC] + [x] -> ACC 指令:加法操作码+加数的地址(被加数在ACC中)
根据地址,将加数放到x中。
减法:[ACC] - [x] -> ACC 指令:减法操作码+减数的地址(被减数在ACC中)
根据地址,将减数放到x中。
乘法:[x] * [MQ] -> ACC//MQ 指令:乘法操作码+乘数的地址
首先,运算器收到乘法指令,在执行乘法指令之前,acc中的数就是被乘数。
然后,根据地址将存储单元中的乘数放到MQ中
接着,将ACC中的被乘数放到x中,将ACC清零(先后顺序由控制器控制)
最后,进行乘法,将乘法结果的高位放到ACC中,将乘法结果的地位放到MQ中。
除法:[ACC] ÷ [x] -> MQ (余数保存在ACC中) 指令:除法操作码+除数的地址
首先,运算器收到除法指令,在执行除法指令之前,acc中的数就是被除数。
然后,根据地址将除数放到x寄存器中。
最后,进行除法操作,将商保存到MQ中,余数保存到ACC中。
3,控制器
![5](https://i-blog.csdnimg.cn/blog_migrate/ca8f08f60147139d0532df28e58630a9.png)
![6](https://i-blog.csdnimg.cn/blog_migrate/4620e2948fe32128aaf683675d6511f1.png)
功能是解释指令,保证指令执行:
1,取指令:先从PC中根据下一条指令的地址来找指令(PC寄存器中存放的是准备执行的指令的地址,由自加1功能)。将指令放在IR中()。
2,分析指令:将指令从内存单元中取出,放到IR(IR寄存器中存放的是准备执行的指令)中,然后控制单元会将IR中指令的操作码部分提取出来并进行分析。
3,执行指令:控制单元控制相应的部件去执行指令。(由CU来完成)
举例子
![7](https://i-blog.csdnimg.cn/blog_migrate/530a069becadb5868b97187c27b2757d.png)
通过编译放进主存储器中。
![8](https://i-blog.csdnimg.cn/blog_migrate/5d2086ec353b9f4d93eba9b66aed9404.png)
(前面的是机器指令,后面的是数据存储。指令分为操作码和地址码两个部分,加起来正好与数据的字长一样,16比特。所以存储字长就是16比特。操作的时候CPU会自动将指令拆成操作码和地址码。)
以上是存储操作。
接下来开始执行:
取数指令
最开始:PC = 0,指向的是第一条指令的存储地址。
1,PC将地址传给MAR,这样地址寄存器的值变成了0。MAR = 0。(并且控制器会通过控制总线告诉主存储器是指令是读取)
2,然后MAR会通过自己的值去存储体中来寻找对应存储单元的二进制。
3,然后将寻找到的二进制(00001 00000000101)放进MDR中。即MDR= 00001 00000000101
4,IR会从MDR中接收指令。使得IR = 00001 00000000101。
5,然后IR会将数据传给CU,指令的操作码传到CU后,CU经过分析得出,这个指令是取数。
6,然后将操作码后面的地址码传给MAR,使得MAR = 5。
7,然后存储主体根据MAR传过来的5来找到对应单元中的二进制。
8,将存储主体二进制将二进制再传给MDR。使得MDR = 0000000000000010.
9,然后MDR中的数据会传给ACC(累加寄存器中)。ACC= 2.
到此为止,就完成了一个取数的指令。
取指令(1-4)
分析指令(5)
执行取数指令(6-9)
前面提到过,PC有自动加一的功能,当已经完成了地址为0的指令后,就会指向1; ACC = 2
乘法指令
1,PC将地址传给MAR,MAR = 1
2,MAR将地址传给存储体,然后存储体通过地址将存储单元对应二进制找到。
3,存储体将找到的二进制传给MDR,MDR = 000100 0000000110.
4,然后MDR将二进制传给IR。使得IR = 0000000000000110
5,IR将数据传给CU,然后CU经过分析操作码000100得出这个指令是乘法。
6,然后IR将地址码传给MAR,使得MAR= 000000000110
7,然后存储体接收到MAR的值,并且寻找这个存储单元对应的二进制码。
8,将这个数据的二进制码传给MDR,使得MDR = 0000000000000011=3
9,将MDR的值传给MQ乘商寄存器中,所以b = 3已经到了MQ中了。
10,将a的值放到通用寄存器X中,X = 2
11,CU会通过控制线告诉ALU(算数逻辑单元),让他进行乘法运算。然后将得出来的值6放进ACC中。(如果乘积太大,则需要MQ辅助存储,低位)
取指令(1-4)
分析指令(5)
执行乘法指令(6-11)
PC+1,执行了2; ACC = 6
加法指令
1,Pc将地址传给MAR, MAR = 2
2,将MAR的值传给存储体,让存储体找到值对应的存储单元的二进制值。
3,将找到的二进制值传给MDR,使得MDR = 000011 000000000011
4,将MDR的值传给IR中,使得IR = 000011 000000000011
5,将IR中的值传给CU,CU进行分析操作码得出这个是加法操作。
6,将地址码转换成十进制传给MAR,MDR = 7.
7,MAR将7传给存储体,让存储体去找地址是7的存储空间的数值二进制。
8,将找到的二进制传给MDR,即MDR = 0000000000000001 = 1
9,将MDR的值传给通用寄存器X中,使得x = 000000000000001 = 1 。
10,控制单元CU会通过控制线告诉ALU(算数逻辑单元),让他执行加法运算。最后将得数放在ACC中(ACC+X = ACC)。即ACC = 7.
取指令(1-4)
分析指令(5)
执行乘法指令(6-11)
PC+1,得PC = 3,ACC = 7.
存数指令
1,PC = 3,将PC 的值传给MAR。使得MAR = 3.
2,将MAR的值传给存储体,然后存储体来寻找地址为3的数据对应的二进制码
3,将找到的二进制码传给MDR,使得MDR = 000010 0000001000.
4,然后MDR将二进制码传给IR。
5,CU进行分析IR中的操作码得到,执行的指令是存数。(将ACC中的数据存储到地址码所指向的存储单元中)
6,将地址码转换成十进制得8,将8传给MAR,使得MAR = 8
7,(因为是存数操作)将ACC的值传到MDR中,使得MDR = 7
8,CU(控制单元)会通过控制总线告诉存储体,执行的操作是存数。
9,将MDR中的数7 存储到了MAR指向的地址中,也就是地址为8的存储单元中存储的数值为7.
取指令(1-4)
分析指令(5)
执行存数指令(6-9)
停机指令
![14](https://i-blog.csdnimg.cn/blog_migrate/554e31339f0095075b86b13edcaae22e.png)
PC+1 = 4
1,将PC的值传给MAR,即MAR = 4.
2,然后将MAR 的值传给存储体,让存储体去找地址为4的存储单元对应的二进制数值
3,将找到的二进制数值传给MDR,使得MDR = 000110 000000000000
4,将MDR的二进制值传给IR中,导致IR = 000110 000000000000
5,IR将数传给CU,CU通过分析操作码的指令得到这个指令是停机。
取指令(1-4)
分析指令(5)
执行停机指令
![15](https://i-blog.csdnimg.cn/blog_migrate/e23671341332db73c4675ceb9d959a7f.png)
在现实中,MAR和MDR通常会被集成在CPU中,所以以后遇到了可以理解。