【笔记】计算机组成原理知识点

前言

计算机组成原理知识点

计算机的发展

计算机包括

  • 输入设备:将信息转换成机器能识别的形式

  • 运算器:算术运算和逻辑运算

  • 存储器:存放数据和程序

  • 控制器:指挥程序运行

  • 输出设备:将结果转换成人们熟悉的形式

  • 其中:主存储器、运算器、控制器组成了CPU

早期冯诺依曼机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
软件:

由软件提供数据传递给硬件进行运算

---

硬件:

输入设备->运算器

运算器<->存储器
运算器<->控制器

运算器->输出设备
  • 在计算机系统值,软件和硬件在逻辑上是等效的

特点

  • 计算机由五大部件组成
  • 指令和数据以同等地位存于存储器,可按地址访问
  • 指令和数据用二进制表示
  • 指令由操作码和地址码组成

现代计算机的结构

  • 现代计算机以存储器为中心
1
2
3
4
5
6
7
8
9
10
11
12
13
14
软件:

由软件提供数据传递给硬件进行运算

---

硬件:

输入设备->存储器

存储器<->运算器
存储器->控制器

存储器->输出设备

各个硬件的工作原理

主体存储器

  • 主体存储器包括:存储体、MAR(Memory Address Register)、MDP(Memory Data Register)

  • MAR:存储地址寄存器

  • MDR:存储数据寄存器

主存储器的基本组成

  • 存储单元:每个存储单元存放一串二进制代码
  • 存储字:存储单元中二进制代码的组合
  • 存储字长:存储单元中二进制代码的位数
  • 存储元:即存储二进制的电子元件,每个存储元可以存1bit数据

运算器

运算器的组成

  • ACC(Accumulator):累加器。用于存放操作数或运算结果
  • MQ(Multiple-Quotient Register):乘商寄存器。在乘、除运算时,用于存放操作数或运算结果
  • X:通用的操作数寄存器。用于存放操作数
  • ALU(Arithmetic and Logic Unit):算术逻辑单元。通过内部复杂电路实现算数运算、逻辑运算

控制器

控制器的组成

  • CU(Control Unit):控制单元。分析指令,给出控制信号
  • IR(Instruction Register):指令寄存器。存放当前执行的指令
  • PC(Program Counter):程序计数器。存放下一跳指令地址,有自动加1功能

完成一条指令的过程

  • 通过PC取指令->通过IR分析指令->通过CU执行指令

计算机的性能指标

存储器的性能指标

  • B、KB、MB、GB、TB、EB、PB
1
2
3
4
5
6
K - 2^10
M - 2^20
G - 2^30
T - 2^40
P - 2^50
E - 2^60

CPU的性能指标

  • GHz:CPU的主频。CPU内数字脉冲信号震荡的频率

  • CPU主频(时钟频率) = 1 / CPU时钟周期

  • CPI(Clock cycle Per Instruction):执行每一条指令所需的时钟周期

  • 执行一条指令的耗时 = CPI * CPU时钟周期

  • IPS(Instructions Per Second):每秒执行多少条指令

  • FLOPS(Floating-point Operations Per Second):每秒执行多少次浮点运算

1
2
3
4
K - 10^3
M - 10^6
G - 10^9
T - 10^12

系统整体的性能指标

  • 数据通路带宽:数据总线一次所能并行传送信息的位数
  • 吞吐量:指系统在单位时间内处理请求的数量
  • 响应时间:指从用户计算机发送一个请求,到系统对该请求作出响应并获得它所需要的结果的等待时间

BCD码(数字在计算机中的表示方式)

  • 使用二进制来进行编码的十进制数表示方式

8421码

  • 一组4位的8421码的二进制数各位上的权值分别是8、4、2、1,所以8421码属于有权码
0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

加法运算

  • 例如十进制的5+8运算

  • 如果二进制的加法结果不在8421码的合法区间内,需要加十进制的6(二进制的0110)来修正

1
2
5 + 8 = 13 => 1 3
0101 + 1000 = 1101 => 0001 0011

余3码

  • 在8421码的基础上加十进制的3(二进制的0011)
  • 余3码各位上没有固定的权值,所以余3码属于无权码
0 1 2 3 4 5 6 7 8 9
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100

2421码

  • 一组4位的2421码的二进制数各位上的权值分别是2、4、2、1,所以2421码属于有权码

  • 2421码的规定(特点):2421码表示的04,第一位都是0;2421码表示的59,第一位都是1

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

字符与字符串(字符和字符串在计算机中的表示方式)

英文

  • 英文及英文格式的特殊符号加起来不超过128个,所以用七进制的ASCII编码来表示足够用,为了存入计算机,通常在最高位补一个0凑齐8bit,也就是1Byte

ASCII码表

  • 在ASCII码中:0~31属于通信字符;32、127属于控制字符;33~126属于印刷字符

数字字符的规律

  • 48(0011 0000)~57(0011 1001)为数字字符,分别对应数字0~9

    • 规律:可以发现,所有数字字符前4位都是0011,而后四位都对应8421码的十进制数字0~9

大写字母字符的规律

  • 65(010 00001)~90(010 11010)为大写字母,分别对应大写字母A~Z

    • 规律:可以发现,所有大写字母字符前3位都是010,而后5位都对应8421码的十进制数字0~26

小写字母字符的规律

  • 97(011 00001)~122(011 11010)为小写字母,分别对应小写字母a~z

    • 规律:可以发现,所有小写字母字符前3位都是011,而后5位都对应8421码的十进制数字0~26

中文

GB2312

  • GB2312是中国80年代开发的一种编码机制,中文和中文符号一共7445个
  • GB2312的编码方式采用2个Byte表示1个中文,这2个Byte的数据其实就是区位码
    • 第1个Byte是区码,第2个Byte是位码,这两个字节的数据分别映射为区位码表(一个放有中文字符的二维表)的横坐标和纵坐标
    • 得到的区位码分别将第1个Byte和第2个字节分别加上32(20H)从而得到国标码
      • 这样做是为了避开ASCII码中的通讯字符
    • 再在国标码的基础上别将第1个Byte和第2个字节分别加上128(80H)从而得到汉字机内码
      • 这样做是为了避开ASCII码中的英文及符号字符

校验

  • 为了防止传输时出错,在每个字符前端增加一个字节作为校验码
  • 由合法的校验码和数据组成的字叫码字
  • 将两个码字逐位进行对比,具有不同的位的个数称为两个码字之间的距离
  • 一种编码方案可能有若干个合法码字,各合法码字间的最小距离成为码距

奇偶校验码

  • 奇校验码:整个校验码中1的个数为奇数

  • 偶校验码:整个校验码中1的个数为偶数

  • 如果有偶数个位发生跳变,奇偶校验码是被办法发现错误的

  • 硬件实现偶校验:各字节进行异或运算,结果得到校验位即为正确

海明校验码

  • 海明码校验位的个数满足:2^k >= n+k+1,其中n为信息位个数,k为校验位个数
n 1 2-4 5-11 12-26 27-57 58-120
k 2 3 4 5 6 7
  • 海明码的校验位应放在2^(i-1)位置上

  • 海明码在最前面加了一个字节作为全校验位,用于校验整个海明码

  • 海明码具有1位纠错和2位检错能力

循环冗余校验码(CRC码)

  • 传输前通过约定一个除数,在接收的时候检查余数是否发生了改变,从而实现了校验

定点数与浮点数

  • 定点数与浮点数都是小数的表示方法

  • 定点数的小数点位置固定

  • 浮点数的小数点位置不固定

数字的编码方式

原码

  • 原本的二进制表示的十进制数

反码

  • 将原码中的各位取反就得到了反码
  • 反码是用来将原码转换为补码的中间值

补码

  • 在反码的基础上加1就可以得到补码
  • 补码用作使用加法来运算减法

移码

  • 将补码的符号位取反就得到了移码
  • 移码用作正负数的大小比较

算数运算

算数移位

原码的算数移位

  • 原码的算数移位,符号位保持不变,仅对数值位进行位移
    • 右移:高位补0,低位舍弃(若舍弃的位为0,则相当于除以2;若舍弃的位不为0,则会丢失精度)
    • 左移:低位补0,高位舍弃(若舍弃的位为0,则相当于乘2;若舍弃的位不为0,则会出现严重误差)

反码的算数移位

  • 反码正数的算数移位与原码的算数移位相同

    • 右移:高位补0,低位舍弃
    • 左移:低位补0,高位舍弃
  • 反码负数的算数移位与原码相反

    • 右移:高位补1,低位舍弃
    • 左移:低位补1,高位舍弃

补码的算数移位

  • 补码正数的算数移位与原码的算数移位相同

    • 右移:高位补0,低位舍弃
    • 左移:低位补0,高位舍弃
  • 补码负数的算数移位末尾+1。补码负数中:最右边的1及其右边同原码相同;最右边的1的左边同反码相同

    • 左移(同反码):高位补1,低位舍弃
    • 右移(同原码):低位补0,高位舍弃

逻辑移位

  • 逻辑移位可以被看作是无符号数的算数移位

  • 逻辑右移:高位补0,低位舍弃

  • 逻辑左移:低位补0,高位舍弃

循环移位

  • 循环左移:会把最左边的数值放到最右边,其他位向左移
  • 循环右移:会把最右边的数值放到最左边,其他位向右移

带进位位的循环移位

  • 循环左移:会把进位位的数值放到最右边,其他位向左移
  • 循环右移:会把最右边的数值放到进位位,其他位向右移

加减运算

原码的加减运算

原码的加法运算

  • 正+正:绝对值做加法,结果为正
  • 负+负:绝对值做加法,结果为负
  • 正+负负+正:绝对值大的减绝对值小的,符号同绝对值大的数

原码的减法运算

  • 先将减法转化为加法运算,再进行加法运算

补码的加减运算

补码的加法运算

  • 先将原码转换为补码,再用补码直接运算,最后将结果转化为原码
  • 这样的好处是可以直接让符号位参与运算

溢出

  • 上溢:运算的结果超过正整数的最大值
    • 只有正整数+正整数才会造成上溢,所以当正整数+正整数=负整数时就造成了上溢
  • 下溢:运算的结果低于负整数的最小值
    • 只有负整数+负整数才会造成下溢,所以当负整数+负整数=正整数时就造成了下溢

判断溢出

方法一

AS:第一个数
BS:第二个数
SS:两个数的和
&:与运算
|:或运算
!:非运算

1
V=(AS & BS & !SS) | (!AS & !BS & SS)
  • 当V=0时,表示无溢出;当V=1时,表示有溢出
方法二
  • 当两个数求和,进位位和符号位求异或运算
    • 如果结果为0,表示无溢出;如果结果为1,表示有溢出
方法三
  • 将一个符号为改为两个符号位,正数为00,负数为11
    • 当就和结果的符号位为01时,表示发生了上溢;当求和结果的符号为为10时,表示发生了下溢

避免溢出

  • 通过符号扩展的方式来解决溢出问题
  • 当扩展数据类型的大小时,扩增空间的补位规则如下

整数

  • 扩增空间在符号位的下一位开始

  • 原码:扩增空间全部用0补位

  • 反码:扩增空间全部用1补位

  • 补码:扩增空间全部用1补位,末尾加1

小数

  • 扩增空间在末位下一位开始
正小数
  • 原码、反码、补码:扩增空间全部用0补位
负小数
  • 原码:扩增空间全部用0补位
  • 反码:扩增空间全部用1补位
  • 补码:扩增空间全部用1补位,末尾加1

乘法运算

原码一位乘法

  • 原码运算时,符号位不参与运算
  • 每次运算时,判断乘数的最低位
    • 如果最低位为1,则将被乘数累加;如果最低位为0,则不累加被乘数
  • 累加后,将乘数和累加和右移1位
    • 原码的右移是逻辑右移,符号位也向右移,高位用0补位,低位舍弃
  • 然后进入下一次循环
  • 最终结果就是两数相乘的乘积

补码一位乘法

  • 补码运算时,符号位也参与运算
  • 将乘数末尾多扩增1位,这个位叫辅助位
  • 副主委初始值为0,每次右移时会被辅助位(最低位)前一位顶替辅助位
  • 因为乘数扩增了1位,被乘数也扩增1位,但是是在最高位扩增1位,此时被乘数采用双符号位
  • 每次运算时,用辅助位 - 辅助位前一位
    • 辅助位 - 辅助位前一位 = 1时,再次累加乘数
    • 辅助位 - 辅助位前一位 = 0时,不累加乘数
    • 辅助位 - 辅助位前一位 = -1时,再次累加负的乘数
  • 累加后,将乘数和累加和右移1位
    • 补码的右移是算数右移,符号为不移位,高位补位时:如果是正数用0补位;如果是负数用1补位,低位舍弃
  • 然后再来一次加法,然后再进入下一次循环
  • 最终结果就是两数相乘的乘积

除法运算

原码的除法

恢复余数法

  • 原码运算时,先将商的末位改成1
  • 然后将除数与当前的余数求差(由于运算器无法计算减法,所以将除数与当前余数补码的相反数求和),将结果放到当前的余数
    • 如果得到的结果是正数,则继续下一步运算
    • 如果得到的结果是负数,则将商的末位改回0,再重新将除数与当前的余数求和,得到求差之前的结果,存到当前的余数
  • 当前的余数确定结果后,将商和当前的余数都逻辑左移一位,低位补0,然后进入下一次计算
  • 计算完结果后,判断符号位
    • 将两个数进行异或运算
  • 最终结果就是两数相除的商

加减交替法(不恢复余数法)

  • 原码运算时,先将商的末位改成1
  • 然后将除数与当前的余数求差(由于运算器无法计算减法,所以将除数与当前余数补码的相反数求和),将结果放到>
    当前的余数
    • 如果得到的结果是正数,则将商和当前的余数都逻辑左移一位,低位补0,然后进入下一次计算
    • 如果得到的结果是负数,则将商的末位改回0,将余数逻辑左移一位,低位补0,再加上除数的绝对值,然后进入下一次计算
    • 如果最后一次运算后,得到的结果为负数,则将商的末位改回0,再重新将除数与当前的余数求和,得到求差之前的结果,存到当前的余数
  • 计算完结果后,判断符号位
    • 将两个数进行异或运算
  • 最终结果就是两数相除的商

补码的除法运算

加减交替法

  • 补码运算时,符号位也参与运算
  • 补码运算时,余数与除数采用双符号位
  • 首先判断余数与除数是否同号
    • 如果同号,则将商的末位改为1,余数左移一位,余数减去除数
    • 如果异号,则将商的末位改为0,余数左移一位,余数加上除数
  • 最终结果就是两数相除的商

C语言中的强制类型转换

  • 无符号数与有符号数转换时,不改变数据内容,只改变解释方式
  • 长整数变短整数时,高位截断,保留低位
  • 短整数变长整数时,符号扩展

浮点数

浮点数的表示

  • +阶码+尾数

  • 阶码:常用补码或移码表示的定点整数

  • 尾数:常用原码或补码表示的定点小数

  • 阶码反应浮点数表示范围及小数点的实际位置

  • 尾数的数值部分的位数反应浮点数的精度

浮点数的规格化

  • 规格化浮点数规定:尾数的最高位必须是一个有效值

  • 左规:当浮点数运算的结果为非规格化时,要进行规格化处理,将尾数算数左移1位,阶码减1

  • 右规:当浮点数运算的结果为非规格化时,要进行规格化处理,将尾数算数右移1位,阶码加1

  • 采用双符号位,当溢出发生时,可以挽救(更高的符号位是正确的符号位)

用原码表示尾数进行规格化

  • 规格化的原码尾数,最高数值位一定是1
正数
  • 0.1xxx
  • 最小值为0.100…0
负数
  • 1.1xxx
  • 最小值为1.111…1

用原码表示尾数进行规格化

  • 规格化的补码尾数,符号位与最高数值位一定相反
正数
  • 0.1xxx
  • 最小值为0.100…0
负数
  • 1.0xxx
  • 最小值为1.000…0

完成

参考文献

哔哩哔哩——王道论坛