【笔记】计算机组成原理知识点
前言
计算机组成原理知识点
计算机的发展
计算机包括
输入设备:将信息转换成机器能识别的形式
运算器:算术运算和逻辑运算
存储器:存放数据和程序
控制器:指挥程序运行
输出设备:将结果转换成人们熟悉的形式
其中:主存储器、运算器、控制器组成了CPU
早期冯诺依曼机
1 | 软件: |
- 在计算机系统值,软件和硬件在逻辑上是等效的
特点
- 计算机由五大部件组成
- 指令和数据以同等地位存于存储器,可按地址访问
- 指令和数据用二进制表示
- 指令由操作码和地址码组成
现代计算机的结构
- 现代计算机以存储器为中心
1 | 软件: |
各个硬件的工作原理
主体存储器
主体存储器包括:存储体、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 | K - 2^10 |
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 | K - 10^3 |
系统整体的性能指标
- 数据通路带宽:数据总线一次所能并行传送信息的位数
- 吞吐量:指系统在单位时间内处理请求的数量
- 响应时间:指从用户计算机发送一个请求,到系统对该请求作出响应并获得它所需要的结果的等待时间
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 | 5 + 8 = 13 => 1 3 |
余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码表示的0
4,第一位都是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码中: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