1.3计算机的硬件
1.3.1 硬件组成要素
使用打算盘来说明计算机的主要组成和工作原理。给定一个算盘、一张带有横格的纸、一支笔,要求计算y=ax+b-c。下面将解题步骤记录在带有横格的纸带上:
表1.3解题步骤和数据记录在横格纸上
行数 | 解题步骤和数据 | 说明 |
---|---|---|
1 | 取数 (9)->算盘 | (9)表示第9行的数a,下同 |
2 | 乘法 (12)->算盘 | 完成a*x ,结果在算盘上 |
3 | 加法 (10)->算盘 | 完成a*x+b ,结果在算盘上 |
4 | 减法 (11)->算盘 | 完成y=a*x+b-c ,结果在算盘上 |
5 | 存数 y->13 | 算盘上的y值记到13行 |
6 | 输出 | 将算盘上的y值写出来给人看 |
7 | 停止 | |
8 | ||
9 | a | 数据 |
10 | b | 数据 |
11 | c | 数据 |
12 | x | 数据 |
13 | y | 数据 |
在电子计算机中:
**运算器**相当于算盘
**存储器**相当于纸
**控制器**相当于人的大脑(控制着整个计算过程)
|<--> 存储器
|
系 |<--> 运算器
统 |
总 |<--> 控制器
线 |
|<--> 适配器
| |
| |
输入设备 输出设备
CPU = 运算器 + 控制器
1.3.2 运算器
参见:ALU
字长:运算器的长度
1.3.3 存储器
1.3.4 控制器
参见: Control unit
控制器的任务是从内存中取出解题步骤加以分析,然后执行某种操作;
NOTE: 读取指令和读取数据都是由控制器来完成的;所以控制器需要了解指令的格式
1. 计算程序
表1.4计算y=ax+b-c的程序
指令地址 | 操作码 | 地址码 | 指令操作内容 | 说明 |
---|---|---|---|---|
1 | 取数 | 9 | (9) -> A | 将存储器9号地址的数读入到运算器A |
2 | 乘法 | 12 | (A) * (12) -> A |
完成a*x ,结果保留着运算器A |
3 | 加法 | 10 | (A) + (10) -> A | 完成a*x+b ,结果保留着运算器A |
4 | 减法 | 11 | (A) - (11) -> A | 完成a*x+b-c ,结果保留着运算器A |
5 | 存数 | 13 | A->13 | 运算器A中的结果y送入到存储器13号地址 |
6 | 打印 | |||
7 | 停止 | |||
8 | ||||
数据地址 | 数据 | 说明 | ||
9 | a | |||
10 | b | |||
11 | c | |||
12 | x | |||
13 | y |
表1.4是一个非常好的例子,这个表中展示了**指令**,数据,CPU的运算逻辑等关键内容;
NOTE : 从表1.4中可以看出,运算器的操作数需要通过**取数指令**从内存中加载到**运算器**中;表1.4还展示处理,运算器在执行运算指令,如**乘法指令**,**加法指令**等的时候,产生的运算结果是保留在运算器中,需要执行**存数指令**才能够将**运算器**中的数据写入到内存中;这其实非常是符合Load–store architecture的。
2. 指令的形式
每条指令需要明确地告诉控制器,从存储器的哪个单元取数,并进行何种操作;这样一来,可知指令的内容由两部分组成:操作的性质和操作数的地址;前者为**操作码**,后者为**地址码**;
操作码|地址码
指令的**操作码**和**地址码**都可以使用**二进制代码**来进行表示,这就是**指令的数码化**;指令**数码化**以后,就看可以和数据一样存入到**存储器**中(Stored-program computer);存储器的任何位置既可以存放数据也可以存放指令,不过一般将指令和数据分开存放。控制器**依据存储的程序来控制全机协调地完成计算任务叫做**程序控制。
按照Von Neumann architecture的思想,指令和数据(如果不清楚两者的差别,去看表1-4)存放在同一个存储器中,**控制器**按照stored program的**地址顺序**进行执行;
按照Harvard architecture的思想,将指令和数据分别存放在两个存储器中;
一台计算机通常有几十种基本**指令**,从而构成该计算机的**指令系统**。**指令系统**不仅是**硬件设计**的依据,而且是**软件设计**的基础。因此**指令系统**是衡量**计算机性能**的一个重要指标。
3. 控制器的基本任务
由表1-4可知,计算机在进行计算的时候,**指令**必须是按照一定的**顺序**一条接着一条的进行;
控制器**的基本任务就是按照计算机程序所排的指令序列,先从**存储器**中取出一条指令放到**控制器**中,对该**指令**的**操作码**由**译码器**进行分析判断,然后根据**指令性质(即该指令要做什么运算),执行这条指令;接着从存储器中取出第二条指令,再执行第二条指令。以此类推。
通常,将取指令的这段时间叫做**取指周期**,而把执行指令的一段时间叫做**执行周期**。因此控制器反复交替地处于取指周期和执行周期之中;
每取出一条指令,控制器中的**指令计数器**就加1,从而为下一条指令做好准备,这就是为什么指令在存储器中是顺序存放的原因;
4. 指令流和数据流
我们使用bit来作为计算机的最小信息单位。
当CPU向存储器送入或者从存储器中取出信息时,往往是存取byte(字节)和Word(字)等较大信息单位,而不是bit;通常将组成一个Word的二进制位数叫做**字长**;
NOTE: 这应该是我们需要进行地址对齐的原因所在;
NOTE: 这部分内容在4.2.3 **指令字长度**章节也进行了介绍;
由于计算机使用的信息既有指令又有数据,所以**计算机字**既可以代表**指令**,也可以代表**数据**;如果某字代表的是要处理的数据,则称为**数据字**;如果某字为一条指令,则称为**指令字**;
我们看到,指令和数据统统都存放在内存中,从形式上来看,它们都是二进制数码,似乎很难分清楚哪些是**指令字**,哪些是**数据字**;那这就引出了一个问题:控制器是如何区分开哪些是**指令字**,哪些是**数据字**的?答案为:取指周期**中,从**内存**读出的**信息流**是**指令流,它流向**控制器**;执行周期**中从内存中读出的**信息流**为**数据流,它由内存流向**运算器**;显然,某些指令进行过程中,需要两次访问内存,一次是取指令,另一次是取数据,如表1.4中取数、乘数、加法、减法、存数指令就是如此;
1.3.5 适配器与输入输出设备
计算机系统中必须有**总线**,系统总线**是构成计算机系统的骨架,是多个系统部件之间进行数据传输的公共通路;借助**系统总线,计算机在系统部件之间实现传送地址、数据和控制信息;