简化模型中的每个寄存器都只有一项工作。好的答案按寄存器存放的东西来命名:一个地址、一份数据、当前指令、下一个地址,或一个运算结果。
这一课接续追踪指令周期,属于硬件与处理。接下来你会看到程序和文件存放在哪里。
每个寄存器存放什么?
| 寄存器 | 存放 | 何时改变 |
|---|---|---|
| PC(程序计数器) | 下一条指令的地址 | 每次 fetch 时加 1;跳转时被覆盖 |
| MAR(内存地址寄存器) | 正在读取或写入的位置的地址 | fetch 开始,或加载、存储指令运行时 |
| MDR(内存数据寄存器) | 刚读出或即将写入的数据或指令 | 内存被读取或写入时 |
| CIR(当前指令寄存器) | 正在解码和执行的指令 | fetch 结束时 |
| ACC(累加器) | 工作值以及算术或逻辑运算的结果 | 加载、算术或逻辑指令执行时 |
有两个部件与寄存器配合工作。ALU(算术逻辑单元)负责计算和比较。
控制单元负责解码指令并发出控制信号。寄存器与它们一起位于处理器内部。
三条总线(bus)在处理器和内存之间传送信号:地址总线(传地址)、数据总线(传数据和指令)和控制总线(传读或写等控制信号)。
例题详解
ACC 存着 20,地址 500 存着 9。CIR 中的指令是 ADD 500,下一条指令在地址 41。题目要求:为每一句话选出对应的寄存器。
- “内存被访问时,它存着 500。”这是地址,所以是 MAR。
- “内存被读取后,它存着 9。”这是数据,所以是 MDR。
- “decode 期间,它存着
ADD 500。”这是指令,所以是 CIR。 - “它存着 41。”下一条指令的地址属于 PC。(它在 fetch 时已经加过 1。)
- “指令完成后,它存着 29。”结果在 ACC,因为 20 + 9 = 29。
注意,每一项的答案都是靠问自己“这是什么类型的东西:地址、数据、指令还是结果?”来选出的。
要留意的错误
学生常说 MAR 存数据,因为 MAR“与内存相连”。
错误答案:“MAR 存着从地址 500 读出的值 9。”
这个值是数据,数据经过 MDR。MAR 存的是地址 500。
改正的办法是成对记忆:MAR 对应地址总线,MDR 对应数据总线。MAR 也不等于 PC。PC 存下一条指令的地址;MAR 存当前正在访问的任何地址,可能是指令,也可能是数据位置。
自我检测
1. 一条存储指令把 44 写入地址 310。写入之前,哪个寄存器存 310,哪个存 44?
查看答案
MAR 存 310(地址)。MDR 存 44(要写入的数据)。
2. 一次 fetch 之后,PC 是 77。假设每次 fetch 使 PC 加 1,取出的是哪个地址?
查看答案
fetch 之前 PC 是 76,所以指令来自地址 76。fetch 期间 MAR 存着 76。
3. 判断对错:累加器存放正在执行的指令。请说明理由。
查看答案
**错。**指令存放在 CIR。累加器存放正在计算的值和结果。
下一步
做硬件与处理练习题时,可以把上面的表格当作检查清单。受限伪代码追踪训练器很适合观察寄存器依次变化。
说对寄存器是一项小技能,但许多硬件分数就在这里得失。我们的老师在线上一对一计算机科学补习中,可以用新情境反复练习,直到你不再犹豫。