Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

第一次呼吸

复习

  • CPU 能自动取指、译码和执行
  • 总线把 CPU、存储器和 I/O 接口连在一起
  • 中断让外部事件暂时改变程序的去向

TL;DR

  • 一段程序进入存储器后,机器可以沿时钟自行运行
  • 每一个大部件都来自前面造过的小部件
  • 从逻辑门到整机的主线在这里闭合

正文

  零件的时代结束了。运算器、存储器、控制器、总线和外设都已经就位。现在,我们只做一件事:让它们一起工作。

放进第一段程序

  地址 20 保存 3,地址 21 保存 5。我们再约定地址 240 不属于普通存储器,而是四盏 LED 的 I/O 接口。向它写入,就等于改变灯的亮灭。程序要把两个数相加,把结果写到地址 22,再送到 LED:

地址内容
0LOAD A, [20]
1LOAD B, [21]
2ADD R, A, B
3STORE [22], R
4STORE [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 国际许可协议进行许可。

封面图

设计师 | 南国微雪