第一次呼吸
复习
- CPU 能自动取指、译码和执行
- 总线把 CPU、存储器和 I/O 接口连在一起
- 中断让外部事件暂时改变程序的去向
TL;DR
- 一段程序进入存储器后,机器可以沿时钟自行运行
- 每一个大部件都来自前面造过的小部件
- 从逻辑门到整机的主线在这里闭合
正文
零件的时代结束了。运算器、存储器、控制器、总线和外设都已经就位。现在,我们只做一件事:让它们一起工作。
放进第一段程序
地址 20 保存 3,地址 21 保存 5。我们再约定地址 240 不属于普通存储器,而是四盏 LED 的 I/O 接口。向它写入,就等于改变灯的亮灭。程序要把两个数相加,把结果写到地址 22,再送到 LED:
| 地址 | 内容 |
|---|---|
| 0 | LOAD A, [20] |
| 1 | LOAD B, [21] |
| 2 | ADD R, A, B |
| 3 | STORE [22], R |
| 4 | STORE [240], R |
| 20 | 数据 3 |
| 21 | 数据 5 |
| 22 | 数据 0 |
把 PC 清成 0,打开时钟。
看它自己走
控制器按 PC 从地址 0 取指,译出 LOAD,再从地址 20 取回 3,写入 A。随后 PC 指向 1,同样把 5 写入 B。
取到地址 2 的 ADD 后,控制器让 A、B 进入 ALU,并在结果稳定后把 8 写入 R。地址 3 的 STORE 又把 8 写进存储器 22。
最后一条 STORE 把地址 240 放上总线。地址译码电路发现它属于 I/O 接口,于是 R 中的低 4 位没有写进普通存储器,而是送到了四盏灯。灯显示:
1000
这是二进制的 8。
整个过程不需要人重接线路,也不需要人抄写中间结果。人只提供程序与最初的数据,机器便沿着时钟一步步完成了它。
每块积木都能找到来处
逻辑门 → 加法器 → ALU → 运算器
反馈 → 锁存器 → 触发器 → 寄存器 → 存储器
指令 → PC → 控制器 → CPU
总线 → I/O → 中断
计算机不是突然出现的黑盒。每当旧机器遇到一个做不到的动作,我们就加上一小块;三十多章以后,这些小块终于彼此咬合。
它现在只会做很少的事,却已经具备通用计算机最关键的样子:程序和数据都存放在存储器里,CPU 可以读取指令并改变自己接下来的行为。
再往后,问题不再只是“机器由什么组成”,而是“人怎样更轻松地让它做事”。汇编语言、编译器和操作系统,会从这里接过下一段路。
思考题
程序与数据都只是存储器中的比特。CPU 为什么不会把地址 20 的数字 3 当成指令执行?在什么情况下它又可能真的这样做?
小结
知识点
- 一段程序从取指到输出的完整路线
- 运算、存储、控制与输入输出的协作
- 存储程序是通用计算机的关键
思考题答案(仅供参考)
正常情况下,PC 只指向程序所在的地址,地址 20 只会被 LOAD 当作数据读取。如果跳转地址写错、PC 被破坏或程序故意跳到数据区,CPU 仍会尝试把那里的比特当指令译码,因为比特本身并不标注“我是数据”。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪