
简介《计算机组成与系统结构》第三版袁春风课后习题答案汇总面向计算机专业本科生、考研复习者及自学者重点覆盖指令系统、性能分析与数据表示等核心章节。资源为单个doc文档压缩包仅1.75MB内容按章节整理便于打印或对照学习已有1171人浏览学习适合课后自测、作业校对和考前冲刺。资料包含典型习题的详细解答过程例如第1章围绕基准程序P1、P2在机器M1、M2上的执行时间与指令条数逐步推导执行速度、MIPS、CPI并从性价比角度比较机器优劣第2章涉及数制转换等基础练习。书中还分析了不同指令序列在同一台机器上的CPI与执行时间差异以及时钟频率、CPU时间占比等关键计算可帮助读者检验解题思路系统巩固计算机体系结构中的性能评价方法。1. 计算机组成与系统结构第三版课后题先想清楚这本题集在训练什么袁春风《计算机组成与系统结构》第三版的课后题和很多“背一背就能过”的题目不一样它不满足于让你算出某个数值而是逼着你在数据通路、控制信号、存储层次之间来回走一遍。同一道题可能同时涉及指令格式、寄存器传输和 Cache 命中率错一步就全盘皆输。这本书是不少高校“计算机组成原理”课程的主教材也被部分院校列为考研参考书课后题风格和期末、考研真题的重合度很高。期末冲刺的本科生、备考的考研党以及工作几年后想回补体系结构基础的工程师都能从逐题拆解中拿到真正可复用的判断力。这里的“答案汇总”不是把结果抄一遍而是把每类题的推导路径、易错点和验证方式讲透。2. 按章节铺考点地图计算题、设计题、简答题分别在哪儿出现拿到一本课后答案集先别急着对题号。袁版教材各章对能力的考察方式差异很大先用一张表把“哪一章考什么、用什么题型考”钉在脑子里后面刷题才有方向。2.1 高频考点与题型分布速查表教材章节主题高频考点常见题型复习优先级数据的机器级表示原码/反码/补码/移码、IEEE 754、CRC 校验、溢出判断计算题 简答题高程序的机器级表示寻址方式、指令格式、汇编代码片段分析计算题 分析题高存储系统层次结构Cache 地址映射、命中率、平均访存时间、虚拟存储与页表计算题 论述题高中央处理器单周期数据通路、控制信号取值、硬布线/微程序、流水线冒险设计题 简答题高总线与输入输出系统总线仲裁方式、中断处理流程、DMA 与中断区别简答题 选择题中从表里能看出一个规律计算题高度集中在“数据表示”和“存储层次”设计题集中在“CPU 数据通路”。很多人在考场上失分不是因为不会算而是因为没意识到这道题属于哪个知识块用错了公式。2.2 计算题必须背下来的核心公式课后题里的计算题看着花样多底层公式就那几个。袁版教材的习题特别喜欢把公式组合起来考比如把 Amdahl 定律和 CPI 计算放进同一道题。公式适用场景最容易写错的地方平均访存时间 命中时间 缺失率 × 缺失代价Cache 性能分析忘记把缺失率写成小数或混淆缺失代价单位CPU 时间 指令数 × CPI × 时钟周期程序性能评估把时钟频率直接当周期用忘记取倒数加速比 1 / ((1 - F) F / S)Amdahl 定律F 的比例搞错对象S 用成全局加速比块内偏移 log2(块大小字节数)Cache 地址结构分解没先把 Cache 容量和块大小统一单位组索引位数 log2(Cache 容量 / (块大小 × 组相联度))组相联映射地址分解漏除组相联度把组数算成块数这些公式背熟只是一半另一半是知道每个符号在实际题目里对应谁。比如“缺失代价”在不同教材里定义有差异袁版课后题里一般指“从主存读一块到 Cache 所需额外周期数”做题前先看题干有没有给“额外”二字。2.3 设计题和简答题的答题框架CPU 一章的课后题往往是“给出指令要求标出数据通路中各控制信号的值”。这类题没有公式可套但答题顺序是固定的先把指令按功能归类访存类、运算类、分支类再逐项确认 RegWrite、ALUSrc、MemWrite、MemRead、MemtoReg、Branch、Jump 等信号。遇到分支指令额外注意 PC 的写入条件。简答题则集中在“比较硬布线与微程序控制的优缺点”“说明中断和 DMA 的流程差异”这类固定题上答案结构按“定义—流程—区别—适用场景”四段写得分点基本不会丢。这一章的目标是建立全局框架。有了考点地图和公式表接下来才能进入真正的题型拆解。3. 四类高频计算题的完整推导按课后题套路一步步算给你看课后题里反复出现的计算题型就那几类把每类的推导路径固定下来比盲目刷几十道更有效。下面按袁版教材的出题习惯给出四类必考题型的典型问法、完整推导和结果验证。3.1 浮点数表示题从十进制数到 IEEE 754 十六进制典型问法将十进制数 -85.625 转换成 IEEE 754 单精度浮点数写出其十六进制表示。第 1 步确定符号位。负数符号位为 1。第 2 步转换整数部分和小数部分。85 1010101B0.625 0.101B合起来为 -1010101.101B。第 3 步规格化。小数点左移 6 位得到 1.010101101 × 2^6因此阶码真值为 6。第 4 步计算偏置阶码。单精度偏置常数为 127偏置阶码 127 6 133 10000101B。第 5 步拼接字段。符号位 1 阶码 10000101 尾数 010101101 后补 0 到 23 位。第 6 步转十六进制。完整 32 位为1100 0010 1010 1011 0100 0000 0000 0000即0xC2AB4000。可以写一段 Python 脚本验证结果避免手算时在字段拼接环节出错import struct def to_ieee754_hex(value): # 使用小端序打包为 32 位浮点再按无符号整数解包 packed struct.pack(f, value) return hex(struct.unpack(I, packed)[0]) print(to_ieee754_hex(-85.625)) # 期望输出 0xc2ab4000这段代码把 Python 浮点数按 IEEE 754 单精度格式打包成 4 字节再按无符号整数读回来输出结果与手算一致。参数f表示小端序单精度浮点I表示小端序无符号 32 位整数。日常做课后题时可以用它批量验算所有十进制转浮点的结果。3.2 Cache 地址映射题组相联的结构分解典型问法某机器地址宽度 32 位Cache 容量 64KB块大小为 32B采用 4 路组相联映射求地址字段中块内偏移、组索引、标记各占多少位。块内偏移位数 log2(32) 5 位。组数 Cache 容量 ÷ (块大小 × 组相联度) 64KB ÷ (32B × 4) 512 组。组索引位数 log2(512) 9 位。标记位数 32 - 5 - 9 18 位。所以地址结构为| 标记 18 位 | 组索引 9 位 | 块内偏移 5 位 |。这里最常见的错误是计算组数时忘记乘相联度。如果按“块数 64KB ÷ 32B 2048 块”直接算索引会得到 11 位白白占用标记位。另外很多题会把 Cache 容量写成 KB把块大小写成 B算之前先统一单位否则结果差 2^10 倍。3.3 CPI 与 Amdahl 定律混合题优化前后性能对比典型问法某程序在一台主频 2GHz 的机器上运行动态指令数为 10^9平均 CPI 为 1.5。其中访存指令占 30%经优化后访存指令的 CPI 降为原来的 1/3求优化后的 CPU 时间以及整体加速比。原始 CPU 时间 10^9 × 1.5 × (1 / 2GHz) 0.75 秒。访存指令 CPI 变化原访存 CPI 为 1.5优化后为 0.5节省 1.0 个周期。由于访存指令占 30%新平均 CPI 1.5 - 0.3 × 1.0 1.2。优化后 CPU 时间 10^9 × 1.2 × 0.5ns 0.6 秒。加速比 0.75 ÷ 0.6 1.25。用 Amdahl 定律反向验证访存指令局部的加速比为 1.5 ÷ 0.5 3F 0.3整体加速比 1 / ((1 - 0.3) 0.3/3) 1.25与前面结果一致。这种混合题的坑在于优化的是“访存指令这一部分”的 CPI而不是整段程序的 CPI 直接除以 3。凡是出现“某部分优化为原来的几分之一”的表述先计算局部加速比再代入 Amdahl 定律。3.4 数据通路控制信号题从指令反推信号取值典型问法某单周期数据通路执行一条sw写存储器指令要求列出 RegWrite、ALUSrc、MemWrite、MemRead、MemtoReg、Branch 等控制信号的取值。这类题的固定推导逻辑是指令要做什么信号就为对应的值。sw指令把寄存器中的值写入存储器需要读出寄存器RegWrite0不写寄存器堆、计算访存地址ALUSrc1选择立即数、写存储器MemWrite1MemRead0、不写回寄存器MemtoReg 无所谓通常取 0、不产生分支Branch0。做题时不要按信号顺序背而是按“取指→读寄存器→ALU 运算→访存→写回”的执行步骤逐项判断。碰到不确定的 MemtoReg先看指令类别只有lw指令需要从存储器读数并写回寄存器该信号才为 1其他指令统一填 0。这类题在袁版教材课后题中出现频率很高如果能画出单周期数据通路图并在图上标信号流向正确率会明显提升。4. 高频易混点和失分点做完一遍后需要重点回看的辨析清单课后题做错通常不是因为不会算而是几个概念在脑子里打架。把易混点提前摆出来能少走很多弯路。4.1 原码、反码、补码、移码的表示范围与零的表示编码方式8 位表示范围零的表示加减法特点原码-127 ~ 1270 和 -0 两种符号位不参与运算需额外处理符号反码-127 ~ 1270 和 -0 两种符号位参与运算但进位需循环回加补码-128 ~ 127唯一全 0符号位参与运算减法变加法移码-128 ~ 127唯一10000000常用于浮点阶码便于比较大小失分点多在“补码的范围为什么多一位”和“移码与补码的转换关系”上。补码的最小负数比原码多一位是因为补码的 10000000 表示 -128而原码的 10000000 表示 -0浪费了一种编码。移码的数值表示是补码的符号位取反这一点在浮点数阶码计算题里反复出现。4.2 三种 Cache 映射方式的地址结构对比映射方式地址结构优点缺点直接映射标记 索引 块内偏移硬件简单查找快冲突率最高全相联标记 块内偏移冲突率最低比较器成本高组相联标记 组索引 块内偏移折中方案折中复杂度做题时最容易出错的是“索引字段的含义”。直接映射的索引定位 Cache 行组相联的索引定位 Cache 组全相联根本没有索引字段。很多题会让计算“地址 A 映射到哪一组”这时只要用组索引字段的位数做掩码提取即可不要拿完整地址去除以组数。4.3 中断、异常、陷阱三者别混为一谈这三者在袁版教材里是分开讨论的中断是外部设备异步引起的异常是 CPU 执行指令时同步产生的比如除零、缺页陷阱是程序主动触发系统调用。简答题里光写“中断就是 CPU 停下来处理别的事”只能拿一半分必须指出触发源是同步还是异步。DMA 与中断的区别也是常考简答题中断需要 CPU 介入每次数据传输DMA 由专用控制器完成批量传输结束后才通知 CPU。4.4 题干里的“陷阱词”课后题题干里有些词会改变整个计算方向。出现“平均访问时间”时要按 Cache 缺失代价逐级展开出现“时钟频率提高 20%”时时钟周期要换算成原来的 1/1.2出现“CPI 为 2其中 30% 的指令可以被优化为 1 个周期”时先算加权平均 CPI而不是把 2 直接减 0.3。把这些词圈出来画箭头能避免一半以上的低级错误。5. 验证答案的 3 个实用技巧对答案之前先自己验一遍课后题答案汇总的意义不是让你抄而是让你在“自己算出结果”和“参考答案”之间建立校验机制。下面三个技巧可以帮你在一分钟内判断答案是否合理。5.1 数量级与边界值检查算出一个结果后先看数量级。浮点数十六进制表示如果以 0xBF 或 0xC0 开头说明数值在 -1 到 -2 附近如果算出 Cache 组索引位数超过 20 位说明组数已经超过百万和题干容量明显不匹配。补码题也可以用边界值快速核验8 位补码的最小值是 -128如果答案算出来小于 -128编码一定写错了。5.2 用 Python 快速验算浮点和补码不管是 IEEE 754 转换还是补码加减法都可以用脚本批量验算。除了上一章的struct方法外补码运算可以用位运算直接验证def to_twos_complement(value, bits8): # 取模 2^bits得到补码的无符号表示 return value ((1 bits) - 1) print(to_twos_complement(-85, 8)) # 171即 0xAB print(to_twos_complement(85, 8)) # 85即 0x55这段代码用value mask把负数截断到指定位宽效果等价于“取反加一”。参数bits控制位宽做 16 位补码题时改成 16 即可。需要说明的是Python 的整数无限长必须先与掩码做按位与否则负数会得到无限长的补码形式。5.3 反向代入法把算出来的答案当作已知条件反向代入原题。比如算完 Cache 地址结构后用“标记位数 索引位数 偏移位数”反向验证是否等于地址线总数算完优化后 CPU 时间后用 Amdahl 定律重新计算加速比。反向代入法不需要额外工具只需要把题目条件重新读一遍确认每一步计算用到的数值都能在题干里找到出处。如果某个数字在题干中根本没出现很可能从一开始就用错了公式。本文还有配套的精品资源点击获取