1.2 计算机的基本组成


1 冯·诺伊曼计算机的特点

  1. 计算机由运算器、存储器、输入设备、输出设备、控制器五大部件组成
  2. 指令和数据以同等地位存放于存储器内,并可按照地址寻访
  3. 指令和数据均以二进制数表示
  4. 指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数在存储器中的位置。
  5. 指令在存储器内按顺序存放。通常指令是按顺序执行的,在特定条件下可根据运算结果或者根据设定的条件改变执行顺序。
  6. 机器以运算器为中心,输入输出设备与存储器间的数据传送通过运算器完成。

2 计算机硬件结构框图

图1

图2

运算器和控制器在逻辑关系和电路结构上联系紧密,所以通常被集成在一个芯片上,因此将他们合称为CPU(Center Processing Unit);输入和输出设备统称为IO设备。

所以现代计算机可以认为是三大部分组成:CPU、I/O设备、主存储器

图3

主存储器(Main Memory):存储子系统的一类,用来存放程序和数据,可以直接与CPU交换信息。另一类称为辅助存储器,简称辅存,又称外存。

算术逻辑单元(Arithmetic Logic Unit):简称算逻部件,用来完成算术逻辑运算。

控制单元(Control Unit):用来解释存储器中的指令,并发出各种操作命令来执行指令。

3 计算机的工作流程

我的书写顺序可能跟书上不太一样,编制解题程序的机器指令放到了本节最后

图4

ACC(Accumulator):累加器

MQ(Multiplier-Quotient Register):乘商寄存器

X:操作数寄存器


PC(Program Counter):程序计数器

IR(Instruction Register):指令寄存器


MAR(Memory Adress Register):存储器地址寄存器

MDR(Memory Data Register):存储器数据寄存器

3.1 主存储器

图5

存储体由很多存储单元组成,每个存储单元里面又包含很多存储元件,每个存储元件能够寄存一位二进制代码0或者1,所以,一个存储单元能够存储一串二进制代码,那么这串二进制代码被称为一个存储字,这串二进制代码的长度被称为存储字长

一个存储字可以表示一个数字一串字符或者一条指令

主存的工作方式是按存储单元的地址号来实现对存储字各位的存取,这种方式被称为按地址存取方式

我们看图4中的MAR和MDR,MAR是存储器地址寄存器,我们使用MAR是要寄存存储单元的地址,那么有多少存储单元,MAR就要能构成多少个地址。比如我有64个存储单元,那么MAR必定有6位,因为2^6=64,只有六位才能产生64个不同的地址。

而下面几个小节我们会提到,MDR是存储器数据寄存器,从存储体中获得的数据(存储字)需要寄存到MDR中,那么MDR的位数应该和存储字的长度相同(即存储字长)

所以假设MAR的位数位n,MDR的位数为m,那么我们会有 2 n 2^n 2n个存储单元,每个单元又会有m个存储元件,那么总容量应该为 ( 2 n ) × m (2^n)\times m (2n)×m

3.2 CPU:运算器

运算器中至少包含三个寄存器

  • ACC(Accumulator):累加器
  • MQ(Multiplier-Quotient Register):乘商寄存器
  • X:操作数寄存器

下图为三种寄存器存储的不同数据,先别看乘法,剩余的加、减、除都是ACC存储被…数,X存储…数,最后的结果,加和减法的结果寄存到ACC中,除法的余数寄存到ACC中,商寄存到MQ中。

那么乘法来说,被乘数原本是寄存在ACC中的,不过计算开始,就从ACC中移入到X中,乘数放在MQ中,乘积结果的高位在MQ中,低位在ACC中。

唐朔飞教授的《计算机组成原理》一书中,采用了如下的运算器结构进行举例:

运算器可将结果从ACC中送至存储器的MDR;而存储器中的操作数也可以从MDR送至运算器的ACC、MQ或X

我们以如上这种结构的运算器结构,对不同操作进行分析

M为存储器的任意一个地址号,[M]表示对应地址号单元的内容,[X]表示X寄存器中的内容,同理,[ACC]表示ACC寄存器的内容,[MQ]表示MQ寄存器的内容。

👉加法

[M]->X

[ACC] + [X] -> ACC

👉减法

[M]->X

[ACC] - [X] -> ACC

👉乘法

[M]->MQ

[ACC] - > X

0 -> ACC

[X] × [MQ] -> ACC//MQ

👉除法

[M] -> X

[ACC] ÷ [X] -> MQ…ACC(商在MQ中,余数在ACC中)

3.3 CPU:控制器


👉取指:命令存储器读出一条指令

👉分析:对指令进行分析,指出指令应该完成什么操作,指明操作数的地址

👉执行:根据操作数所在的地址以及指令的操作码完成某种操作

这里我们要明确一个关于指令的概念:

一条计算机指令由操作码地址码组成,

操作码指明了我想要干什么,地址码说明了我要用哪个地址的数据来完成这个操作。

比如这些操作码,说明了我想要做什么。以000001为例,某条机器指令的操作码部分是000001,那么对于控制器来说,它知道了这条指令是想要取一个数,放到ACC中。具体取什么数,那就看后10位地址码指向的是什么位置。

💻PC(Program Counter):程序计数器,存放当前欲执行的指令的地址,与MAR之间由一条直接通路。

还能记起来MAR是什么东西吗?MAR(Memory Adress Register):存储器地址寄存器,我们知道主存的工作方式是按照地址存取方式,我们无论想获得数据,还是指令,都要将其地址送入MAR,然后CU会对主存下达命令,根据地址寻找数据(有可能是一些数,也有可能是一条指令)并且将数据放入MDR中,然后MDR将数据送入需要的地方。这是冯·诺伊曼老前辈的思想:

程序计数器还有一个功能,就是自动加1的功能,可自动形成下一条指令。

💻IR(Instruction Register):指令寄存器,存放当前的指令,这些指令来自主存的MDR。

IR中存放着当前指令,每一条指令又包含操作码和地址码,操作码会送至CU(控制单元)中进行分析,并且发出各种微操作命令序列,控制所有 被控对象;而地址码则送入MAR中进行进一步的取数操作。

3.4 I/O

I/O子系统包括各种I/O设备及其相应的接口。每一种I/O设备都由I/O接口与主机相连,它们接收CU发出的各种控制命令,并完成相应的操作。

3.5 ✊总结,全流程

我们以一个式子的计算流程为例 a x 2 + b x + c ax^2 + bx + c ax2+bx+c

我们可以将这个式子改写成 x ( a x + b ) + c x(ax + b) + c x(ax+b)+c

那么在计算机中,这个式子的计算过程

  1. 将x放置在运算器
  2. x乘以a得到 a x ax ax,结果还是放在运算器中
  3. a x + b ax + b ax+b,结果放到运算器
  4. ( a x + b ) × x (ax + b)\times x (ax+b)×x,结果放到运算器
  5. ( a x + b ) × x + c (ax + b) \times x + c (ax+b)×x+c 还是放到运算器中

这个过程中,我们其实是把每个结果放在寄存器中,我们可以考虑一下,这些数每次都放在什么寄存器中?

由3.2节我们已经知道,本质上所有的被加数、被减数、被乘数和被除数,从存储器中拿出来的时候都是首先放到ACC了,所以第一步,x的值放到ACC;

接下来,运行乘法,想想3.2节我们怎么做的?忘了没事,再来看一遍

👉乘法

[M]->MQ

[ACC] - > X

0 -> ACC

[X] × [MQ] -> ACC//MQ

我们把存储器中拿来的数据a放入MQ,把ACC中的被乘数放到X寄存器中,将ACC置零,ALU计算乘法结果,高位写入ACC中,低位写入MQ中(但是注意为了简单,这个例子中把ACC中的结果认为就是乘法结果);

第三步,加法;

第四步、第五步

操作都是一样的,但是我们的重点不在这里,而是整个系统的工作过程。这里我们先把上面的例子对应的运算程序放出来:

3.3节有各个操作码的含义,这里不再放出。

我们看到,指令(比如0000010000001000)和数据是以同等地位放在存储器中的。

现在来看一看第一条指令的执行流程:

  1. 控制器:程序启动,PC值为0,PC的值送入MAR(MAR在存储器中),控制器命令存储器——根据MAR的地址从主存中找到对应地址的内容(我们可以看到,0位置上是一条指令)送到MDR

  2. MDR把内容(000001 0000001000)又送回控制器,不过这次是送回IR,也就是指令寄存器,寄存寄存,就是暂时存着。

  3. 读完一条指令或者一个数据,PC加1变成1了,地址指向了主存的下一个存储单元。

  4. CU对IR的内容分析,现在读出的指令为000001 0000001000,000001这个操作码是取数放到ACC,CU就明白了,我一会得下指令让主存取数放进ACC;0000001000这个地址码,说明了我取数要取哪个地址里面的(目前这个地址码指向的是8,也就是x这个值)。所以地址码会被送到哪里?应该是送到存储器地址寄存器MAR。而且控制器对主存说:“主存,我给你个地址,你照着这个地址把内容给我找出来送给ACC!找不出来削你!”

  5. 主存乖乖听话,照着地址找数据(或者指令),前面我们说过,这个例子的背景架构是支持MDR与ACC、MQ、X直接传递数据的,所以主存找到对应地址的数据(或者指令)x,送入MDR寄存器,有机会就写入ACC,完成这个操作。

  6. 接下来,我们继续将PC的值(此时为1)送入MAR,并对主存发出一条控制信号,读出1位置的指令(000100 0000001001),送到MDR

  7. MDR把指令送入IR,同时PC+1=2

  8. CU分析IR中寄存的指令:操作码000100,说明要做乘法;地址码0000001001,要取9号位置的数据给运算器,与运算器上一步存的值(x)做乘法。所以地址码送入MAR,同时下达读指令,读出的数据送入运算器(送到哪里?还记得不?MQ)

  9. CU继续下达指令,命令运算器进行乘法运算,得出结果,存入ACC(书上应该就暂时认为乘法结果放入ACC了,没考虑高低位,应该是为了简化流程),操作结束

到这里,本节的基本内容就结束了。