前言
学习视频:2019 王道考研 计算机组成原理
推荐2019版本~
CPU
运算器
运算器是计算机的执行部件,进行算术运算(加减乘除)和逻辑运算(与或非异)。
包含以下的主要部件:
- MQ:Multiple-Quotient Register,乘商寄存器,主要负责数据的算数运算,并保存结果
- ACC:Accumulator,累加器,专门用来存储操作数或运算结果
- ALU:Arithmetic and Logic Unit,算术逻辑单元,用以计算机指令集中的执行算术与逻辑操作
- X:通用寄存器
- PSW:Program Status Word,程序状态字寄存器,主要存储一些状态(有无移除、进位、错误等信息),可供控制器参考
运算器的核心是ALU,MQ、ACC、X这三个寄存器是最基本的寄存器。
控制器
控制器是计算机的指挥中心,进行协调各部件之间的自动化协调工作。控制器由CU、IR、PC组成:
- CU:Control Unit,控制单元,分析指令,给出控制信号。
- IR:Instruction Register,指令寄存器,用于存放当前的指令,内容来自主存中的MDR。会将该指令发送给CU解析
- PC:Program Counter,程序计数器,存档指令的地址,有自动加1的功能。保证了主机可以自动化循环的工作。
ALU和CU分别代表了硬件的两种设计方式
ALU:采用组合逻辑的设计方式:例如实现1+1这种亘古不变的逻辑操作,直接得出结果,看到输入就得到输出
CU:采用时序逻辑的设计方式:管理整个操作步骤的安排,简单记录本步的计算结果,然后进行判断,如果没有判断,就会不断的进行下一步下一步控制
主存储器
存储器是计算机的存储部件,用来存放程序和数据。其中CPU可以直接访问的就是主存(内存条),而辅助存储器,例如平常使用的硬盘、固态、光盘等只是帮助主存存储更多的信息。辅存的信息只有加载在主存中,CPU才可以进行访问。
主存可以分为以下三个部分:
- 存储体:存储二进制信息
- MAR:Memory Address Register,存储访存地址,通过译码后找到存储体中的具体存储单元
- MDR:Memory Data Register,暂存需要从存储器中都或者写的信息
基本工作流程:地址寄存器承接从外部传过来的一个地址,然后通过这个地址定位到存储体当中的某个存储单元,然后将内部的数据自动输出到数据寄存器中暂存,外部的单元再从数据从数据寄存器中取走。整个过程是通过时序逻辑进行控制的。
在现代计算机中MDR和MAR是存在于CPU中的,但是逻辑上仍然是主存的一部分,所以也会有以下的图:
存储体
存储元
存储器的最小存储单元,存放0或者1。
假如输入端有个0的数据,那开关如果是闭合的,例如在为1的状态下,则0的数据就会通过电路达到输出端。反之亦然。
存储单元
而存储单元,就是存储元的阵列。
和存储元类似,有一个开关可以同时控制一整行的存储单元,但是此时同时控制的是8个存储元。
比如此时的开关是1,连通电路,则输出端将得到01100110的数据。这么一长串的数据叫做一个存储字,此时的存储字长为8bit,即一个字节:Byte。1Byte == 8bit
而存储单元的阵列,就是存储体。
地址和地址译码器
可以参考:地址和地址译码器
因为CPU是直接与主存打交道的,那CPU输出一个存储器地址到地址总线上面,那这个地址怎么才可以选中一个存储单元呢?这个就是译码器要解决的问题。译码的过程是编码的逆过程,将一长串二进制代码翻译成特定的对象(例如高低电平)。打个比方:地址译码器就像电话系统,打电话时输入电话号码就好比地址,根据输入的电话号码在若干门电话中只有一门电话被选中。
存储体的上一步工序中,就是地址寄存器传来的地址,通过这个地址找到存储体中的存储单元。地址寄存器传来的地址位数反映了存储
元的个数。比如有32个存储单元,而存储单元的地址是用二进制来表示的,那么5位二进制数就可以32个存储单元。那么,MAR的位数
是5位。在实际运用中,我们知道了MAR的位数,存储单元的个数也可以知道了。
对于一个地址寄存器中地址的位数为3位,则对应到存储单元就是 2 3 2^3 23个,如下图所示:
此时的地址码为010,结合38真值表可以得出,存储体中被激活的存储单元(这个词可能用的不对)为序号6,则输出的数据为序号6存
单元中的存储位:00101100。
3-8译码器真值表
I/O设备
键盘鼠标、相机、显示屏、触摸屏…
计算机的工作过程-取数指令
(PC) --> MAR:将PC中要操作的指令放到主存中的MAR中。
M(MAR) --> MDR:主存根据MAR中的地址码,找到对应的存储单元,将数据暂存至MDR中
(MDR) --> IR:MDR中存储的指令交给控制器中的IR
此时取指令结束
OP(IR) --> CU:从IR中取出指令里面的操作码,交给CU去解析
此时分析指令已经完成,但是仍然没有拿到要处理的数据
Ad(IR) --> MAR:取出IR中指令的地址码,存储到MAR中
M(MAR) --> MDR:主存更绝MAR中的地址码,找到对应的存储单元,将数据暂存到MDR中
(MDR) --> ACC:将数据从MDR中取出交给ACC
执行指令结束
其中,数据和指令是以同等的地位存储到主存中的,从MDR中取出的是指令还是数据,通过指令周期的不同阶段来进行判断!
计算机的层次结构
软件是灵魂、硬件是肉体,两者逻辑上是可以等同的(对于实现一个功能而言)。
机器语言:只有01这种二进制代码,例如0000,0000,000000010000
第一段0000,代表了需要执行的操作,后面两端代表了哪里找数据,对于人来说,显然是看不懂的。。。于是就开始找规律。。。
汇编语言:开始有了助记符,知道编址的规律之后,很容易可以定位到具体的位置,于是人开始让计算机去干查表的活儿,比如LOAD A, 16 ,这条指令的意思:将后面那个16地址所在的数据存到A这个寄存器中。通过汇编程序(汇编器)将汇编语言翻译成机器语言。
完成一个简单的加法操作:
16号单元数据于17号单元数据相加存于17号单元:
LOAD A, 16
LOAD B, 17
ADD C, A, B
STORE C, 17
由于类似这样的操作有很多,于是人又要开始偷懒了。。。。
高级语言:将这种重复的操作通过c=a+b的简单命令让底层去实现,例如C、C++、爪洼等。通过编译程序(编译器)将这种高级语言翻译成汇编语言。总之人越来越懒了。。。
最后发展到以下的五大层次结构