Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

运算器总装

复习

  1. 第十三章:掌握了补码,把减法变成了加法
  2. 第十四~十六章:做出了减法器、乘法器、除法器
  3. 第十八、十九章:把它们装进了 ALU,还配上了状态标志

TL;DR

  • 这一章不学新东西,只把前面造好的零件拼成一个“运算器“
  • 我们会看到:从几个晶体管,到一台能算加减乘除的机器
  • 它算得很快,但它很“健忘“——这正好引出下一段路

正文

  连续造了十几章的零件,是时候停下来,抬头看看我们手里到底有什么了。

  这一章不引入任何新符号、新部件。我们只做一件事:把散落的零件,组装成一个完整的“运算器“。

先清点零件

  从最底层往上数,我们走过的路是这样的:

 transistor(晶体管)
   │  与、或、非
   ▼
 逻辑门 ──▶ 异或门、多路选择器
   │
   ▼
 半加器 ──▶ 全加器 ──▶ 多位加法器
   │
   ▼
 补码 ──▶ 减法器 ──▶ 乘法器 ──▶ 除法器
   │
   ▼
 算术逻辑单元(ALU)+ 状态标志

  每一层都建立在下层之上,又向下层隐藏细节。这个过程,正是全书的主题——抽象

把它们拼起来

  现在把这些零件接到一起。一个最简单的运算器,需要这些东西:

  • ALU:负责算,加、减、乘、除、与、或、非都在里面
  • 操作码输入:告诉 ALU“这一步算什么“
  • 数据输入:参与运算的两个数
  • 结果输出:算出来的数
  • 状态标志输出:零、符号、进位、溢出

  接好的样子:

   操作码 ──┐
            ▼
   数据 A ──▶[ 算术逻辑单元 ALU ]──▶ 结果
   数据 B ──▶        │
                     ▼
                 状态标志

  对,就一个方框。但请记住,这个方框里面,是这十几章的全部内容。

让它算一道题

  来试一个多步的式子:

(3 + 5) × 2 = ?

  ALU 不会一次算完,要一步步来:

  1. 操作码设为“加法“,数据 A 送 3、数据 B 送 5 → 输出 8
  2. 把 8 记下来(怎么记?先按下不表)
  3. 操作码设为“乘法“,数据 A 送 8、数据 B 送 2 → 输出 16

  结果是 16,正确。

然后,问题来了

  停在这个例子的第 2 步想一想:那个“8“,我们把它放哪儿了?

  我们造的 ALU,只能在某个瞬间输出一个结果。它没有“记忆“,运算一结束,结果就像沙子从指缝里流走了。要想继续下一步,我们只得用手把 8 抄下来,再重新输进去。

  这显然不行。一个只会算、不会记的机器,连“先加后乘“这么简单的两步都做不了。

  所以,运算器虽然装好了,我们却卡在了一个新问题上:

算出来的东西,往哪里放?

  这,就是下一段路要解决的事——记忆

  从这里开始,我们的机器要长出“记性“了。

思考题

  如果只有 ALU,没有记忆,能不能算 1 + 2 + 3?你打算怎么用“手动抄写“的方式实现它?这样做在数字很大的时候会有什么麻烦?

小结

知识点

  • 从晶体管到 ALU 的完整层级
  • 运算器的组成:ALU + 操作码 + 数据输入 + 结果/标志输出
  • 运算器的局限:能算不能记

参考资料

  1. Wikipedia(zh):运算器:运算器的基本概念
  2. Wikipedia(zh):算术逻辑单元:ALU 的详细介绍

思考题答案(仅供参考)

  能,但全靠手动:先算 1+2=3,把 3 抄在纸上;再把 3 和 3 送进 ALU 算得 6。数一多(比如加到 1000),就要抄 999 次,既慢又容易错。这正是“记忆“存在的意义——把中间结果交给机器保管,人只负责下指令。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪