简介:这份《计算机组成原理(第三版)习题答案》面向高校计算机及相关专业学生、考研备考者与授课教师,用于课后练习核对、期末复习与知识点查漏补缺。内容围绕模拟计算机与数字计算机的区别、存储程序通用电子计算机模型、CPU与存储器结构、系统软件与程序设计语言层次、原码补码反码移码及浮点数表示等核心考点展开,逐章给出习题解析,便于对照教材梳理概念与运算方法。资源包共1个文件,为doc文档,整体约2.8MB,可直接打开查阅与打印。目前已有5353人学习下载,适合需要系统刷题、验证解题思路或备课参考的读者使用。
1. 从一份习题答案说起:计算机组成原理到底在考什么
很多人拿到《计算机组成原理(第三版)习题答案》的第一反应是“对答案”,但我更愿意把它当成一份考点地图。这份答案覆盖了从第一章计算机分类、存储程序概念,到第二章原码/补码/反码/移码转换、浮点数规格化、补码阵列乘法、原码除法,再到第三章存储器扩展、DRAM刷新、Cache命中率、交叉存储器带宽,以及第四五章指令格式、寻址方式、微操作命令和微指令编码。它解决的不是“这道题选A还是B”,而是让你看清:哪些知识点是反复出题的硬骨头,哪些只是概念填空。
适合谁用?如果你正在期末复习、准备考研专业课,或者刚入职需要补数字逻辑与体系结构的基础,这份答案能帮你快速定位薄弱环节。但注意,它是一份答案文本,不是教材替代品——第二章的补码运算如果只看结果不推过程,考试换个数字照样翻车。下面我按“怎么用→怎么避坑→怎么进阶”的顺序,把这份资源拆开讲。
2. 数据表示与运算:从补码转换到浮点数规格化的手算流程
2.1 原码、补码、反码、移码的转换规则与边界值
第二章开篇就是-127、-1这些特殊值的四种码表示。很多人背了“补码取反加一”就上场,遇到-1和-127就懵。我一般会先建一张边界值表,把8位机下的关键值钉死:
| 真值 | 原码 | 补码 | 反码 | 移码 |
|---|---|---|---|---|
| -127 | 11111111 | 10000001 | 10000000 | 00000001 |
| -1 | 10000001 | 11111111 | 11111110 | 01111111 |
| 0 | 00000000 | 00000000 | 00000000 | 10000000 |
| +127 | 01111111 | 01111111 | 01111111 | 11111111 |
这张表建议手抄一遍。为什么-1的补码是全1?因为补码的定义是模2^n下的同余数,-1 ≡ 2^8 - 1 = 255 = 11111111。移码则是补码符号位取反,所以-1的移码是01111111。答案里还给了[-1]移=00000000的情况,那是针对7位数值位+1位符号位的另一种约定,做题时先看题目字长。
提示:遇到“求x的补码,其中x=-0.5”这类小数题,先确认题目是定点小数还是定点整数。定点小数的补码符号位后直接跟小数位,-0.5 = -0.1(2),补码为1.100000。
2.2 浮点数规格化:阶码移码与尾数补码的配合
第二章第3题是32位浮点数,阶码10位移码,尾数22位补码,基为2。答案给出了最大数、最小数、规格化范围。这里最容易翻车的是尾数用补码表示时,规格化数的判断条件:正数尾数最高位必须为1,负数尾数最高位必须为0(即符号位与最高数值位不同)。答案里正最大尾数是11…1,负最大尾数是011…1,正好符合这个规则。
手算步骤我一般这样走:
- 先确定阶码的移码偏置值。10位移码,偏置 = 2^(10-1) = 512。
- 最大阶码对应真值E = 2^10 - 1 - 512 = 511。
- 尾数补码正最大为0.11…1(21个1),真值接近1。
- 所以最大正数 ≈ 2^511 × (1 - 2^-21)。
答案里用二进制串直接写出来了,但你要能还原成这个推导过程。否则题目换成阶码8位、尾数24位,你又得重新猜。
2.3 补码阵列乘法与除法:手算校验的笨办法
第二章第7题出现了原码阵列、补码阵列、带求补器的补码阵列三种乘法。答案里直接补码阵列标注“不要求”,但考试可能只考带求补器的那种。我的血泪经验是:先算符号位,再算绝对值乘法,最后根据符号位决定是否求补。以x=-0.11111, y=-0.11011为例:
符号位: 1⊕1 = 0 |x| = 11111, |y| = 11011 绝对值乘法: 11111 × 11011 --------- 11111 11111 00000 11111 11111 --------- 1101000101 结果为正,补码 = 0,11010,00101答案里那一堆0和1的竖式,其实就是这个过程的展开。如果你直接看答案的竖式会晕,建议自己用十进制验算:0.11111(2) ≈ 0.96875,0.11011(2) ≈ 0.84375,乘积≈0.81738,二进制0.1101000101 ≈ 0.81738,对上了。
除法部分(第8题)用的是加减交替法。答案里符号位单独算,然后绝对值除法。关键点是每次上商后要根据余数符号决定下一步加还是减。我一般会画一个表格,列“余数符号→操作→商位”,比盯着竖式看效率高。
3. 存储系统:DRAM刷新、Cache命中率与交叉存储器带宽
3.1 DRAM刷新方式的选择:集中、分散还是异步
第三章第3题是经典题:64KB存储,16K×8位DRAM芯片,刷新周期2ms,128×128矩阵。答案选了异步刷新,刷新间隔15.6us取15us。为什么不用集中刷新?因为集中刷新有64us的死时间,CPU在1us内至少访存一次,死时间会导致停机。分散刷新每1us刷新一行,又太频繁,影响访存。
异步刷新的计算逻辑:
- 刷新周期2ms,共128行,所以刷新间隔 = 2ms / 128 = 15.625us。
- 取15us是为了留余量,实际刷新一遍耗时15us × 128 = 1.92ms < 2ms,满足要求。
注意:如果题目改成“刷新周期8ms,512行”,刷新间隔就是8ms/512 = 15.625us,同样取15us或16us。核心公式是刷新间隔 = 刷新周期 / 行数,然后向下取整留余量。
3.2 Cache命中率与平均访问时间
第三章第9题给了命中率h、Cache访问时间tc、主存访问时间tm,求平均访问时间Ta。公式是:
Ta = h × tc + (1 - h) × tm答案里还涉及Cache/主存系统效率e = tc / Ta。这题的关键是分清tc和tm的单位,以及命中率是小数还是百分比。如果题目说“命中率为95%”,代入时用0.95。如果题目说“Cache比主存快10倍”,那tm = 10tc,代入后Ta = h×tc + (1-h)×10tc = tc×(10 - 9h)。
我见过有人把tm和tc搞反,结果算出来Ta比tm还大,那就明显错了。检查方法:Ta一定在tc和tm之间,且h越大Ta越接近tc。
3.3 交叉存储器带宽:m个字连续读出的时间账
第三章第8题是顺序存储器和交叉存储器的带宽对比。顺序存储器连续读8个字,时间t1 = mT = 8×100ns = 800ns。交叉存储器则是流水线方式,第一个字100ns,之后每个字间隔一个总线传送周期τ。答案里交叉存储器的时间是T + (m-1)τ,带宽 = q / t。
这里有个容易忽略的点:交叉存储器的模块数决定了τ的下限。如果4个模块交叉,τ ≥ T/4。题目没给τ的具体值,但答案里用了τ = 50ns(假设T=100ns,4模块)。实际做题时,如果题目给了模块数m和存取周期T,τ = T/m。
带宽计算:
顺序带宽 = 512位 / 800ns = 640Mbps 交叉带宽 = 512位 / (100 + 7×50)ns = 512 / 450ns ≈ 1137Mbps交叉存储器带宽提升来自流水线重叠,但提升倍数受限于模块数和总线传送周期。如果τ太大,重叠效果就没了。
4. 指令系统与微操作:寻址方式编码与微指令字段设计
4.1 指令格式设计:操作码扩展与寻址方式位
第四章第7题是操作码扩展的典型:40条指令需占6位(2^6=64),剩余24条可扩展。4种寻址方式占2位,剩余8位作地址。答案给出了X=00直接寻址、X=01立即寻址、X=10变址、X=11相对的编码方案。
设计步骤我一般这样走:
- 数指令条数,确定操作码最少位数。40条 → 6位。
- 数寻址方式,确定寻址方式字段位数。4种 → 2位。
- 剩余位数 = 字长 - 操作码 - 寻址方式。假设16位字长,16 - 6 - 2 = 8位地址。
- 检查地址范围是否够用。8位地址 = 256个单元,如果题目要求寻址4KB,那就不够,需要调整字长或采用多字长指令。
答案里第8题还提到了“页面寻址”,用PC高8位形成256个页面。这种题的关键是先画字段分配图,再填编码。
4.2 微操作命令与微指令编码:直接控制与字段译码
第五章第8题是微指令控制字段的编码设计。答案把a,b,c,g四个微命令直接控制,d,i,j和e,f,h分别组成两个字段译码。这种混合编码的目的是在微指令字长和译码复杂度之间取平衡。
直接控制:每个微命令占1位,简单但字长大。 字段译码:n个微命令用log2(n)位编码,字长小但需要译码器。 混合:互斥的微命令放同一字段,兼容的用直接控制。
答案里的分组逻辑是:d,i,j互斥(同一时刻只出一个),e,f,h互斥,所以各用2位译码出3个信号。a,b,c,g可以同时有效,所以直接控制各占1位。总控制字段 = 2 + 2 + 4 = 8位,比全直接控制的11位省了3位。
提示:判断微命令是否互斥,看它们是否控制同一部件的不同操作。比如“寄存器A打入”和“寄存器A清零”互斥,“寄存器A打入”和“寄存器B打入”不互斥。
4.3 微操作序列的书写:取指周期与执行周期的区分
第五章第4题要求写出STA R1,(R2)的微操作序列。答案里区分了取指周期和执行周期。取指周期是公用的:PC→AR, M→DR, DR→IR, PC+1。执行周期则根据指令类型不同。
我一般会按数据通路来推:
- STA是存数指令,需要把R1的内容写到(R2)指向的存储单元。
- 执行周期:R2→AR(地址送地址寄存器),R1→DR(数据送数据寄存器),DR→M(写入存储器)。
- 如果题目给了具体的数据通路图,还要考虑是否有暂存器、总线冲突等问题。
答案里还出现了“R/=W”这样的控制信号,表示读/写。写微操作序列时,每个节拍内不能有冲突的操作,比如同一总线不能同时有两个源往里送数据。
5. 避坑与排查:这份答案用错姿势会翻车的五个场景
5.1 直接背答案不推过程,换数字就废
现象:第二章补码乘法题,答案里竖式一堆0和1,背下来后考试换成x=0.10101, y=-0.11010,完全不会算。 原因:阵列乘法的竖式是算法过程的展开,不是固定模板。符号位处理、部分积移位、求补时机,每个数不同。 解决:拿一张白纸,自己按“符号位单独算→绝对值乘法→根据符号决定是否求补”三步走一遍。算完用十进制验算,对上了再去看答案的竖式。
5.2 浮点数规格化范围搞混正负边界
现象:题目问“最接近0的正规格化数”,有人填了阶码全0、尾数全0。 原因:规格化数的尾数有约束——正数尾数最高位必须为1,负数尾数最高位必须为0。全0尾数不是规格化数。 解决:记住规格化尾数的真值范围:正数[0.5, 1),负数(-1, -0.5]。最接近0的正规格化数是阶码最小、尾数0.100…0;最接近0的负规格化数是阶码最小、尾数0.011…1(补码表示)。
5.3 DRAM刷新间隔算错,忘记留余量
现象:刷新周期2ms,128行,算出15.625us,直接填15.625us。 原因:刷新间隔必须保证刷新一遍的总时间不超过刷新周期。15.625×128 = 2000us = 2ms,刚好卡死,实际电路有误差就会丢数据。 解决:向下取整到15us或16us,确保总时间小于刷新周期。答案里取15us,总时间1.92ms,留了80us余量。
5.4 交叉存储器带宽计算漏掉第一个字的存取时间
现象:4模块交叉,存取周期100ns,算带宽时直接用100ns/4 = 25ns一个字。 原因:交叉存储器是流水线,第一个字仍需完整存取周期T,之后每个字间隔τ。总时间 = T + (m-1)τ,不是m×τ。 解决:画时间轴。第一个字在0~100ns,第二个字在50~150ns(如果τ=50ns),第三个字在100~200ns……第m个字在(m-1)τ ~ (m-1)τ+T。总时间 = (m-1)τ + T。
5.5 微指令字段分组把不互斥的信号放一起
现象:把“R1→DR”和“R2→DR”放同一字段译码,结果两个信号同时有效时数据冲突。 原因:字段译码的前提是同一字段内的微命令互斥。如果两个微命令可能同时需要,就不能放同一字段。 解决:列微命令表,标出哪些可能同时有效。互斥的放字段译码,兼容的直接控制。不确定时,宁可多占几位直接控制,也别硬塞字段译码。
6. 进阶用法:把习题答案变成自测题库与错题追踪表
这份答案最值钱的用法不是“看”,而是“遮住答案自己写,写完对照,错题归类”。我一般会建一个三列错题表:
| 题号 | 错误类型 | 纠正动作 |
|---|---|---|
| 2-3 | 浮点数规格化边界 | 重画尾数真值范围数轴 |
| 3-3 | DRAM刷新间隔取整 | 默写刷新间隔公式并取整 |
| 4-7 | 操作码扩展剩余位数 | 重算字段分配图 |
| 5-8 | 微命令互斥判断 | 列微命令同时有效性表 |
错误类型我分成四类:概念混淆(如原码和补码符号位处理)、计算失误(如移位次数错)、边界遗漏(如规格化范围端点)、编码冲突(如微指令字段分组)。每类对应不同的纠正动作。概念混淆就回去翻教材对应章节,计算失误就限时重算三道同类题,边界遗漏就专门整理边界值表,编码冲突就重画数据通路。
还有一个技巧:把答案里的二进制竖式转成Python验证。比如补码乘法,写个函数模拟阵列乘法过程,和答案对比。这样既练了编程,又加深了理解。
def twos_complement_multiply(x, y, bits=8): """模拟补码阵列乘法,返回补码结果""" # 符号位单独处理 sign = (x >> (bits-1)) ^ (y >> (bits-1)) # 取绝对值 abs_x = x if x >= 0 else (1 << bits) - x abs_y = y if y >= 0 else (1 << bits) - y # 绝对值乘法 product = abs_x * abs_y # 根据符号位决定是否求补 if sign: product = (1 << (2*bits)) - product return product & ((1 << (2*bits)) - 1) # 验证 -0.11111 × -0.11011 (定点小数,用整数模拟) # 实际使用时需按Q格式转换这段代码不是让你考试时写,而是帮你理解“符号位单独算→绝对值乘法→求补”这个流程。跑一遍,和答案里的竖式对照,比干看快得多。
从那以后我每次拿到习题答案,都强制自己先遮住答案做一遍,错题按四类归档,每周重做一次错题。这份《计算机组成原理(第三版)习题答案》我前后翻了五遍,第一遍对答案,第二遍推过程,第三遍归类错题,第四遍用代码验证,第五遍只看错题表。希望帮到你。
本文还有配套的精品资源,点击获取