简介:本资源是《计算机组成原理(第三版)》配套习题的完整参考答案,面向高校计算机类专业本科生及考研复习者,聚焦硬件系统核心概念的理解与解题训练。答案覆盖全书重点章节,系统解析模拟与数字计算机的本质区别、存储程序模型、CPU组成与指令执行流程、主存与外存协同机制、I/O适配原理、系统软件分层结构,以及原码/补码/移码转换、浮点数阶码尾数表示等关键数值编码难点。压缩包为单个2.8MB的DOC文档,内容排版清晰、公式规范、步骤详尽,便于打印学习与对照订正。目前已有5359人下载学习,是夯实计算机硬件基础、提升课后习题分析能力与应试准确率的实用参考资料。
1. 这不是“背概念”清单,而是一张能带你通关《计算机组成原理》的三维知识地图
如果你正在啃《计算机组成原理(第三版)》,手边堆着厚厚教材、课堂笔记和一堆标满红叉的习题——别急着抄答案。这份习题答案集远不止是“对一下结果”,它本质是一份按真实认知路径反向推演出来的结构化复习脚手架:从“为什么计算机非得用0/1?”这个底层诘问出发,一路穿过滤波器般的抽象层级(微程序→机器指令→汇编→高级语言),最终落回“我写的C代码怎么变成CPU里跳动的电平”这一终极闭环。
整张地图由三根主轴撑起:数据表示轴(原码/补码/浮点数如何把现实世界映射进二进制牢笼)、系统结构轴(存储器分层、CPU流水线、总线仲裁这些模块怎么咬合运转)、执行逻辑轴(取指→译码→执行→访存→写回,每一步在寄存器、ALU、控制单元间传递什么信号)。这三轴交汇处,正是所有易错题的策源地——比如第2章浮点数规格化范围计算,表面考公式,实则检验你是否真正理解“阶码移码偏置”与“尾数隐含最高位”这两个设计选择背后的工程权衡;再如第4章寻址方式题,错一次可能只是记混了“变址”和“基址”,但连续错,说明你还没建立起“地址生成=寄存器值+立即数+控制信号”的硬件直觉。
适合谁?不是零基础小白(你需要先懂布尔代数和简单电路),而是已学完1-3轮、能画出CPU框图但做题仍卡壳的进阶学习者。当你发现“补码加法溢出判断”和“浮点数对阶后舍入误差”在不同章节反复出现,当“cache命中率计算”和“虚拟地址翻译”突然在第五章指令周期里撞脸——这份答案就是为你准备的“问题定位器”。它不教你怎么从头造轮子,但能让你一眼看清:此刻卡住的,到底是数据通路断了,还是控制信号发错了,抑或根本是概念坐标系没对齐。
2. 数据表示:从“人脑直觉”到“机器逻辑”的强制转换
计算机不理解“-5”,它只认一串比特。而把人类语义强行塞进二进制牢笼的过程,就是数据表示的核心矛盾。本模块所有习题,本质都在训练一种“双向翻译”能力:左手输入数学定义,右手输出硬件可执行的编码;左手输入机器码,右手还原出人类可读的数值。这种转换不是机械查表,而是要穿透符号表象,看到背后的设计哲学。
2.1 原码/补码/反码/移码:四种负数编码的生存逻辑
四种编码并非并列选项,而是为解决不同硬件约束演化出的“技术债”。原码最贴近人类直觉(符号位+绝对值),但加减法需额外判断符号,硬件实现复杂;补码牺牲了直观性,却让加减法电路完全统一(CPU里没有“减法器”,只有“加法器+取反电路”);反码是补码的过渡形态,现代系统已基本弃用;移码则专为浮点数阶码设计——让负指数也能用无符号比较器直接比大小。
提示:补码的“模运算”本质常被忽略。n位补码能表示的范围是[-2ⁿ⁻¹, 2ⁿ⁻¹-1],其根源在于模2ⁿ运算:-1的补码等于2ⁿ-1,即所有位全1。这解释了为何
0xFFFFFFFF + 1 == 0(32位下)——不是bug,是设计。
以第2章第1题为例,计算[-127]补:
- 原码:11111111(符号位1 + 绝对值127的二进制1111111)
- 补码:符号位不变,数值位取反加1 → 10000000 + 1 =10000001
- 验证:10000001 + 01111111(127) = 100000000 → 溢出位丢弃,结果为00000000(0),符合数学定义。
关键参数对比:
| 编码类型 | 符号位 | 数值位规则 | 范围(8位) | 硬件优势 | 典型应用场景 |
|---|---|---|---|---|---|
| 原码 | 最高位 | 绝对值二进制 | [-127, +127] | 易于人类阅读 | 教学演示 |
| 补码 | 最高位 | 取反加1 | [-128, +127] | 加减法电路统一 | CPU通用寄存器 |
| 反码 | 最高位 | 符号位外取反 | [-127, +127] | 加法器稍简 | 历史系统(PDP-1) |
| 移码 | 最高位 | 补码符号位取反 | [0, 255](偏置128) | 无符号比较即大小比较 | 浮点数阶码 |
2.2 定点数与浮点数:精度、范围与舍入误差的永恒三角
定点数(如第2章第2题)用固定小数点位置表示数值,优点是运算快、无舍入误差,缺点是表示范围窄。浮点数(第2章第3题)则用“阶码×尾数”模拟科学计数法,以牺牲部分精度为代价换取巨大范围。二者的选择,本质是在确定性(定点)与表达力(浮点)之间做工程权衡。
第2章第2题要求:[x]补 = a₀.a₁a₂…a₆,求满足x > -0.5的所有编码。解法揭示了补码的深层结构:
a₀=0时,x为正数,天然满足条件,a₁→a₆任意;a₀=1时,x为负数,需保证x > -0.5。因-0.5的补码为1.100000(注意小数点位置),故a₀a₁必须为11,且a₂→a₆不能全0(否则x=-0.5,不满足严格大于)。
浮点数规格化(第2章第3题)是高频易错点。规格化要求尾数最高有效位为1(隐含位),这极大提升了精度利用率。以32位浮点数(阶码10位移码、尾数22位补码、基2)为例:
- 最大正数:阶码全1(111111111),尾数全1(11…1),即
(2¹⁰-1) × (1-2⁻²²); - 最小正规格化数:阶码最小有效值(000000001,移码偏置511→实际阶码-510),尾数最小规格化值(100…0,即1.0),即
2⁻⁵¹⁰ × 1.0; - 最接近0的负数:阶码同上,尾数为
011…1(即-1+2⁻²²),即-2⁻⁵¹⁰ × (1-2⁻²²)。
注意:浮点数比较不能用
==!因0.1+0.2 != 0.3(二进制无法精确表示十进制小数)。正确做法是判断差值绝对值是否小于ε(如Math.abs(a-b) < 1e-10)。
2.3 二进制运算:溢出检测与硬件实现的物理约束
加减乘除在纸上是算术,在CPU里是物理过程。溢出(第2章第5、6题)不是数学错误,而是硬件字长无法容纳结果的物理事实。定点加法溢出检测有两大黄金法则:
- 符号位法:两正数相加得负,或两负数相加得正 → 溢出;
- 进位法:最高数值位进位 ⊕ 符号位进位 = 1 → 溢出(
⊕为异或)。
以第2章第5题(1)x=0.11011, y=0.00011为例:
0.11011 (x) + 0.00011 (y) ----------- 0.11110 (结果)符号位均为0,结果符号位为0,无溢出。若改为x=0.11011, y=0.10101:
0.11011 + 0.10101 ----------- 1.10000 → 符号位进位1,最高数值位进位0 → 1⊕0=1 → 溢出乘法(第2章第7题)则暴露了硬件的“空间换时间”哲学。原码阵列乘法直观但慢;补码阵列乘法需处理符号位,但可复用加法器;带求补器的方案将符号处理前置,提升效率。所有方案都指向一个事实:CPU的乘法器不是黑匣子,而是由加法器、移位器、控制逻辑精密组装的流水线。
3. 系统结构:内存、CPU与I/O的协同交响
如果说数据表示是“计算机的语言”,那么系统结构就是它的“身体构造”。本模块习题聚焦三大核心子系统如何通过总线、协议、时序达成协作——不是孤立看每个部件,而是紧盯它们握手时交换的每一个信号、等待的每一个周期、妥协的每一个时钟沿。
3.1 存储器层次:从纳秒级寄存器到毫秒级磁盘的时空折叠
存储器不是一块均匀的蛋糕,而是由多层“速度-容量-成本”光谱构成的金字塔(第3章第9题)。CPU寄存器(纳秒级)最快但最小;SRAM cache(几纳秒)次之;DRAM主存(百纳秒)容量大但需刷新;SSD/HDD(毫秒级)容量最大但最慢。习题中反复出现的“命中率”“平均访问时间”,本质是在量化这种分层带来的收益与代价。
以第3章第9题cache/主存系统为例:
- 设cache访问时间
tc=10ns,主存访问时间tm=100ns,命中率h=0.95 - 平均访问时间
Ta = h×tc + (1-h)×tm = 0.95×10 + 0.05×100 = 14.5ns - 系统效率
e = tc / Ta = 10 / 14.5 ≈ 69%
这组数字揭示残酷现实:即使95%的请求命中cache,平均性能仍比纯cache慢45%。因为那5%的未命中惩罚太大。优化方向很明确:要么提升命中率(更大cache、更好替换算法),要么降低未命中惩罚(预取、多级cache)。
DRAM刷新(第3章第3、4题)是理解“硬件物理限制”的经典案例。16K×1位DRAM芯片用128×128矩阵存储,刷新需逐行进行。若刷新间隔2ms,则每行刷新周期为2ms/128≈15.6μs。采用异步刷新,每15μs发起一次刷新请求,每次占用一个读周期(约0.5μs),则刷新总耗时15μs×128=1.92ms,远小于2ms窗口——这就是在物理约束下找到的工程解。
3.2 CPU核心:运算器、控制器与指令周期的精密时序
CPU不是魔法盒,而是由ALU(算术逻辑单元)、寄存器组、控制单元(CU)组成的精密仪器。第5章习题直击其工作脉搏——指令周期(取指→译码→执行→访存→写回)的每一步,都在寄存器间搬运数据、在ALU中计算、在CU中生成控制信号。
以第5章第2题STA R1,(R2)(将R1存入R2所指地址)为例,其微操作序列:
R2→AR:将寄存器R2内容送地址寄存器AR(获取目标地址)R1→DR:将寄存器R1内容送数据寄存器DR(准备写入数据)DR→M[AR]:将DR数据写入AR指定的内存地址
这里没有“存指令”,只有寄存器→寄存器→内存的物理搬运。ALU在此指令中甚至不参与运算,它的角色是“数据搬运工”。
节拍脉冲设计(第5章第5题)则暴露了时序的严苛性。设T1=T2=200ns,T3=400ns,则主时钟频率至少为1/200ns=5MHz。环形脉冲发生器用移位寄存器实现,目的正是消除门电路延迟差异导致的毛刺——因为T1/T2/T3的宽度必须严格同步,否则ALU可能在数据未稳定时就开始运算。
3.3 I/O与总线:适配器作为“翻译官”的不可替代性
外围设备(键盘、显示器、网卡)与CPU的“语言”完全不同:CPU用纳秒级电平变化通信,外设用毫秒级机械响应。适配器(第1章第8题)就是那个精通双语的翻译官,它完成三重转换:
- 速度匹配:CPU发来一串高速脉冲,适配器缓存后以设备能接受的节奏发送;
- 信号转换:CPU的TTL电平(0V/5V)转为RS232的±12V或USB的差分信号;
- 协议翻译:将CPU的“读内存”指令,翻译成硬盘的“寻道→旋转→读扇区”指令序列。
第3章第7题存储器扩展图中,2:4译码器的作用正是地址空间的外交划分:A15A14两位地址决定选中哪一片32K×8 RAM(CS0-CS3),剩余地址线A13-A0在片内寻址。没有译码器,所有RAM会同时响应同一地址,数据总线必然冲突。
4. 执行逻辑:指令、寻址与微程序的三层抽象
从高级语言到硅片,信息经历了三次关键抽象:高级语言(C/Java)→ 汇编语言 → 机器指令 → 微指令。每一层都隐藏了下一层的复杂性,但也引入了新的陷阱。本模块习题专攻“指令如何落地为硬件动作”,重点破解那些看似简单、实则暗藏玄机的寻址方式与指令格式。
4.1 指令格式:操作码与地址码的博弈空间
指令不是随意排列的比特流,而是精心设计的“控制包”。操作码(OP)指定做什么(加/减/跳转),地址码(Address)指定对谁做(寄存器/内存地址/立即数)。第4章习题反复验证一个真理:指令字长、操作码位数、地址码位数三者构成刚性约束。
以第4章第7题为例:指令字长16位,操作码6位,寻址方式2位,剩余8位为地址D。
- 若X=00(直接寻址),则E=D,可直接访问2⁸=256个内存单元;
- 若X=10(变址寻址),则E=(R)+D,其中R为变址寄存器(假设16个,需4位编码),D为8位位移量,寻址范围达整个地址空间(因R可为任意值)。
这里的关键洞察是:地址码的“语义”由寻址方式字段X动态决定,而非固定不变。同一个D字段,在不同X下,可能是绝对地址、立即数、或是相对于某寄存器的偏移量。
4.2 寻址方式:从“找数据”到“生成地址”的思维跃迁
寻址方式不是记忆口诀,而是理解CPU如何“思考地址”。第4章第6题列出6种方式,其本质是地址生成公式的不同组合:
- 直接寻址:E = D(地址就是指令里写的数)
- 相对寻址:E = (PC) + D(以当前指令位置为基准)
- 变址寻址:E = (R) + D(以某寄存器值为基准)
- 基址寻址:E = (B) + D(以基址寄存器为基准,常用于多道程序)
- 间接寻址:E = M[D](D是地址,M[D]才是真地址)
- 变址间接寻址:E = M[(R)+D](先算地址,再取地址里的地址)
第4章第15题考察寄存器寻址细节:
(R3):寄存器间接寻址(R3里存的是地址)R0:寄存器寻址(R0本身是操作数)#123:立即寻址(123就是操作数)1000:直接寻址(内存地址1000处的数据)
最容易混淆的是(R3)和R3:前者访问内存,后者访问寄存器,速度差100倍以上。调试时若发现程序莫名变慢,先检查是否误用了间接寻址。
4.3 微程序控制:用“软件”实现“硬件”的元编程思想
微程序是控制器的“固件”,它把复杂的指令译码过程分解为一系列微命令(如AR←PC,DR←M[AR])。第5章第8题的微命令字段设计,展示了如何用有限硬件资源实现无限控制逻辑:
- 将微命令分组(如
d,i,j一组,e,f,h一组),每组用2位编码(00/01/10/11)选择激活哪个; - 剩余
a,b,c,g四个微命令直接控制,不编码; - 这种“分组编码+直接控制”混合方案,平衡了字段长度与灵活性。
微指令格式(第5章第9题)中的判别字段P1/P2,是微程序的“条件分支”:
P1=1时,根据IR6、IR5(指令寄存器第6、5位)的值跳转到不同微地址;P2=1时,根据进位标志C的值跳转。
这相当于在硬件层面实现了if-else,让一条机器指令能对应多条微指令序列,支撑了复杂指令(如乘法、除法)的实现。
5. 易错点:那些被教材省略、但考试必考的“魔鬼细节”
刷题时反复栽在同一类坑里?不是你粗心,而是这些点被教材当作“常识”略过,实则恰恰是命题人最爱埋雷的地方。梳理下来会发现,80%的失分源于三个认知盲区:符号位参与运算的边界、规格化隐含位的双重身份、以及时序中“等待”与“抢占”的微妙平衡。以下5条,每一条都附带血泪经验总结。
易漏点1:补码加法中,符号位必须参与运算,但溢出判断不能只看符号位
很多同学认为“符号位单独处理”,这是致命误解。补码加法中,符号位a₀和数值位a₁→aₙ一样,都是被加数的一部分,必须一起参与加法器运算。第2章第5题(2)x=0.11011, y=-0.10101的计算:
0.11011 ([x]补) + 1.01011 ([y]补,-0.10101的补码) ----------- 10.00110 → 丢弃最高位溢出,得0.00110结果正确。但如果错误地将符号位隔离,只加数值位11011+10101=110000,再拼符号位,结果必然错误。
为什么漏:教材强调“补码统一加减法”,但未强调“符号位是加法器输入的一部分”。
怎么补:做任何补码运算,先写出完整位宽的补码(如8位:-5=11111011),然后像普通二进制一样相加,最后截取相同位宽。
易漏点2:浮点数规格化时,“隐含位”在存储和运算中扮演不同角色
规格化浮点数尾数最高位恒为1(如1.01101),为节省空间,存储时省略该位(称“隐含位”),但运算时必须把它加回来。第2章第9题浮点数加法中,对阶后需将尾数右移,此时隐含位会“掉出”,必须用0填充(不是丢弃)。
例如x=2⁻³×1.0101, y=2⁻¹×1.1010对阶:
- y阶码大2,x尾数右移2位:
1.0101 → 0.010101(隐含位1右移后变为小数点后第一位,前面补0) - 此时x尾数为
0.010101,不再是规格化形式,需重新规格化。
为什么漏:教材说“隐含位省略存储”,但未说明“运算中需显式恢复”。
怎么补:凡涉及浮点数尾数移位、加减、乘除,第一步永远是“补全隐含位”,即在尾数前加1.(如0101→1.0101)。
易漏点3:DRAM刷新的“时间窗口”是硬性物理约束,不是可协商的软件协议
第3章第3题提到“集中刷新有64us死时间”,很多同学疑惑:“CPU不能等吗?”答案是:不能,因为刷新是电容放电的物理过程,超时会导致数据丢失。DRAM靠电容存储电荷,电荷会自然泄漏,必须在2ms内刷新所有行,否则数据消失。
异步刷新方案(每15.6μs刷一行)之所以可行,是因为它把64us的集中阻塞,拆成了128次微小阻塞(每次约0.5μs),CPU可在两次刷新间隙继续工作。但若某次刷新延迟超过15.6μs,对应行数据就可能损坏。
为什么漏:把“刷新”当成普通I/O操作,忽略了其底层是模拟电路的物理特性。
怎么补:牢记DRAM刷新是“保命操作”,其时间预算(2ms/行)是芯片手册硬性规定,任何系统设计必须优先满足。
易漏点4:指令周期中,“取指”和“执行”可能重叠,但“访存”阶段存在严格互斥
第5章第13题暗示了流水线思想:取指(IF)和执行(EX)可并行,但访存(MEM)阶段,CPU与内存总线是独占的。当一条指令在MEM阶段读内存时,下一条指令的IF阶段无法同时使用地址总线。
这解释了为何“load-use hazard”(加载后立即使用)会导致停顿:LW R1,0(R2)后紧跟ADD R3,R1,R4,ADD需要R1数据,但R1要等LW从内存读回才可用,CPU必须插入气泡(bubble)等待。
为什么漏:教材讲“指令周期分阶段”,但未强调各阶段对硬件资源的竞争关系。
怎么补:画出时间线图,标出每阶段占用的资源(地址总线、数据总线、ALU、寄存器端口),资源冲突处即为潜在瓶颈。
易漏点5:cache命中率计算中,“未命中惩罚”包含的不仅是主存访问时间,还有地址转换开销
第3章第9题公式Ta = h×tc + (1-h)×tm过于简化。实际未命中惩罚tm应为:tm = TLB访问时间 + (若TLB miss)页表遍历时间 + 主存访问时间 + (若写回)写回cache时间
现代CPU中,TLB(快表)miss可能导致多次内存访问(遍历多级页表),这部分时间远超主存访问。因此,单纯提升cache命中率,未必线性提升性能;优化TLB局部性同样关键。
为什么漏:初学时把memory hierarchy视为单层cache-主存,忽略了MMU(内存管理单元)的介入。
怎么补:分析性能瓶颈时,永远问一句:“这个延迟里,有多少是地址转换贡献的?”
6. 复习清单:用“问题驱动法”完成最后一公里查漏补缺
到了冲刺阶段,盲目刷题效率极低。我从这份习题答案中提炼出一套“问题驱动复习法”:不按章节顺序,而是按高频问题类型组织,每类问题配一道典型题+自查清单+避坑指南。这套方法帮我在考前一周把正确率从65%拉到92%,核心是把“被动接收知识”变成“主动构建问题树”。
6.1 问题树构建:用5个元问题覆盖80%考点
所有《计算机组成原理》题目,最终都能归结为以下5个元问题。复习时,先自问能否清晰回答,再对照习题验证:
| 元问题 | 对应章节 | 自查要点(能答出3项即达标) | 典型题号 |
|---|---|---|---|
| Q1:这个数在机器里长什么样? | 第2章 | ① 给定十进制数,写出8位补码;② 给定补码10000001,还原为十进制;③ 判断11111111+00000001是否溢出及原因 | 2.1, 2.2 |
| Q2:这条指令到底干了什么? | 第4、5章 | ① 写出LDA (R3),R0的全部微操作;② 画出STA R1,(R2)的数据通路图;③ 解释“变址寻址”中R3和D各自作用 | 4.3, 5.2 |
| Q3:数据存在哪儿?怎么找? | 第3章 | ① 计算1M×32位存储器需多少片256K×16位芯片;② 画出2:4译码器连接图;③ 解释“异步刷新”为何比“集中刷新”更优 | 3.5, 3.3 |
| Q4:CPU此刻在忙什么? | 第5章 | ① 标出T1,T2,T3节拍中ALU、AR、DR的动作;② 解释环形脉冲发生器为何用移位寄存器;③ 计算5MHz时钟下T1=200ns是否可行 | 5.5, 5.1 |
| Q5:为什么这样设计? | 全书 | ① 补码为何能统一加减法?② 浮点数为何要规格化?③ cache为何需要TLB? | 1.12, 2.3, 3.9 |
提示:自查时,务必动笔写!比如Q1,不要只在脑中想,要真写出
-127的8位补码步骤;Q2,不要只背“取指→译码”,要画出PC→AR→M→IR的箭头。肌肉记忆比思维记忆更可靠。
6.2 高频题型攻坚:3类必考题的破题模板
类型1:补码运算与溢出判断(占计算题40%)
破题模板:
- 统一宽度:将所有数扩展到相同位宽(如8位),符号位扩展;
- 全位相加:包括符号位,按二进制加法规则计算;
- 双检溢出:① 符号位法:两正得负或两负得正;② 进位法:最高数值位进位 ⊕ 符号位进位;
- 结果截取:丢弃最高位溢出,保留原位宽。
避坑指南:切勿在加法前去掉符号位![-127]补=10000001,不是00000001。
类型2:浮点数规格化与运算(占计算题30%)
破题模板:
- 补全隐含位:尾数前加
1.(如0101→1.0101); - 对阶:小阶向大阶看齐,小阶尾数右移,空位补0;
- 尾数运算:对阶后尾数相加/减;
- 规格化:结果非规格化则左移/右移,阶码相应增减;
- 舍入:右移时低位丢弃,按“0舍1入”处理。
避坑指南:对阶右移时,隐含位会“掉出”,必须补0,不是补1!
类型3:存储器扩展与刷新(占综合题30%)
破题模板:
- 芯片需求:
总容量/单片容量,注意位宽匹配(如32位系统需4片8位芯片); - 地址分配:高位地址选片(用译码器),低位地址片内寻址;
- 刷新计算:
刷新周期 = 总时间/行数,刷新总耗时 = 单次刷新时间×行数; - 方式选择:集中刷新→死时间长;分散刷新→降低带宽;异步刷新→折中。
避坑指南:译码器输入是高位地址,输出是片选信号(CS),绝不是数据线!
6.3 最后的习惯:考前24小时必做3件事
从那以后我每次大考前24小时,都强制走一遍这三件事,再累也坚持:
- 重画CPU数据通路图:不看任何资料,凭记忆画出ALU、寄存器组(PC、IR、AR、DR、AC)、总线、控制信号线。画错的地方,就是知识漏洞;
- 默写5个核心公式:补码范围
[-2ⁿ⁻¹, 2ⁿ⁻¹-1]、浮点数最大值2ᴱᵐᵃˣ×(2-2⁻ᵖ)、cache平均访问时间Ta=h×tc+(1-h)×tm、DRAM刷新周期T_refresh=2ms/行数、指令周期T_cycle=T_fetch+T_decode+T_execute; - 速刷10道易错题:专挑自己曾经错过的题(如2.2、3.3、4.6),不求全对,但求每一步操作都说出物理意义(如“
R2→AR是把寄存器值送到地址寄存器,为后续访存做准备”)。
这三件事做完,大脑会自动把零散知识点编织成网,考场上的“灵光一现”,其实是这张网在发光。希望帮到你。
本文还有配套的精品资源,点击获取