章节一览

计算机组成原理知识点比较多,所以分多部分复习。本篇是第一部分,复习计算机的结构和计算机中数值的表示与计算。

计算机系统概述

数据的表示和运算

指令系统

中央处理器(重点)

存储的分层体系结构(重点)

互联及输入输出设备


计算机系统概述

计算机系统由硬件和软件组成。软件包括系统软件和应用软件。我们研究的是计算机硬件。

计算机硬件的历史?

  1. 1946年第一台数字电子计算机ENIAC(埃尼阿克),它使用的逻辑元件为电子管,体积很大。需要注意冯诺依曼是顾问而不是发明者。(电子管时代:1946-1957)
  2. 1958年出现了晶体管计算机(晶体管时代:1958-1964),这时也出现了第一个高级语言FORTRAN
  3. 1964年出现了集成电路计算机(中小规模集成电路:1965-1971)
  4. 1972年至今,大规模、超大规模集成电路时代,微处理器(如CPU)开始出现。目前计算机的发展趋势:一是向着更微型、多用途发展,二是向着更巨型、超高速发展。

这个过程比较有趣的就是Intel和AMD的历史了,可以去了解下。

冯诺依曼计算机的思想?

  1. 计算机由五大部件(运算器、存储器、控制器、输入和输出设备)组成。

    image-20220606105238330

  2. 指令和数据以同等地位存储在存储器中,并可按地址寻访。

  3. 指令和数据均以二进制表示

  4. 指令由操作码和地址码组成。

  5. 指令在存储器中按顺序存放。(存储程序)

此外,早期的计算机以运算器为中心;现代的计算机以存储器为中心。运算器和控制器集成在一起就是CPU:CPU=运算器+控制器

计算机各部件的功能?

  1. 主存储器:存放程序和数据

    主存储器包括存储体、MAR(地址寄存器)、MDR(数据寄存器)。但是,MAR与MDR通常是存在于CPU中的。其中MAR的位数反映了寻址空间的大小,MDR反映了机器的字长。

    需要知道的概念:

    ① 存储单元:每个地址都对应一个存储单元

    ② 存储字:存储单元存储的二进制代码

    ③ 存储字长(word):存储字的位数,通常为比特的偶数倍

  2. 运算器:执行算数和逻辑运算

    运算器除了算数逻辑单元(ALU)外,还有有些比较重要的寄存器用于暂存,如:累加器(ACC)、乘商寄存器(MQ)、通用寄存器(X)、基址和变址寄存器(BX和IX)……

  3. 控制器:计算机的指挥中心

    控制器包括控制单元CU、程序计数器PC、指令寄存器IR

    CU:分析指令,并给出相应的控制信号

    ②IR:存放当前的指令

    ③PC存放下一条指令的地址,取出一条指令后自动加1

    可以看出完成一条指令的过程:取指部件到PC指向的地址取指令放到IR中,CU分析IR中的指令后产生控制信号来控制各部件的行为。

加上输入输出设备后,计算机的模型概括如下:(GPRS为通用寄存器组)

image-20220606113133104

其中CPU通过三条总线实现与内存的数据流通。地址线和数据线顾名思义,控制线传入读信号或写信号。

计算机的性能指标?

  1. 存储器性能指标——计算存储器的总容量

    总容量=存储单元数$\times$每个存储单元的大小。其中存储单元数可由MAR的位数反映出存储单元最多的个数;存储单元大小等于存储字长。如MAR为16位,MDR为32位,那么存储器总容量最大为$2^{16}\times 32bit=256KB$。

  2. CPU的性能指标

    主频和CPU时钟周期时钟周期是CPU最小的时间单位,每个动作至少需要一个时钟周期。主频是时钟周期的倒数,主频越高,执行指令的速度越快,一般单位为GHz

    ②平均CPI:执行一条指令的平均时钟周期数。

    由上面两个指标可以计算得到CPU执行含有N条指令的程序所需要的时间$t=N\times (CPI\times T)$。

    此外,还有IPS(每秒钟执行的指令数)、FLOPS(每秒执行多少浮点运算)等。

  3. 系统整体的性能指标

    ①几个字长:机器字长、指令字长、存储字长,它们三个可以不等

    1. 机器字长:CPU能一次处理的二进制位数,一般等于内部寄存器的大小
    2. 指令字长:一条指令中包含的二进制代码的长度
    3. 存储字长:一个存储单元存储的二进制代码的长度

    数据通路带宽是指数据总线一次能够传输的数据位数。它可能不等于CPU的机器字长。

    吞吐量是指单位时间内处理请求的数量。它主要取决于主存的存取周期

  4. 使用基准程序来衡量,就是通常说的跑分软件。


数据的表示和运算

各进制之间的转换?

  1. 二进制和八进制、十六进制之间的转换:分组即可,不够补0。

  2. 任意进制转十进制:按权展开,注意计算权的指数为位数-1

  3. 十进制转任意进制:基数乘除法——整数和小数部分分别处理:整数部分除基取余,小数部分乘基取整。注意一个十进制小数不一定能转换为二进制小数

    image-20220606164400192

为什么先是发明十进制?因为10根手指,习惯于逢十进一。

BCD(Binary-Coded Decimal)码?

BCD码就是用二进制来表示十进制的编码,包括8421码、余三码、2421码。它们都是将十进制与4位二进制进行映射,只是映射方式不同。8421码和2421码都是有权码,余三码是无权码。

  1. 8421码:从低到高权值分别为1、2、4、8。
  2. 余三码:从0011开始编码,在8421码的基础上加三。
  3. 2421码:权值之和刚好为9。特点是5以下二进制最高位都为0,5以上都为1。

真值?机器码?定点数的原码、反码、补码、移码表示?ASCII码?

  1. 真值就是一个数的实际值,如-5、7等。我们平常说的都是真值。
  2. 机器码就是将数的大小和符号(有符号数)一起表示为二进制(机器化)后的编码。对于有符号数,常用的编码方式有原码、反码和补码。

  3. 原码就是用一位来代表符号,其余位代表大小的表示方式。正数的符号位为0,负数为1。

  4. 正数的反码和原码相同,负数按位取反。

  5. 正数的补码和原码相同,负数在原码的基础上按位取反+1,或者是$2^n-1$。这是模$2^n$后的结果。

    image-20220608113233410

  6. 移码在补码的基础上将符号位取反即可,它只能表示整数。它的定义是真值+偏移值,而偏移值一般(默认都是)取$2^{n-1}$,所以通常有这个规律。

  7. ASCII码是用八位二进制数来表示字符的一种编码。需要记住的是0-9的ASCII码为48-57;A-Z的ASCII码为65-90;a-z的ASCII码为97-122

定点数的运算?

  1. 补码加减法

    $[A+B]_\text{补}=[A]_\text{补}+[B]_\text{补}$

    $[A-B]_\text{补}=[A]_\text{补}+[-B]_\text{补}$

    一般知道的是A、B的真值。首先可以计算出A、B的补码,-B的补码可以由B的补码按位取反加一得到。

  2. 溢出的判别

    讨论加法。如果参与运算的两个数同号,结果的符号发生改变,那么说明结果溢出了。溢出的标志为O,A的符号为$A_s$,B的符号为$B_s$,运算结果的符号为$S_s$,那么O的逻辑表达式为:$O=\overline {A_sB_s}S_s+A_sB_s\overline {S_s}$。

  3. 使用双符号位判断溢出

    在计算时使用双符号位来表示,正数为00,负数为11,结果的符号:

    image-20220608145626207

计算机中的数据存储和排列?大小端模式?边界对齐?

  1. 大小端模式:现代计算机一般按字编址,而我们用的数据类型一般会占多个字节,且是连续的。根据内存中字节的排列顺序,可以分为:

    1. 大端方式:最高有效字节放在低地址,最低有效字节放在高地址。
    2. 小端方式:最高有效字节放在高地址,最低有效字节放在低地址。

    image-20220608115057217

  2. 边界对齐模式:计算机可以按字节1B、半字2B和字4B寻址。为了使数据按字节、按半字和字寻址都能一次取出,会浪费一些位置来填充——这是典型的以空间换时间的思想:

    image-20220608115541830

大小端模式和边界对齐模式并不矛盾,二者并存。

常见的校验码:奇偶校验码、海明码、循环冗余码?

(一)首先要知道码字和码距的概念:

  1. 码字就是编码中的若干位代码组成的一个字,包括合法码字非合法码字

  2. 码距就是合法码字间的最小距离(不同的比特数)。

    image-20220608094816993

    如这样的编码,合法码字4个,非合法码字也有4个,码距d为2.

当码距为1时,无检错能力;码距为2时,有检错能力;码距≥3时,可能具有检错和纠错能力。

(二)奇偶校验码

奇偶校验码使用了一位作为检错位,码距为2,具备检错能力。规则为:奇校验码中1的个数为奇数;偶校验码中1的个数为偶数。它的特点是只能检测出奇数个数的比特差错。

计算机计算校验位或进行验证的时候,只需要进行异或(模2加)运算即可:

image-20220608102106243

  1. 发送方计算校验位:由于奇偶校验码关注的是1的个数,而奇数个1的异或为1,偶数个1的异或为0,0的异或始终为0,同时异或运算满足交换律。所以对于奇校验码,异或结果为1,校验位为0;对于偶校验码,异或结果为1,校验位为1。
  2. 接收方进行校验:对所有位进行异或。对于奇校验,若结果为1,则判定无误;对于偶校验,若结果为0,判定无误。

(三)海明校验码

海明码实际上是一种多重偶校验码。它具有2位的检错能力和1位的纠错能力。使用步骤如下:

  1. 确定校验位的位数

    设校验位有k位,求解公式$2^k\ge n+k+1$(n为信息位的位数)即可。$n+k+1$代表了信息位或校验位发生一位比特错误,或全部正确的情况。

  2. 确定校验位的位置

    将校验位记作$P_{k}P_{k-1}…P_1=P_i(k\ge i >0)$,那么它们分别分布在$2^{i-1}$的位置:

    image-20220608105429055

  3. 计算校验位的值

    信息位的位置码$H_i$进行分组:第一位是1的归到P1的分组,第二位是1的归到P2的分组……然后对各个分组的信息位的值进行异或运算(求偶校验码),就得到了对应校验位的值:

    image-20220608105912427

  4. 进行检错和纠错

    最后对每个分组进行偶校验,如果k个分组的偶校验都是0,即$S_kS_{k-1}…S_1=0$,那么就认为正确;如果不为0,那么$S_kS_{k-1}…S_1$指出的就是出错的位置。

(四)循环冗余码CRC

CRC码的特点是具有很强的检错能力,能检测出多位比特错误,应用广泛。

计算步骤如下:

  1. 确定生成多项式的二进制码、并在信息码末尾补R个0。(R=多项式最高次数)
  2. 进行模2除法,得到R位的余数。
  3. 将信息位后面的R位0换成余数。
  4. 检验的时候接收方也进行模2除法:如果余数为0,那么确认无误;如果余数不为0,且生成多项式选的好的话,就有纠错的能力

浮点数的表示?

  1. 浮点数的表示方法:类比科学计数法$N=r^E\times M$,可以用阶码+尾数两部分来表示一个浮点数(r=2):

    image-20220608165147129

    阶码和尾数均由符号位和数值位组成,其中阶码为一个定点整数,尾数为一个定点小数。阶码的符号和位数共同反映浮点数的表示范围和小数点的实际位置;数符代表整个浮点数的符号;尾数的位数反映出浮点数的精度

  2. 浮点数的规格化:规格化浮点数的尾数的最高数位必须是一个有效值,这样可以充分利用尾数的有效数位。

    需要掌握各编码方式下规格化浮点数的尾数形式

    1. 原码:
      • 正数:0.1×××
      • 负数:1.1×××
    2. 补码:
      • 正数:0.1×××
      • 负数:1.0×××

    尾数绝对值的大小必须在0.5~1之间。如果在这个范围之外:

    1. 大于[0.5,1):右规,尾数算数右移一位,阶码加1。
    2. 小于[0.5,1):左规,尾数算数左移N位,阶码加N。

    image-20220608171521299

IEEE 754标准的浮点数?

IEEE 754标准统一了浮点数的表示格式,将一个浮点数分为数符、阶码和尾数三个部分。

  1. 数符代表了整个浮点数的符号
  2. 阶码用移码表示,偏移值为$2^{n-1}-1$(n为阶码位数);
  3. 尾数用原码表示,因为原码的规格化表示最高有效位必定为1,所以隐含不写

image-20220608173944473

浮点数有不同的长度,对应阶码和尾数的长度也不相同(需要记住):

image-20220608174316809

据此可以判断出floatdouble的表示范围(-128和-127做特殊用途,从-126开始)

image-20220608174617205

另外还需要掌握从十进制小数到IEEE 754浮点数的转化:

image-20220608175319380

浮点数的加减运算?

  1. 对阶:先求阶差,然后小阶向大阶对齐,然后小阶的尾数右移。小阶向大阶对齐的原因是右移舍去的是低位,对整体的影响不大;而左移就可能舍去高位,产生较大误差。

  2. 尾数加减

  3. 规格化处理:无左溢右,左减右加。使用两位符号位的好处是溢出了可以恢复。

    image-20220608193909299

  4. 舍入处理:对阶或右规时,会移掉尾数低位的数值,这时的舍入常用”0舍1入法”。

  5. 判断溢出:用于判断结果是否正确。浮点数是否溢出看的是阶码部分,而阶码是定点整数,和之前定点数的判溢出方法相同。

    image-20220608201110230

加法器的设计?

  1. 一位全加器:输入为本位的两个数$A_i、B_i$和来自低位的进位$C_{i-1}$,输出为本位的和$S_i$和向高位的进位$C_i$,逻辑表达式为:

    由此设计电路图,并对其进行封装

  2. 串行进位的并行加法器:并行的意思是一次可以有多个输入,串行进位的意思是通过进位接口将n个一位全加器连接起来:

    image-20220608191935522

    高位依然要等待低位的进位,这样的并行实则是伪的。

  3. 并行进位的并行加法器:它无需等待低位的进位即可算出本位的和,但是逻辑表达式后面会很复杂。(了解即可)