这套练习涵盖整个硬件与处理模块:指令周期、寄存器、内存与存储、输入与输出的选择,以及让说法停留在模型之内。题目由易到难。
每题先在纸上自己做。只有在写完自己的追踪之后,才用受限伪代码追踪训练器或安全的 Python 推理沙盒来核对。
题目
第 1 题(容易)
说明程序计数器(PC)存放什么,以及在简化周期中它的值何时改变。
查看答案
PC 存放下一条要取出的指令的地址。每次 fetch 时它加 1。跳转指令在 execute 阶段用新地址覆盖它。
第 2 题(容易)
为每个描述写出寄存器名称:(a) 存放正在读取的地址,(b) 存放正在解码的指令,(c) 存放加法的结果。
查看答案
(a) MAR。 (b) CIR。 (c) ACC。
第 3 题(容易)
RAM、ROM 和辅助存储中,哪一个 (a) 断电后丢失内容,(b) 存放启动指令,(c) 保存已保存的作业文件?
查看答案
(a) RAM,因为它是易失性的。 (b) ROM,它是非易失性的。 (c) 辅助存储,它没有电力也保存文件。
第 4 题(中等)
为下面的程序完成追踪表。LDA 90 加载地址 90 的值,SUB 91 从 ACC 中减去地址 91 的值,STO 92 存储 ACC,END 停止。PC 从 50 开始。
| 地址 | 内容 |
|---|---|
| 50 | LDA 90 |
| 51 | SUB 91 |
| 52 | STO 92 |
| 53 | END |
| 90 | 15 |
| 91 | 6 |
| 92 | 0 |
查看答案
| 步骤 | PC | MAR | MDR | CIR | ACC |
|---|---|---|---|---|---|
| 开始 | 50 | - | - | - | - |
| Fetch 1 | 51 | 50 | LDA 90 | LDA 90 | - |
| Execute 1 | 51 | 90 | 15 | LDA 90 | 15 |
| Fetch 2 | 52 | 51 | SUB 91 | SUB 91 | 15 |
| Execute 2 | 52 | 91 | 6 | SUB 91 | 9 |
| Fetch 3 | 53 | 52 | STO 92 | STO 92 | 9 |
| Execute 3 | 53 | 92 | 9 | STO 92 | 9 |
核对:15 − 6 = 9。地址 92 现在存着 9。
第 5 题(中等)
一台笔记本有 4 GB RAM。
同时打开三个程序,分别需要 1.2 GB、2.5 GB 和 0.8 GB。(a) 一共需要多少 RAM?
(b) 会发生什么?为什么这很重要?
查看答案
(a) 1.2 + 2.5 + 0.8 = 4.5 GB。
(b) 这比 4 GB RAM 多出 0.5 GB。电脑会把一部分辅助存储用作虚拟内存,在两者之间交换数据。这比 RAM 慢,所以电脑会变慢。
第 6 题(中等)
一名学生用手机拍下作业,在笔记本上编辑并保存。说明文件 (a) 在编辑时和 (b) 笔记本关机后分别在哪里。
查看答案
(a) 打开的文件被载入 RAM,让处理器能快速处理。 (b) 保存的文件留在辅助存储中。断电时 RAM 会丢失它。
第 7 题(中等)
图书馆让会员通过扫描会员卡和书本来借书。选择一个输入设备和一个输出设备,并各用一句话说明理由。
查看答案
输入:条形码扫描器,因为会员卡和书本各有条码,扫描能快速记录,没有打字错误。
输出:收据打印机(或屏幕信息),确认借书和归还日期,让会员有借了什么的凭证。
第 8 题(较难)
追踪下面的程序,并写出地址 32 最终的值。JMP 13 把 PC 设为 13。PC 从 10 开始。
| 地址 | 内容 |
|---|---|
| 10 | LDA 30 |
| 11 | JMP 13 |
| 12 | ADD 31 |
| 13 | STO 32 |
| 14 | END |
| 30 | 4 |
| 31 | 100 |
| 32 | 0 |
查看答案
| 步骤 | PC | MAR | MDR | CIR | ACC |
|---|---|---|---|---|---|
| 开始 | 10 | - | - | - | - |
| Fetch 1 | 11 | 10 | LDA 30 | LDA 30 | - |
| Execute 1 | 11 | 30 | 4 | LDA 30 | 4 |
| Fetch 2 | 12 | 11 | JMP 13 | JMP 13 | 4 |
| Execute 2 | 13 | 11 | JMP 13 | JMP 13 | 4 |
| Fetch 3 | 14 | 13 | STO 32 | STO 32 | 4 |
| Execute 3 | 14 | 32 | 4 | STO 32 | 4 |
| Fetch 4 | 15 | 14 | END | END | 4 |
跳转覆盖了 PC(12 变成 13),所以地址 12 的 ADD 31 从未运行。地址 32 存的是 4,不是 104。
第 9 题(较难)
一名学生写道:“这部手机有 8 核 2.8 GHz 的处理器,所以它以 22.4 GHz 运行,一定比 3.0 GHz 的笔记本快。”指出两个错误并重写这个说法。
查看答案
错误 1:核心不会把时钟频率相加。8 × 2.8 = 22.4 不是有效的速度。时钟频率是 2.8 GHz,即每秒 28 亿个周期。
错误 2:“一定更快”没有依据。速度还取决于核心数、缓存,以及软件能否利用这些核心。
重写:“手机的处理器以 2.8 GHz 运行,有 8 个核心。笔记本的时钟频率更高(3.0 GHz),但核心数和任务类型也会影响性能,所以所给数据无法说明哪个更快。”
第 10 题(较难)
预测下面这段 Python 程序的完整输出,它使用与各课相同的模型。
memory = {50: "LDA 90", 51: "ADD 91", 52: "STO 92", 53: "END",
90: 15, 91: 6, 92: 0}
pc = 50
acc = 0
while True:
mar = pc
pc = pc + 1
mdr = memory[mar]
cir = mdr
parts = cir.split()
op = parts[0]
if op == "END":
break
addr = int(parts[1])
if op == "LDA":
acc = memory[addr]
elif op == "ADD":
acc = acc + memory[addr]
elif op == "STO":
memory[addr] = acc
print(cir, "ACC =", acc, "PC =", pc)
print(memory[92])
查看答案
循环在每条指令之后打印,END 除外:
LDA 90 ACC = 15 PC = 51
ADD 91 ACC = 21 PC = 52
STO 92 ACC = 21 PC = 53
21
核对:15 + 6 = 21。PC 在 fetch 时已经加过 1,所以打印 51、52 和 53。最后一行打印地址 92 的值,即 21。取出 END 时循环停止,它没有任何打印。
如果你做错了
| 出了什么问题 | 回头复习 |
|---|---|
| PC 的值差一,或混淆了 PC 和 MAR(第 1、4、8、10 题) | 追踪简化的指令周期 |
| 寄存器名称写错(第 2、4 题) | 把寄存器与其作用对应起来 |
| 混淆 RAM、ROM 或存储,或漏掉虚拟内存(第 3、5、6 题) | 用具体任务比较内存与存储 |
| 写了设备名称,却没有来自任务的理由(第 7 题) | 解释输入与输出设备的选择 |
| 加入了题目没有给出的说法(第 9 题) | 不要从通用模型推断品牌规格 |
把每个反复出现的失误记在错题记录与重测队列里,几天后再做一道关于该技能的新题。
如果某种模式一再出现,我们的老师在线上一对一计算机科学补习中可以和你一起追踪,找出它从哪里开始。回到模块总览查看学习顺序。