计算机组成原理复习
计算机组成原理期末复习大纲
大纲
这份复习大纲是根据老师最后一节课的录音转写以及群内通知整理而成的。老师的讲解非常具体,甚至点出了具体的页码、图表号和例题号。
以下是为你整理的《计算机组成原理》期末复习大纲:
一、 考试形式与分值分布
- 总分:100分(期末成绩占总评60%)
- 填空题:15分(1分/空)
- 选择题:20分(2分/题)
- 综合应用题(大题):65分(共7道大题)
- 提示:大题主要分布在第6、7、8、9、10、11章。
二、 章节详细复习大纲
第1章:计算机系统概论
- 核心图表:
- 图1.2:计算机硬件组成(CPU构成)。
- 图1.3:冯·诺依曼体系结构 vs 哈佛结构。
- 重点理解:冯·诺依曼结构中程序和数据放在一起,哈佛结构是分开的。
- 图1.4:模型机架构(核心图,必须会画,第6章的基础)。
- 性能指标:
- 主频、字长。
- 存储容量单位换算:KB ($2^{10}$), MB ($2^{20}$), GB ($2^{30}$), TB ($2^{40}$)。
第2章(补充在第7章讲授):数值与编码
- 数制转换:
- 熟练掌握二进制、八进制、十六进制转换(表2.1,熟悉0-30以内的对应关系)。
- 机器数与真值:
- 区分机器数(带符号位)和真值(实际数值)。
- 原码、反码、补码、移码:重点掌握补码和移码的转换规则。
- 数据类型与范围:
- 表2.2:不同位数(8位、16位、32位)无符号数和有符号数的表示范围。
- 举例:16位补码范围 $-32768 \sim +32767$(全0到全1的推导)。
- 浮点数标准:
- IEEE 754标准(表2.4):单精度(32位)、双精度(64位)的结构。
- 编码:
- 8421 BCD码、余3码。
- ASCII码(7位)。
第6章:程序的执行
- 核心考点:程序执行过程分析。
- 复习重点:
- 图6.1(样例程序):读懂汇编伪代码,理解每条指令(Load, Add, Store, Jump)的功能。
- 结合图1.4(硬件模型),能够描述程序执行时,每一步操作中各寄存器(PC, IR, AR, DR, ALU)数值的变化。
第7章:指令系统(重点&难点)
- 指令格式:
- 图7.1:指令基本格式(操作码+地址码)。
- 操作码扩展技术(P171例题及作业题的变种,需灵活掌握)。
- 寻址方式(重中之重):
- 掌握常见寻址方式:直接、间接、立即、寄存器、寄存器间接。
- PC相对寻址:
- 计算目标地址 = PC + 偏移量D。
- 易错点:PC何时+1/+2/+4?(取决于指令长度和编址方式);偏移量D通常是补码,注意符号位扩展;跳转方向(正/负)。
- 变址寻址与基址寻址的区别。
- 指令集架构:
- CISC vs RISC:优缺点比较(7.6.1/7.6.2)。
- MIPS案例:
- 理解MIPS指令格式(R型、I型、J型)。
- 不用死记硬背指令码,但要能看懂类似表7.3中LD/ST指令的含义(特别是字、双字、半字的区别)。
第8章:中央处理器(CPU)
- 数据通路(必考):
- 图8.5:基本部件。
- 图8.12:完整单周期数据通路(核心)。
- 要求:能画出特定指令(取指、R类、Load、Store、Beqz)的数据流动路径。
- 控制器设计:
- 单周期 vs 多周期:为什么要用多周期?(比较优缺点)。
- 图8.14:多周期方案中增加的临时寄存器及其作用。
- 图8.21/8.22:状态机与硬连逻辑控制器。
第9章:微程序控制器
- 核心比较:微程序控制 vs 硬连逻辑控制(优缺点)。
- 基本原理:
- 图9.2:微程序控制器工作原理。
- 概念区分:微命令、微操作、微指令、微程序、微周期。
- 微指令设计:
- 编码方式:直接控制、最短字长、字段直接编码(掌握优缺点)。
- 格式:水平型 vs 垂直型。
- 下址形成(难点):
- 增量方式 vs 断定方式。
- 如何根据操作码映射入口地址(两级散转)。
第10章:运算方法与运算器
- 定点数运算:
- 移位运算:逻辑移位、算术移位(原/补码规则)、循环移位。
- 补码加减法:例题10.6,掌握运算规则及溢出判断(单符号位/双符号位判断)。
- 乘除法:原码一位乘(例题10.7)、原码恢复余数除法。
- 浮点数运算(必考大题):
- 例题10.13(重点):浮点加减法五步走:
- 判0。
- 对阶(小阶向大阶看齐)。
- 尾数加减(注意补码运算,是否需要符号扩展)。
- 规格化(左规/右规,注意右规通常伴随阶码+1)。
- 舍入与判溢出(截断法/0舍1入)。
- 例题10.13(重点):浮点加减法五步走:
第11章:存储器
- 存储器分类与层次:
- SRAM vs DRAM(特点、刷新方式)。
- 主存-Cache-辅存层次结构。
- 大端模式 (Big-Endian) vs 小端模式 (Little-Endian)。
- 存储器设计(大题热点):
- 容量扩展:位扩展、字扩展、字位同时扩展。
- 地址分配与片选:
- 参考作业题(11.11, 11.12)。
- 难点:给定起始地址(如80H),计算地址线连接和片选逻辑。注意地址线的高低位分配。
- 交叉存储器:高位交叉 vs 低位交叉(提高带宽)。
三、 老师强调的“避坑”指南与复习策略
- 不要死读书:不要试图把整本书重读一遍,时间来不及。要围绕上课笔记、画线重点、PPT图表复习。
- 不仅要会算,还要会“读”:
- 特别是第七章,题目可能是“阅读理解”型。给你一个陌生的指令系统定义,让你分析其执行过程。
- 第六章的伪代码要能看懂每一步寄存器的变化。
- PC值的变化:
- PC+1、+2还是+4?取决于指令字长和编址方式(按字还是按字节)。不要死记PC+4。
- 相对寻址:$PC_{new} = PC_{current} + \text{offset}$。注意offset是补码,可能需要符号扩展,计算时要小心正负。
- 浮点数运算细节:
- 建议先不规格化真值,直接转成机器数运算,最后结果再规格化。
- 右移通常用于对阶,左移通常用于规格化。
- 溢出判断是看阶码是否溢出。
- 作业题是风向标:
- 第七章作业最多,考点最灵活。
- 第十一章存储设计作业(如11.11, 11.12)要搞懂,特别是地址译码部分。
- 画图要求:
- 数据通路图(第八章)肯定要考画图或连线。
- 控制信号线不能漏画。
四、 总结性建议
- 抓大放小:理解原理逻辑(如为什么用微程序?为什么用补码?),不要纠结于过于生僻的电路细节。
- 多做例题:课本P249(10.6), P269(10.13) 等典型例题要亲手算一遍。
- 利用资源:群文件里的往年复习导向和作业答案是很好的参考。
祝你复习顺利,考试高分!
详细
没问题,我们把心态归零,假设你完全是第一次接触这门课。这一章是整个课程的“地基”,地基打牢了,后面第六章讲程序怎么跑、第八章讲CPU怎么设计,你才不会晕。
我们要解决的核心问题是:计算机到底长什么样?它是怎么工作的?怎么衡量它快不快?
一、 核心图表详解
1. 图1.2:计算机硬件组成(CPU的“五脏六腑”)
【核心概念】 现代计算机硬件遵循“五大部件”原则。你可以把它想象成一个做菜的厨房:
- 输入设备 (Input):就像买菜进货。键盘、鼠标,负责把外部的信息(食材)送进计算机。
- 输出设备 (Output):就像上菜。显示器、打印机,负责把处理好的结果(做好的菜)端给你看。
- 存储器 (Memory):就像菜架/冰箱。存放程序(菜谱)和数据(食材)。
- 运算器 (ALU - Arithmetic Logic Unit):就像砧板和炒锅。负责切菜、炒菜(加减乘除、逻辑判断),是真正干活的地方。
- 控制器 (CU - Control Unit):就像厨师长。他不动手炒菜,但他负责看菜谱,指挥什么时候切菜、什么时候下锅、什么时候出锅。
【重点:CPU是什么?】 在图1.2中,最核心的方框是 CPU (中央处理器)。
- CPU = 运算器 + 控制器 + 寄存器。
- 运算器:干苦力的(算术逻辑单元ALU)。
- 控制器:发号施令的。
- 寄存器:厨师手边的小碗(临时放一点点东西,速度极快)。
2. 图1.3:冯·诺依曼结构 vs 哈佛结构
这是两种“厨房布局”的流派,决定了计算机如何存储信息。
A. 冯·诺依曼结构 (Von Neumann Architecture)
- 特点:“大锅饭”——程序(指令)和数据放在同一个存储器里。
- 形象理解:你有一本笔记本,第1页写的是“番茄炒蛋怎么做”(指令),第2页写的是“番茄、鸡蛋”(数据)。它们混在一个本子里,通过同一条通道(总线)传输。
- 优点:省钱,结构简单,内存利用率高。
- 缺点(瓶颈):CPU想拿指令和拿数据时,必须排队,不能同时进行(因为只有一条路)。这就是著名的“冯·诺依曼瓶颈”。
- 现状:咱们用的PC机(电脑)大多基于这种思想。
B. 哈佛结构 (Harvard Architecture)
- 特点:“分家过”——程序存储器和数据存储器完全分开。
- 形象理解:你有两本本子,一本专门写菜谱(指令),另一本专门记食材清单(数据)。它们有各自独立的通道。
- 优点:速度快!CPU可以一边拿指令,一边拿数据,互不干扰。
- 缺点:结构复杂,造价高。
- 现状:单片机、DSP(数字信号处理器)、手机里的某些缓存常用这种结构。
必考点总结:
- 冯·诺依曼:指令和数据不加区分,混合存储,共享总线。
- 哈佛结构:指令和数据分开存储,独立总线。
3. 图1.4:模型机架构(核心中的核心)
这张图是第6章和第8章的“藏宝图”,必须会画,必须理解数据怎么流动。我们把它拆解成几个关键零件:
【左边:CPU内部】
- PC (Program Counter,程序计数器):
- 作用:拿着“号码牌”。它永远指向下一条要执行的指令在内存中的地址。
- 口诀:PC指路。
- IR (Instruction Register,指令寄存器):
- 作用:存放当前正在执行的那条指令。
- 口诀:IR干活。
- ALU (算术逻辑单元):
- 作用:计算器。做加减法、与或非运算。
- GPRs (通用寄存器组,如R0, R1…):
- 作用:CPU内部的小口袋,暂时存放参与运算的数(比如算 3+5,先把3和5放在寄存器里)。
- CU (Control Unit,控制器):
- 作用:指挥中心,它看一眼IR里的指令,然后发出信号控制其他部件干活。
【右边:存储器接口】 要想从内存里拿东西,必须经过两道门:
- MAR (Memory Address Register,存储器地址寄存器):
- 作用:告诉内存“我要去哪个房间(地址)找东西”。
- MDR (Memory Data Register,存储器数据寄存器):
- 作用:内存把房间里的东西拿出来,先放在MDR里;或者CPU要把东西存进内存,也先放在MDR里。
【一定要会的流程(预习第6章)】 一个最简单的“取指令”过程是这样的(结合图1.4看):
- PC 把地址传给 MAR(告诉内存去哪找)。
- 内存 根据地址找到指令,送到 MDR。
- MDR 把指令送给 IR(拿到指令了!)。
- PC 自动加1(或者加4),指向下一条。
二、 性能指标(必考计算与概念)
1. 主频 (Clock Frequency)
- 定义:CPU内部时钟的频率,也就是CPU心脏跳动的速度。
- 单位:Hz(赫兹)。常见的有 MHz ($10^6$), GHz ($10^9$)。
- 误区:主频越高一定越快吗?不一定,还得看我也能干多少活(IPC),但在本章基础概念中,通常认为主频是速度的重要指标。
2. 字长 (Word Length)
- 定义:CPU一次能处理的二进制数据的位数。
- 通俗理解:马路有多宽。
- 32位CPU:一次能处理32个0或1。
- 64位CPU:一次能处理64个0或1。
- 影响:字长越长,计算精度越高,能访问的内存也越大。
3. 存储容量单位换算(填空/选择题必考)
计算机是二进制的世界,所以进位不是1000,而是 $2^{10} = 1024$。 请死记硬背以下公式:
- 基本单位:
- Bit (b, 比特):最小单位,一个0或一个1。
- Byte (B, 字节):1 Byte = 8 bits(注意大B和小b的区别)。
- 进位阶梯 ($2^{10} = 1024$):
- 1 KB (Kilo) = $2^{10}$ Bytes = 1024 B
- 1 MB (Mega) = $2^{20}$ Bytes = 1024 KB
- 1 GB (Giga) = $2^{30}$ Bytes = 1024 MB
- 1 TB (Tera) = $2^{40}$ Bytes = 1024 GB
- 考试常见坑题:
- 问:4GB的内存有多少个字节?
- 答:$4 \times 2^{30}$ 字节 = $2^2 \times 2^{30} = 2^{32}$ 字节。
- 问:如果地址线有32根,能寻址多大空间?
- 答:$2^{32} = 4 \text{GB}$。
总结一下复习套路(针对第一章)
- 脑子里要有图:闭上眼能想象出 图1.4 里 PC、IR、ALU、MAR、MDR 怎么连线的。
- 分清两个结构:冯·诺依曼(混着放) vs 哈佛(分开正)。
- 算对2的次幂:看到KB想到10次方,MB是20次方,GB是30次方,TB是40次方。
现在你对第一章的框架有感觉了吗?如果觉得哪里还抽象,可以随时打断我!
好的,我们继续“清零”心态。这一章其实就是教你“怎么把人类世界的数字,翻译成计算机能听懂的0和1”。
这部分内容非常枯燥,全是0和1变来变去,但它是做计算题(特别是第10章运算器)的绝对前提。
一、 数制转换:计算机的“语言基础”
计算机只认识二进制,但人类习惯十进制,写代码时为了简便又常用十六进制。
1. 核心规则:二进制、八进制、十六进制的互转
不要去死记复杂的除法计算,考试最快的方法是“分组法”。
- 基本原理:
- 1位八进制 = 3位二进制 ($2^3=8$)
- 1位十六进制 = 4位二进制 ($2^4=16$)
- 表 2.1 必背对应关系(0-15)
这是基本功,必须像乘法口诀一样熟练:
- 0-9: 二进制就是正常的
0000到1001。 - 10-15 (A-F) 是重点:
- 10 -> A ->
1010(记法:一零一零) - 11 -> B ->
1011(A+1) - 12 -> C ->
1100(8+4) - 13 -> D ->
1101 - 14 -> E ->
1110(F减1) - 15 -> F ->
1111(全1)
- 10 -> A ->
- 0-9: 二进制就是正常的
- 转换实战(举例):
-
二进制转十六进制: 10110110-> 从右往左4个一组 ->1011(B)0110(6) -> B6H (H代表Hex)。 - 十六进制转二进制:
3C-> 3是0011,C是1100-> 00111100。
-
二、 机器数 vs 真值:给数字穿上“制服”
- 真值:就是我们平时数学里写的带正负号的数。
- 例如:
+101,-110。
- 例如:
- 机器数:把正负号也变成0和1,扔进计算机里的样子。
- 规定:最高位是符号位。
0代表正,1代表负。
- 规定:最高位是符号位。
三、 原码、反码、补码、移码(重中之重)
这是本章最容易晕的地方,我们用进化论的视角来看:
1. 原码 (Sign-Magnitude) —— 最直观,但不好用
- 规则:最高位符号位,剩下是绝对值。
- 例子(8位):
+1-> 00000001-1-> 10000001
- 缺点:
- 0有两种写法(
+0和-0)。 - 做加减法很麻烦(计算机不知道
1+(-1)该等于0,直接加会出错)。
- 0有两种写法(
2. 反码 (One’s Complement) —— 过渡形态
- 规则:
- 正数:和原码一样。
- 负数:符号位不变,数值位全部取反(0变1,1变0)。
- 例子:
-1(原码 10000001) -> 11111110
3. 补码 (Two’s Complement) —— 终极形态(必考)
计算机里存整数,99%都是用补码。因为它把减法变成了加法,而且0只有一种写法。
- 转换规则(死记):
- 正数:原码 = 反码 = 补码(三码合一)。
- 负数:反码 + 1。
- 口诀:符号位不变,各位取反,末位加1。
- 逆运算(已知补码求原码):也是“取反加1”。
- 例子(求 -5 的8位补码):
- 原码:
1000 0101 - 反码:
1111 1010(符号位1不变,后面取反) - 补码:
1111 1011(反码+1)
- 原码:
4. 移码 (Bias Code) —— 浮点数的阶码专用
- 规则:补码的符号位取反。
- 通常用于表示浮点数的“阶码”(指数部分),目的是为了方便比大小(让负数看起来像正数)。
- 例子:
-5的补码:1111 1011-5的移码:0111 1011(只变最高位)
四、 数据类型与范围(表2.2解析)
考试常考:n位二进制数能表示多大的范围?
1. 无符号数(全是正数)
- 范围:$0 \sim 2^n - 1$
- 16位:$0 \sim 65535$ ($2^{16}-1$)
2. 有符号数(补码,n位)
- 范围公式:$-2^{n-1} \sim +(2^{n-1} - 1)$
- 为什么负数比正数多一个?
- 因为“0”占用了正数的一个位置(
00...0),而负数那边不需要这就避免了-0。 - 补码中规定:
100...0(符号位是1,后面全0)代表最小的负数。
- 因为“0”占用了正数的一个位置(
3. 举例:16位补码范围推导(重点理解)
- 最大正数:符号位0,后面全1。
0111 1111 1111 1111= $+ (2^{15} - 1)$ = +32767。
- 最小负数:符号位1,后面全0。
1000 0000 0000 0000。- 这个数没法取反加1回去(会溢出),人为定义它为 -32768 ($-2^{15}$)。
- 注意:如果是原码或反码,范围是 -32767 ~ +32767。只有补码能到 -32768。
五、 浮点数标准 (IEEE 754)
这是计算机里存“小数”或者“特别大的数”的方法,类似科学计数法。 公式:$V = (-1)^S \times M \times 2^{E-Bias}$
1. 结构拆解(32位单精度,必考)
把它想象成切蛋糕,切成三块:
- S (Sign, 1位):符号位。0正1负。
- E (Exponent, 8位):阶码(指数)。用移码表示。
- Bias (偏置值):127。
- 真实的指数 = E - 127。
- M (Mantissa, 23位):尾数。
- 隐藏位技术:科学计数法(二进制)规范化后,小数点前肯定是1(比如 $1.01 \times 2^3$)。既然大家都有1,为了省空间,这个1不存,只存小数点后面的部分。
2. 64位双精度(了解即可)
- S (1位) + E (11位) + M (52位)。Bias = 1023。
六、 其他编码
1. 8421 BCD码
- 含义:用4位二进制数硬凑一个十进制数(0-9)。
- 规则:
- 0-9 正常转换(如 9 ->
1001)。 - 1010 (10) 到 1111 (15) 是非法码,不能出现。
- 0-9 正常转换(如 9 ->
- 例子:十进制
12-> BCD码0001 0010(分开写,不是1100)。
2. 余3码
- 含义:在8421码的基础上加3 (
0011)。 - 例子:十进制
0-> 8421码0000-> 余3码0011。
3. ASCII码
- 位数:标准ASCII码用 7位 二进制表示(最高位通常是0,或者用作奇偶校验)。
- 记几个关键点:
'0'= 48 (011 0000)'A'= 65 (100 0001)'a'= 97 (110 0001) (大小写差32)。
本章复习小结
- 做题工具:无论题目问什么,先把十六进制换成二进制,一切就清晰了。
- 核心计算:
- 补码转换(负数取反加1)。
- 范围判断(n位补码最小值是 $-2^{n-1}$)。
- IEEE 754(记住单精度的 Bias=127,尾数前面藏了个1)。
这就是第二章的全部家当,是不是感觉只有几个规则需要死记?搞定这些,后面做运算题就不用慌了!
好的,我们继续“清零”,进入第6章。这一章是整本书最“动感”的一章。
如果在第1章我们认识了计算机的“五脏六腑”(硬件),那么第6章就是看这台机器“动起来”的样子。我们要把静止的电路变成流动的程序。
一、 核心场景设定:舞台与演员
在开始分析具体指令之前,我们必须把图1.4(模型机架构)这张图刻在脑子里。想象这是一个流水线车间:
【核心演员表(硬件)】
- PC (程序计数器):“手指”。它永远指着内存里的某一行,说:“下一条执行这行代码!”
- MAR / AR (地址寄存器):“仓库管理员的传呼机”。CPU想去内存(仓库)找东西,必须先把“门牌号(地址)”写在这里。
- MDR / DR (数据寄存器):“仓库传送带”。从内存里拿出来的东西,或者要塞进内存的东西,都必须先放在这里暂存。
- IR (指令寄存器):“大脑”。从内存拿出来的指令(比如“做加法”),要放在这里由CPU进行分析。
- GPRs (通用寄存器,如R0, R1):“手边的草稿纸”。用来暂存正在运算的数据。
- ALU:“计算器”。
二、 图6.1:读懂“汇编伪代码”(剧本)
书上图6.1给出的通常是一段简单的汇编程序。别被英文吓到,它们都是英语单词的缩写,逻辑非常简单。我们来逐一翻译:
假设内存里存了这样一段程序:
- Load R1, [100]
- 人话:去内存地址
100的房间,把里面的数据拿出来,放在 CPU 的R1寄存器里。 - 动作:取数(Memory $\to$ CPU)。
- 人话:去内存地址
- Add R1, [101]
- 人话:去内存地址
101的房间拿数据,把它加到R1刚才那个数上,结果还存在R1里。 - 动作:加法。
- 人话:去内存地址
- Store R1, [200]
- 人话:把
R1里算好的结果,搬运到内存地址200的房间里存起来。 - 动作:存数(CPU $\to$ Memory)。
- 人话:把
- Jump 500
- 人话:不要往下走了,直接跳到内存地址
500去执行那里的指令。 - 动作:跳转(修改 PC 的值)。
- 人话:不要往下走了,直接跳到内存地址
三、 核心考点:指令执行过程分析(大戏开演)
这是考试必考的大题!题目通常会让你写出每一步数据是怎么流动的。 所有指令的执行都分为两个阶段:1. 取指令(公用);2. 执行指令(各不相同)。
第一阶段:取指令 (Fetch Cycle) —— 万事开头难
不管是什么指令(Load也好,Add也好),第一步必须先把指令从内存里拿出来。这个过程对所有指令都是一模一样的。
- 初始状态:PC 指向指令所在的地址(假设是 10)。
- 步骤分析:
- PC $\to$ AR:
- CPU说:我要取第10行的指令。把
10这个地址送到地址寄存器(AR)。
- CPU说:我要取第10行的指令。把
- Memory[AR] $\to$ DR:
- 内存说:收到,给你第10行的内容。把指令代码(比如
Load R1, 100的二进制码)放到数据寄存器(DR)。
- 内存说:收到,给你第10行的内容。把指令代码(比如
- DR $\to$ IR:
- CPU说:这是指令,不是普通数据,送到指令寄存器(IR)里让我分析一下。
- PC + 1 $\to$ PC:
- PC说:这条取完了,我的任务完成了,我自动加1(变成11),指向下一条。
- PC $\to$ AR:
考试技巧:如果题目问“取指周期”做了什么,就把上面这4步默写下来。
第二阶段:执行指令 (Execute Cycle) —— 各显神通
现在,指令已经在 IR 里了,控制器译码后知道要干什么了。我们分别看四种核心指令的执行动作:
1. Load R1, [100] (取数指令)
- 目标:把内存地址
100里的数据 $\to$ 寄存器R1。 - IR里有什么:操作码是Load,地址码是100。
- 执行步骤:
- IR(地址码) $\to$ AR:
- 控制器把指令里的地址
100拆出来,送到地址寄存器 AR。(告诉内存:我要去100号房间)。
- 控制器把指令里的地址
- Memory[AR] $\to$ DR:
- 内存读出100号房间的数据(假设是数字 55),放到数据寄存器 DR。
- DR $\to$ R1:
- 把 DR 里的
55传送到通用寄存器 R1。 * 结束。
- 把 DR 里的
- IR(地址码) $\to$ AR:
2. Add R1, R2 (寄存器加法,假设操作数在寄存器)
- 注:有些题目是 Add R1, [100](内存加法),这里以寄存器加法为例,更纯粹。
- 目标:R1 + R2 $\to$ R1。
- 执行步骤:
- R1 + R2 $\to$ ALU:
- 把两个寄存器的值送进运算器。
- ALU运算结果 $\to$ R1:
- 算出结果,存回 R1。 * 结束。
- R1 + R2 $\to$ ALU:
3. Store R1, [200] (存数指令)
- 目标:把
R1里的值 $\to$ 写入内存地址200。 - 这是唯一一个数据从 CPU 流向 内存 的指令。
- 执行步骤:
- IR(地址码) $\to$ AR:
- 把目标地址
200送到 AR。(告诉内存:我要往200号房间放东西)。
- 把目标地址
- R1 $\to$ DR:
- 把 R1 里的数据(比如结果 60)送到 DR。(先把包裹放到传送带上)。
- DR $\to$ Memory[AR]:
- 向内存发“写”信号,把 DR 里的 60 写入 AR 指向的地址。 * 结束。
- IR(地址码) $\to$ AR:
4. Jump 500 (跳转指令)
- 目标:下一条不去执行 PC 指向的地方了,直接去地址
500。 - 最简单,但最关键。
- 执行步骤:
- IR(地址码) $\to$ PC:
- 把指令里写的地址
500,直接覆盖掉 PC 当前的值。 * 结束。 * 后果:下一个取指周期开始时,PC已经是500了,所以程序就“跳”过去了。
- 把指令里写的地址
- IR(地址码) $\to$ PC:
四、 总结与考试怎么答
考试通常会给你一个图(类似图1.4),然后问你执行某条指令时,数据在这些框框之间怎么跑。
答题模板(脑海模拟):
- 所有指令的开头:
PC->ARMem->DRDR->IRPC+ 1 ->PC
- 看指令类型接下文:
- 取数 (Load):地址 -> AR,内存 -> DR,DR -> 寄存器。
- 存数 (Store):地址 -> AR,寄存器 -> DR,DR -> 内存。
- 加法 (Add):操作数 -> ALU,结果 -> 寄存器。
- 跳转 (Jump):地址 -> PC。
最容易混淆的点:
- AR (地址寄存器):永远只放“门牌号”(地址)。
- DR (数据寄存器):永远只放“房间里的东西”(指令代码 或 数据本身)。
- PC:只管指令的地址。
- IR:只管指令的内容。
这一章搞懂了吗?只要你能把这四个指令的“搬运过程”在脑子里像放电影一样过一遍,这一章就拿下了!
好,我们继续把心态“清零”。第七章《指令系统》是整门课的灵魂。
如果把计算机比作一个人,硬件(CPU)是身体,软件是思想,那么指令系统(Instruction Set Architecture, ISA)就是语言。它是软件指挥硬件干活的唯一媒介。
这一章的难点不在于记忆,而在于逻辑计算(特别是寻址方式和扩展操作码)。我们一块块拆解:
一、 指令格式:解剖一条命令
1. 图7.1:指令的基本骨架
一条指令通常由两部分组成,就像一个动宾短语:
- 操作码 (Opcode):“干什么?”(比如:加法、取数、停机)。
- 地址码 (Address):“对谁干?”(比如:寄存器R1、内存地址10086)。
常见的格式分类(按地址码数量):
- 三地址指令:
OP A1, A2, A3(A1 = A2 + A3)。最豪华,但太占地儿(指令太长)。 - 二地址指令:
OP A1, A2(A1 = A1 + A2)。最常用,A1既是源又是目的地。 - 一地址指令:
OP A1(累加器ACC = ACC + A1)。隐含了一个操作数在ACC里。 - 零地址指令:
OP(例如:停机、空操作)。不需要操作数。
2. 操作码扩展技术(必考逻辑题)
这是本章第一个智力题。 背景:指令的总长度通常是固定的(比如16位)。如果我们想让指令能支持更多的操作(Opcode变长),就必须牺牲地址码的空间。
核心原则(电话号码原则):
短操作码不能是长操作码的前缀。 就像如果
110是报警电话,那么就不能有1105这种电话号码,否则拨到前三位就接通了。
典型例题逻辑(类似P171): 假设指令长16位,地址码每个占4位。
- 三地址指令:
Op(4位) + A1(4位) + A2(4位) + A3(4位)。- Opcode剩4位,最多 $2^4=16$ 条指令。假设我们用了14条(
0000~1101)。 - 剩下
1110和1111没用,可以拿来扩展。
- Opcode剩4位,最多 $2^4=16$ 条指令。假设我们用了14条(
- 二地址指令:把A3的空间腾出来给Opcode用。
- 现在的Opcode变成了
4+4=8位。 - 关键点:二地址指令的Opcode必须以三地址没用完的
1110或1111开头!
- 现在的Opcode变成了
复习策略:不要死算公式,要画框图。看剩下的“前缀”有多少个,乘以 $2^n$ 就是下一级能扩展的数量。
二、 寻址方式:数据的“藏宝图”(重中之重)
这是本章计算题的重灾区。CPU拿到了指令,看到了地址码(形式地址 A),但这个 A 往往不是真正的数据地址,而是一个线索。 我们需要计算出 有效地址 (EA)。
1. 基础寻址(送分项)
- 立即寻址:指令里直接写着数据(
Add R1, #5)。数据就在指令里,不用找。速度最快。 - 直接寻址:指令里写的是内存地址(
Load R1, [100])。去内存100号房间拿。 - 间接寻址:指令里写的是地址100,去100号房间一看,里面写着“请去200号房间找”。(访问了两次内存,速度最慢)。
- 寄存器寻址:数据在CPU内部的寄存器里。不去内存,速度很快。
2. PC相对寻址(大坑!必考计算)
场景:Jump 或 Branch(条件跳转)指令。代码通过它实现 if-else 或 while 循环。
公式:
\(Target\_Address = PC_{updated} + Offset\)
避坑指南(三个死穴):
- 哪个PC?
- CPU执行当前指令时,PC会自动加1(或加指令字长)。
- 计算基准是下一条指令的地址,不是当前这条的地址!
- 例子:当前指令在地址
2000,指令长2字节。计算跳转时,基准PC是2002。
- 偏移量 (Offset) 的单位:
- 有的机器按字节编址(Offset代表多少个字节)。
- 有的机器按字编址(Offset代表多少条指令)。
- MIPS特例:MIPS指令长4字节,它的Offset指的是“多少条指令”。所以实际计算地址时,Offset要乘以4(左移2位)。
- 正负号:
- Offset通常是补码。如果是负数(向后跳),计算时要小心符号扩展。
3. 变址寻址 vs 基址寻址(容易混淆)
公式看起来一样:$EA = \text{寄存器内容} + \text{形式地址A}$。但用途完全不同。
| 特性 | 变址寻址 (Index) | 基址寻址 (Base) |
|---|---|---|
| 公式 | EA = (变址寄存器IX) + A | EA = (基址寄存器BR) + A |
| 谁在变? | 寄存器在变 (IX++, IX–) | A 在变 (指令里的偏移量不同) |
| 谁固定? | 指令里的 A 固定 (数组首地址) | 寄存器固定 (程序的起始位置) |
| 典型用途 | 循环、数组访问 (i=0; i<n; i++) | 程序重定位 (OS把程序加载到内存不同位置) |
| 面向谁 | 面向用户/程序员 | 面向操作系统 |
- 记忆口诀:
- 变址:像我想去同一个小区的不同楼号(基准不变,变的是脚步)。
- 基址:像整栋楼被搬到了另一个城市(楼内结构A不变,变的是地基)。
三、 指令集架构:CISC vs RISC
这是计算机设计哲学的两种流派。
1. CISC (复杂指令集,代表:Intel x86)
- 哲学:“大包大揽”。硬件能做的尽量让硬件做。
- 特点:指令多、复杂、长度不固定。有的指令极其强大(一条指令能完成从内存取数、运算、写回)。
- 缺点:设计太难,20%的常用指令占了80%的使用时间(80/20法则),剩下80%复杂的指令很少用,浪费晶体管。
2. RISC (精简指令集,代表:MIPS, ARM)
- 哲学:“简单粗暴”。只保留最常用的简单指令。复杂操作靠软件组合简单指令完成。
- 特点:
- 指令少、简单。
- 长度固定(比如都是32位),格式统一。
- Load/Store结构:只有Load和Store指令能访问内存,运算指令只能在寄存器之间进行(这个非常重要)。
- 适合流水线设计(第8章会讲)。
- 优点:速度快,硬件简单,功耗低。
四、 MIPS 案例(实战演练)
不要去背MIPS的二进制码,要理解它的格式设计。MIPS是典型的RISC结构,指令长度固定为32位。
1. 三种指令格式
- R型 (Register):纯运算。
Add R1, R2, R3(R1 = R2 + R3)。- 全部操作数都在寄存器里。
- I型 (Immediate):带常数 或 访存。
Addi R1, R2, #100(加立即数)。Load R1, 100(R2)(访存)。- 特点:有一个16位的立即数/偏移量字段。
- J型 (Jump):大跳转。
Jump 1000。- 特点:留了26位给目标地址。
2. LD / ST 指令的数据宽度(表7.3重点)
老师特意提到了这个表,意味着要考数据对齐和位宽。
- LB (Load Byte):取一个字节(8位)。放入32位寄存器时,高24位怎么填?(通常符号扩展)。
- LH (Load Half):取半字(16位)。同样涉及符号扩展。
- LW (Load Word):取一个字(32位)。MIPS标准操作。
第7章复习总结
- 算:一定要会算扩展操作码剩下多少条指令,一定要会算PC相对寻址的目标地址。
- 辨:给出一个应用场景(比如数组遍历),能选出是用变址还是基址。
- 比:CISC 和 RISC 的区别,闭着眼能说出三条。
- 读:看到
LW R1, 4(R2)能知道这是“把R2的内容+4作为地址,去内存取一个32位的数存入R1”。
这一章是软硬件交接的关口,把这章搞定,后面的CPU设计就容易理解为什么要有那么多线了!加油!
好的,我们要进入第八章《中央处理器(CPU)》了。这是整本书的心脏章节,也是考试中分值最重、最容易拉开差距的地方(特别是画图题)。
如果把计算机比作一个工厂,第七章我们规定了工人的“工作手册”(指令系统),那么第八章我们就要真正设计车间流水线(数据通路)和车间主任(控制器)。
一、 核心概念:什么是数据通路?什么是控制器?
在开始啃图之前,先建立两个核心概念:
- 数据通路 (Data Path):“干活的肌肉”。
- 包括:ALU(算算的)、寄存器(存数的)、内存(仓库)、以及连接它们的电线。
- 作用:数据在这里流来流去,被加减乘除。
- 控制器 (Control Unit):“指挥的大脑”。
- 它不处理数据,它只发控制信号。
- 比如:它告诉ALU“现在做加法”;告诉寄存器“现在把门打开,让数据进去”。
二、 数据通路(必考大题:画图与连线)
这是考试绝对的重头戏。通常题目会给你一个空的或者半成品的电路图(类似图8.12),让你画出某条指令执行时数据是怎么流动的。
1. 图8.5:基本部件(乐高积木)
要搭建CPU,我们需要这几块积木:
- PC:存放当前指令地址。
- IM (Instruction Memory):指令存储器,给它地址,它吐出指令。
- Reg (Register File):通用寄存器堆。有两个读口(Ra, Rb)和一个写口(Rw)。
- ALU:运算核心。
- DM (Data Memory):数据存储器,用于Load/Store指令。
2. 图8.12:完整单周期数据通路(核心中的核心)
这张图看起来很乱,全是线。怎么看懂?看“红绿灯”——也就是多路选择器(MUX)。
MUX(Multiplexer)是数据通路的道岔。因为CPU里线是物理连接好的,数据怎么走,全靠MUX选择。
- ALU前面的MUX:决定ALU的第二个操作数是来自寄存器(比如
Add R1, R2),还是来自指令里的立即数(比如Load R1, 100(R2))。 - 写回寄存器前的MUX:决定写入寄存器的数据是来自ALU算出结果(Add指令),还是来自内存读出的数据(Load指令)。
3. 五大指令的数据流动路径(必背!)
考试会让你画线,或者用文字描述路径。我们一条条走一遍:
(1) 取指令 (Fetch) —— 所有指令的第一步
- 路径:
PC$\to$IM$\to$ 取出指令。 - 同时:
PC+ 4 $\to$ 更新PC(准备下一条)。
(2) R类指令 (如:ADD R1, R2, R3)
- 含义:R2 + R3 $\to$ R1。
- 路径:
- 指令中的 rs, rt 字段 $\to$
Reg堆$\to$ 读出两个数 A, B。 - A, B $\to$
ALU$\to$ 算出结果 Result。 - Result $\to$
Reg堆的写入端(写到 rd 字段指向的寄存器)。
- 指令中的 rs, rt 字段 $\to$
- 关键点:不碰内存(DM),ALU的第二个输入选寄存器。
(3) Load 指令 (如:LW R1, 100(R2))
- 含义:去内存(地址 = R2 + 100)取数,存入 R1。
- 路径:
Reg堆读出 R2 的值。- 指令中的立即数 100(经过符号扩展) $\to$
ALU。 - R2 + 100 $\to$
ALU算出内存地址。 - ALU结果 $\to$
DM(地址口) $\to$ 读出数据 Data。 - Data $\to$
Reg堆(写入 R1)。
- 关键点:数据绕了一大圈,经过了 ALU 和 DM。
(4) Store 指令 (如:SW R1, 100(R2))
- 含义:把 R1 的值,存入内存(地址 = R2 + 100)。
- 路径:
Reg堆同时读出 R2(基地址)和 R1(要存的数据)。- R2 + 100 $\to$
ALU算出内存地址。 - R1 的值 $\to$ 绕过 ALU $\to$ 送到
DM的数据写入口。 DM执行写入操作。
- 关键点:唯一一条不写回寄存器的指令(RegWrite信号为0)。
(5) 分支指令 (如:BEQZ R1, 100)
- 含义:如果 R1 == 0,则 PC = PC + 4 + (100 « 2)。
- 路径:
Reg堆读出 R1。- R1 送入判断逻辑(比如跟0比较)。
- 同时:ALU 计算跳转地址(PC+4 + 偏移量)。
- 如果条件成立,ALU算出的地址 $\to$
PC;否则PC+4$\to$PC。
三、 控制器设计:让机器有条不紊
1. 单周期 vs 多周期(必考简答题)
- 单周期 CPU (Single Cycle):
- 定义:所有指令都在一个时钟周期内完成。
- 特点:周期必须设置得足够长,以容纳最慢的那条指令(通常是 Load 指令,因为它既要算地址又要读内存)。
- 优点:控制简单,设计容易。
- 缺点:效率低(做简单的 Add 指令也要等 Load 那么久),硬件浪费(比如加法器只能用一次,算PC+4还得单独配一个加法器)。
- 多周期 CPU (Multi-Cycle):
- 定义:把一条指令切成好几个短的周期(比如:取指、译码、执行、访存、写回)。
- 特点:不同指令用的周期数不同(Add用4个,Load用5个)。
- 优点:速度快(时钟频率高),硬件复用(ALU既可以算PC+4,也可以算指令加法,只要在不同周期用就行)。
- 缺点:控制器设计非常复杂(需要状态机)。
2. 图8.14:多周期方案中的“临时寄存器”
这是多周期设计的关键。因为我们把指令切碎了,上一个动作做完的结果,必须先存起来,下一个动作才能接着用。 新增了哪些寄存器(考点)?
- IR (指令寄存器):存取出来的指令,供后续周期译码用。
- MDR (存储器数据寄存器):存从内存读出来的数据。
- A, B:存从通用寄存器读出来的操作数(给ALU下个周期用)。
- ALUOut:存ALU算出来的结果(可能是计算结果,也可能是内存地址),给下个周期访存或写回用。
理解:这些寄存器就像接力赛跑中的接力棒,保证数据在不同周期之间传递时不丢失。
3. 图8.21/8.22:有限状态机 (FSM)
怎么控制多周期CPU?我们需要一个状态机。
- 状态0 (Fetch):所有人都要做的,取指令,PC+4。 $\to$ 进状态1。
- 状态1 (Decode):译码,读寄存器。 $\to$ 根据 Opcode 分流:
- 如果是 Load/Store $\to$ 去计算地址状态。
- 如果是 R型 $\to$ 去执行运算状态。
- 如果是 Branch $\to$ 去判断跳转状态。
硬连逻辑 (Hardwired Control):
- 定义:直接用门电路(与门、或门、触发器)搭出来的控制器。
- 特点:速度最快(全是电路延迟),但修改极难(一旦设计错,芯片报废)。
- 对比:第九章会讲“微程序控制器”,那是用软件思想做硬件,速度慢但灵活。
第8章复习总结
- 画图:一定要亲手画一遍 Load 指令在单周期数据通路(图8.12)上的流向,把经过的 MUX 圈出来。
- 辨析:单周期虽然简单,但它是按照“最慢的那个学生”来规定下课时间的;多周期是“做完试卷就交卷”,而且利用率高。
- 细节:多周期为什么要加 A, B, ALUOut, IR 这些寄存器?因为时钟一跳,信号就没了,必须暂存。
这一章搞定数据通路,下一章微程序就是把这里的“状态机”变成“代码”而已,逻辑是一脉相承的。加油!
好,我们把频道切换到第九章《微程序控制器》。
如果说第八章的“硬连逻辑控制器”是用一堆复杂的电线和逻辑门搭出来的“机械钟表”(跑得快,但结构死板,改一个功能得拆了重装),那么第九章的“微程序控制器”就是“会读剧本的机器人”(跑得稍慢,但非常聪明,想改功能只需要换个剧本)。
这一章的核心思想是:把硬件设计转化为软件编程。
一、 基本原理与核心概念(概念大扫盲)
这是本章的基石,要把这几个长得很像的词彻底分清楚。我们用“厨师做菜”的例子来类比:
1. 五个层级概念(必考辨析)
- 机器指令 (Machine Instruction):
- 类比:客人点的一道菜,比如“宫保鸡丁”。
- 定义:汇编语言中的一条指令(如
ADD R1, R2)。
- 微程序 (Micro-program):
- 类比:做这道菜的完整食谱。
- 定义:实现一条机器指令功能的所有微指令的集合。
- 微指令 (Micro-instruction):
- 类比:食谱中的某一步骤(例如:“切鸡肉的同时烧热油”)。
- 定义:在一个微周期(时钟周期)内并行执行的一组微命令。存放在控制存储器 (CM) 中的一个单元里。
- 微命令 (Micro-command):
- 类比:厨师大脑发给肌肉的具体电信号(例如:“左手肌肉收缩”、“右手肌肉放松”)。
- 定义:控制部件向执行部件发出的最小控制信号(如
ALU做加法、打开寄存器门)。
- 微操作 (Micro-operation):
- 类比:肌肉实际发生的动作。
- 定义:执行部件在微命令控制下完成的具体行为。
层级关系总结: 一条机器指令 $\to$ 对应一个微程序 $\to$ 包含若干条微指令 $\to$ 每条微指令包含若干微命令 $\to$ 触发若干微操作。
2. 图9.2:微程序控制器工作原理(看图说话)
这个控制器内部其实就是一个小型的计算机。
- 核心部件:
- 控制存储器 (CM, Control Memory):“剧本库”。里面存放了所有指令对应的微程序。注意!它和主存(内存)是两码事。主存放用户的程序,CM放CPU内部的固件。
- 微地址寄存器 (uAR / CMAR):“书签”。指向CM中下一条微指令在哪里。
- 微指令寄存器 (uIR / CMDR):“读经台”。存放当前正在执行的那条微指令。
- 它分为两部分:控制字段(发命令) + 下址字段(找下一条)。
- 工作流程(循环):
- 取微指令:根据 uAR 的地址,从 CM 中读出一条微指令,送到 uIR。
- 执行:uIR 的控制字段发出电信号,指挥ALU、寄存器干活。
- 找下一条:根据 uIR 的下址字段和机器的状态(比如是否溢出),生成下一个微地址,送入 uAR。
二、 微程序 vs 硬连逻辑(核心比较)
这是简答题常客,必须背诵优缺点。
| 特性 | 硬连逻辑控制器 (Hardwired) | 微程序控制器 (Microprogrammed) |
|---|---|---|
| 设计原理 | 用门电路(与或非)硬搭出来的 | 用存储逻辑(ROM)存“代码” |
| 速度 | 极快(全是电路延迟) | 较慢(要读ROM,有访问延迟) |
| 灵活性 | 极差(修改指令=重新设计芯片) | 极好(修改指令=改写ROM里的微程序) |
| 规整性 | 乱七八糟(布线复杂) | 非常规整(就像存储器一样) |
| 适用场景 | RISC(追求速度,指令简单) | CISC(指令复杂,需要灵活性) |
- 一句话总结:硬连逻辑是“四肢发达(快)头脑简单(死板)”;微程序是“动作迟缓(慢)头脑灵活(规整)”。
三、 微指令设计:怎么把命令塞进格子里?
微指令也是一串0和1,我们需要设计每一位代表什么意思。
1. 编码方式(如何表示微命令?)
- 直接控制法:
- 原理:1位代表1个命令。第1位是“开门”,第2位是“加法”,第3位是“停机”…
- 优点:简单直观,并行性好(各位互不干扰)。
- 缺点:微指令太长了(有多少个命令就要多少位,浪费空间)。
- 最短字长编码(译码法):
- 原理:把命令编号。比如有8个命令,就用3位二进制(000~111)表示。需经过译码器。
- 优点:微指令最短。
- 缺点:不能并行(一次只能发一个命令),还需要译码时间。
- 字段直接编码(折中方案,最常用):
- 原理:把微命令分组。
- 互斥的命令(不可能同时发生的,如“做加法”和“做减法”)放在一组,组内用二进制编码。
- 相容的命令(可以同时发生的)放在不同组。
- 优点:既缩短了长度,又保留了并行性。
2. 微指令格式
- 水平型微指令:
- 长,像“直接控制法”。
- 一次能定义多个并行操作(效率高)。
- 比喻:像一个全能指挥官,喊一声“你切菜、你烧水、你洗碗”,大家同时动。
- 垂直型微指令:
- 短,像普通的机器指令。
- 一次只能定义一个基本操作。
- 比喻:像一个啰嗦的指挥官,只能喊“你切菜”,下一秒喊“你烧水”。
四、 下址形成:下一步去哪?(难点)
微程序执行完一条微指令后,怎么知道下一条在哪?这叫“下址形成”。
1. 增量方式 (计数器法)
- 原理:类似于PC。通常情况下
uAR + 1,顺序执行。 - 缺点:处理分支跳转比较麻烦。
2. 断定方式 (字段法,最常用)
- 原理:微指令里直接划出一块区域(下址字段),明确写着下一条的地址。
- 若需跳转:根据状态标志(如进位C、零标志Z)修改这个下址字段的某几位。
- 例子:微指令里写着下址是
1000。如果不跳转就去1000;如果满足条件,就把最低位改成1,去1001。这叫“按位与”或“测试位”技术。
- 例子:微指令里写着下址是
3. 入口地址映射(两级散转)
问题:CPU刚拿到一条机器指令(比如 ADD),怎么找到 CM 里对应的微程序第一条微指令在哪?
方法:操作码映射 (Opcode Mapping)。
- 一级散转:直接用操作码(Opcode)通过一个PROM(转换表)变成微地址。
- 两级散转(老师强调):
- 先根据指令的大类(如R型、I型)跳到一个公共处理程序。
- 处理完公共部分(如取指、译码)后,再根据具体的Opcode跳到具体的功能微程序。
- 优点:节省控制存储器的空间,共用代码。
第9章复习总结
- 背诵:一定要背下来“微程序 vs 硬连逻辑”的优缺点对比表。
- 辨析:搞清楚那五个概念(指令 -> 微程序 -> 微指令 -> 微命令 -> 微操作)。
- 计算:字段直接编码法中,如果某组有7个互斥命令,需要几位?(答:3位,因为要留一个状态表示“什么都不做”,即 $7+1=8=2^3$)。
- 理解:下址形成中的“断定方式”,其实就是“微指令自带GPS导航”。
这一章是理论性最强的一章,只要把概念理顺了,其实没有复杂的计算。搞定这一章,整个计算机组成的控制流你就通了!
好的,我们进入第10章。这一章是纯计算章节。
如果你觉得前几章的电路图和控制信号太抽象,这一章你会感觉好一点,因为它就是数学题。但是,它是“计算机的数学”,有很多反直觉的规则(比如补码、移码)。
这一章的核心任务是:教会你怎么像计算机一样算术。考试里,这就是送分题(如果你掌握了规则)或者送命题(如果你算错了)。
一、 定点数运算:整数怎么算?
“定点数”通常指整数。计算机里99%的整数运算都是用补码进行的。
1. 移位运算 (Shift)
移位就像是把算盘珠子往左拨或往右拨。
- 逻辑移位 (Logical Shift):
- 对象:无符号数(不看正负,当作纯图形)。
- 规则:
- 左移/右移:缺口一律补0。
- 例子:
1111 0000右移 $\to$0111 1000。
- 算术移位 (Arithmetic Shift) —— 重点:
- 对象:有符号数(真值)。移位等同于 $\times 2$ 或 $\div 2$。
- 原则:符号位(最高位)绝对不能变!
- 补码规则(必背):
- 左移($\times 2$):尾部补0。
- 右移($\div 2$):头部(符号位之后)补符号位(原来是1就补1,是0就补0)。这叫“符号扩展”。
- 例子:负数补码
1111 0000(-16)- 算术右移:
1111 1000(最高位补了1,结果是-8)。
- 算术右移:
- 循环移位 (Cyclic Shift):
- 像传送带一样,移出去的位又从另一头补回来。通常用于加密或特殊处理。
2. 补码加减法与溢出判断 (例题10.6同款)
公式: \([A-B]_{补} = [A]_{补} + [-B]_{补}\)
- 求 $[-B]{补}$ 的方法**:将 $[B]{补}$ **连同符号位一起,全部取反,末位加1。
核心考点:溢出 (Overflow) 判断 什么是溢出?就是“两个正数加出了负数”或者“两个负数加出了正数”。
- 方法一:单符号位法(看进位)
- 判断逻辑:符号位产生的进位 ($C_s$) $\oplus$ 最高数值位产生的进位 ($C_1$)。
- 如果异或结果为1(一个有进位一个没进位),就是溢出。
- 方法二:双符号位法(变形补码) —— 做题推荐!
- 原理:运算时把符号位写成两位(00表示正,11表示负)。
- 判据:
00:结果为正(正常)。11:结果为负(正常)。01:正溢出(结果太大,正数变负了)。10:负溢出(结果太小,负数变正了)。
- 口诀:“双号判溢,同号正常,异号溢出”。
3. 乘除法:原码一位乘 (例题10.7同款)
这是模仿人类笔算乘法的过程,但在计算机里,我们不能一下把所有数加起来,只能“加一次,移一下”。
原码一位乘规则:
- 符号位单独处理:$Sign = Sign_A \oplus Sign_B$。
- 数值部分:用绝对值运算。
- 部分积 (Partial Product):初始为0。
- 步骤(假设乘数是4位,就要做4次):
- 看乘数的最后一位。
- 如果是 1:部分积 + 被乘数。
- 如果是 0:部分积 + 0。
- 加完后,部分积和乘数同时右移一位。
注意:原码乘法很简单,就是“移位”和“加法”的循环。补码乘法(Booth算法)比较难,如果大纲没强调Booth算法的细节,重点掌握原码乘法即可。
二、 浮点数运算:全书最复杂的计算题 (例题10.13)
这是期末考试的压轴计算题,通常分值很高。必须把“五步走”刻在DNA里。
假设题目:计算 $X + Y$,其中 $X, Y$ 是浮点数(阶码+尾数)。
第一步:判0 (Zero Check)
- 看一眼 X 或 Y 是不是 0。如果是,结果就是另一个数,直接下班。如果不为0,继续。
第二步:对阶 (Align Exponents) —— “小阶看齐大阶”
- 原理:$1.0 \times 10^2$ 和 $1.0 \times 10^3$ 不能直接加,必须把小数点对齐。
- 规则:
- 求阶差 $\Delta E = E_x - E_y$。
- 阶码小的那个数,尾数右移,阶码加1,直到两个阶码相等。
- 注意:尾数右移时,如果是补码,要注意符号扩展;如果是原码,补0。
- 口诀:小看大(小阶向大阶看齐)。因为右移丢失的是末位精度,影响小;左移会丢最高位,那是大事故。
第三步:尾数加减 (Add/Sub Mantissas)
- 对阶完了,阶码相同了,现在只需要把尾数相加减。
- 注意:这里通常用补码进行加减法。如果是双符号位,此时可能会出现
01.xxx或10.xxx(溢出),先别慌,这是假溢出,下一步解决。
第四步:规格化 (Normalization) —— 重点!
浮点数必须保证尾数的形式是规范的(比如补码必须是 00.1xxxx 或 11.0xxxx,即符号位和最高数值位不同)。
- 左规 (Left Normalize):
- 现象:尾数算出来是
00.001xx或11.110xx(符号位和第一位相同,无效位太多)。 - 操作:尾数左移,阶码减,直到变成标准形式。
- 含义:$0.001 \times 2^5 \to 0.1 \times 2^3$。
- 现象:尾数算出来是
- 右规 (Right Normalize):
- 现象:尾数加减时出现了双符号位溢出(如
01.xxxx或10.xxxx)。 - 操作:尾数右移 1 位,阶码加 1。
- 含义:$0.6 + 0.5 = 1.1$(溢出)$\to 0.11 \times 10^1$。
- 现象:尾数加减时出现了双符号位溢出(如
第五步:舍入与判溢出 (Rounding & Overflow Check)
- 舍入:对阶或右规时,尾数末位被移出去了。为了精度,我们要处理它。
- 0舍1入法:如果移出去的那一位是1,就在末位+1。
- 截断法:直接扔掉,不管。
- 判溢出(终极判决):
- 浮点数的溢出,不看尾数,只看阶码!
- 阶码上溢(超过最大值):真正的溢出,报错。
- 阶码下溢(小于最小值):当作机器零处理(结果为0)。
第10章复习总结
- 整数运算:
- 要死记硬背补码算术右移的规则(补符号位)。
- 要会用双符号位判断补码加减法的溢出(01正溢,10负溢)。
- 浮点运算(大题模板):
- 对阶:小变大,尾右移。
- 加减:算尾数。
- 规格化:结果太大就右规(阶+1),结果太小就左规(阶-1)。
- 判溢出:最后看阶码炸没炸。
做这道大题时,建议在草稿纸上把每一步的阶码和尾数分开写,清楚明了,不容易错。这一章全是死规则,只要按部就班,满分不难!
好的,我们进入最后一章第11章《存储器》。这一章的内容非常贴近现实,也很容易拿分,因为它的一半是概念背诵,另一半是逻辑固定的设计题。
如果把CPU比作那个算数飞快的“爱因斯坦”,那存储器就是给爱因斯坦提供草稿纸和参考书的“图书馆”。
一、 存储器分类与层次(基础概念)
1. 存储金字塔(Memory Hierarchy)
计算机为了既要速度快、又要容量大、还要便宜,不得不搞了一个“层级结构”。
- 顶层:寄存器 (Registers) —— 爱因斯坦手里的草稿纸。最快,最小,最贵。
- 第二层:Cache (高速缓存) —— 爱因斯坦书桌上的常用书。很快,较小,贵。(SRAM)
- 第三层:主存 (Main Memory) —— 图书馆的书架。速度中等,容量大,价格适中。(DRAM)
- 底层:辅存 (Auxiliary Memory) —— 地下室的旧书库(硬盘/SSD)。最慢,巨大,最便宜。
考点:主存-Cache-辅存 结构。Cache解决速度问题(CPU太快内存太慢),辅存解决容量问题。
2. SRAM vs DRAM(必考对比表格)
这是内存的两种核心技术。
| 特性 | SRAM (静态随机存储器) | DRAM (动态随机存储器) |
|---|---|---|
| 存储原理 | 触发器 (双稳态电路),像开关,开了就是开。 | 电容 (Capacitor),像水桶,水会漏。 |
| 速度 | 极快 (不需要刷新)。 | 较慢 (充放电需要时间)。 |
| 集成度/容量 | 低 (一个位要6个晶体管),容量小。 | 高 (一个位只要1个晶体管+1个电容),容量大。 |
| 成本 | 贵。 | 便宜。 |
| 刷新 | 不需要。只要有电,数据就在。 | 需要。电荷会泄漏,必须每隔几毫秒“充电”一次。 |
| 用途 | Cache (高速缓存)。 | 主存 (内存条)。 |
关于刷新:DRAM刷新是按行进行的。为了不影响CPU读写,有集中刷新(死区时间长)、分散刷新(没死区但慢)、异步刷新(折中)三种方式。
3. 大端模式 vs 小端模式(Endianness)
这是关于“多字节数据怎么往内存里塞”的问题。
场景:你要存一个16进制数 0x12345678(这是一个4字节的整数,12是最高位,78是最低位)。内存地址是从低到高排列的(比如地址0, 1, 2, 3)。
- 大端模式 (Big-Endian):“高位在低地址”。
- 符合人类阅读习惯。
- 地址0存
12,地址1存34,… 地址3存78。 - 口诀:大头在前(低地址)。
- 小端模式 (Little-Endian):“低位在低地址”。
- 反直觉,但在x86(Intel/AMD)CPU中常用。
- 地址0存
78,地址1存56,… 地址3存12。 - 口诀:小头在前(低地址)。
二、 存储器设计(必考大题:搭积木)
这是本章的计算与画图核心。题目通常是:“我有若干个小芯片,请帮我组装成一个大内存”。
1. 容量扩展(拼乐高)
假设我们有的小芯片是 1K $\times$ 4位。
- 位扩展 (增加字长):
- 需求:我想组成 1K $\times$ 8位 的内存。
- 做法:“并联”。两片芯片一起工作。
- 连线:地址线接一样的,片选线接一样的(同开同关)。
- 数据:芯片A负责低4位 (D0-D3),芯片B负责高4位 (D4-D7)。
- 字扩展 (增加容量):
- 需求:我想组成 2K $\times$ 4位 的内存。
- 做法:“串联”。两片芯片轮流工作。
- 连线:数据线接一样的。地址线低位接一样的。
- 片选 (CS):这是关键!需要用地址线的高位来控制谁干活(通过译码器)。
- 字位同时扩展:
- 需求:我想组成 4K $\times$ 8位 的内存。
- 做法:先位扩展(2片拼成1K$\times$8),再字扩展(搞4组这样的,拼成4K)。
2. 地址分配与片选(最难点:作业题11.11, 11.12同款)
这是一道逻辑推理题。 题目模型:
CPU地址线16根(A15~A0),现有芯片 2K $\times$ 8位。请设计一个从地址 8000H 开始的 4K 存储区。
解题步骤(保姆级):
- 分析需求:
- 目标容量 4K,芯片容量 2K。 $\to$ 需要 2片 芯片进行字扩展。
- 每片芯片容量 2K = $2^{11}$。 $\to$ 芯片内部需要 11根 地址线(A10~A0)。这一步连线是固定的。
- 确定高位地址(片选逻辑):
- CPU总共有 16根线 (A15~A0)。芯片用了低11根 (A10~A0)。
- 剩下的高位 (A15~A11) 用来做片选(决定哪片芯片工作)。
- 分析起始地址 (8000H):
- 把十六进制
8000H展开成二进制(对应A15…A0):1000 0000 0000 0000 - 把二进制切分:
- 高5位 (A15-A11):
10000(这就是片选信号的来源)。 - 低11位 (A10-A0):
000 0000 0000(这是芯片内部地址)。
- 高5位 (A15-A11):
- 把十六进制
- 分配芯片地址范围:
- 第一片芯片 (0~2K):
-
起始: 1000 0000 0000 0000= 8000H -
结束: 1000 0111 1111 1111= 87FFH - 片选条件:A15=1, A14=0, A13=0, A12=0, A11=0。
-
- 第二片芯片 (2K~4K):
-
起始: 1000 1000 0000 0000= 8800H (注意A11变了,这是下一片的入口)。 -
结束: 1000 1111 1111 1111= 8FFFH - 片选条件:A15=1, A14=0, A13=0, A12=0, A11=1。
-
- 第一片芯片 (0~2K):
- 设计电路 (译码器):
- 通常使用 3-8译码器 (74138)。
- 输入端A, B, C 接地址线(例如接 A11, A12, A13)。
- 使能端 (Enable) 接更高位的固定电平(如 A15=1, A14=0)。
- 输出端:
- 当 A11=0 时,译码器输出 $Y_0$ 有效 $\to$ 连第一片芯片的 $\overline{CS}$。
- 当 A11=1 时,译码器输出 $Y_1$ 有效 $\to$ 连第二片芯片的 $\overline{CS}$。
老师说的“起始地址如80H”是什么意思? 如果题目说系统是8位地址总线(小系统),80H就是
1000 0000。原理一样,最高位是1,说明要选通高地址的那部分内存。
三、 交叉存储器(提速黑科技)
为了让内存读写更快,我们把内存分成好几个“体”(Bank)。
1. 高位交叉 (顺序存储)
- 原理:用地址的高位决定去哪个Bank。
- 比如:00xxxx 去 Bank0,01xxxx 去 Bank1。
- 效果:数据是顺序存的。Bank0存满了才存Bank1。
- 缺点:对于连续读写(程序的局部性),还是只在Bank0里打转,不能并行,不能提速。主要是为了扩容。
2. 低位交叉 (模m交叉) —— 必考重点
- 原理:用地址的最低位决定去哪个Bank。
- 地址 0 $\to$ Bank 0
- 地址 1 $\to$ Bank 1
- 地址 2 $\to$ Bank 2
- 地址 3 $\to$ Bank 3
- 地址 4 $\to$ Bank 0 …
- 效果:连续的数据被打散放在不同的Bank里。
- 优点(流水线技术):
- CPU可以连续发令:读地址0,读地址1,读地址2…
- 虽然每个Bank读一次要 $T$ 时间,但因为它们是独立的,可以并行工作。
- 带宽公式:设存取周期为 $T$,总线传输周期为 $\tau$。如果是4体交叉,连续读取4个字的时间不是 $4T$,而是 $T + (4-1)\tau$。效率提升接近4倍。
第11章复习总结
- 背概念:SRAM/DRAM区别,大端小端区别。
- 做算术:
- 给容量算地址线根数($4K = 2^{12} \to 12$根)。
- 给起始地址推算片选逻辑(把十六进制写成二进制,看高位)。
- 画图:
- 如果考存储扩展设计,记得画译码器,地址线高位进译码器,输出连芯片的CS片选端。
- 数据线要双向箭头,地址线单向箭头。
搞定这一章的地址译码分析,你的大题分数基本就稳了!全书复习到此结束,祝你考试如有神助,全都考到复习过的点!