01改变世界:计算机原理趣谈
上QQ阅读APP看书,第一时间看更新

1.1.2 万能的指令

CPU是计算机的“指挥中心”,计算机的每一个“动作”都服从“指挥中心”的安排。不过CPU没有自主意识,它的工作其实非常机械、简单,无非是不知疲倦地循环获取、理解和执行指令(Instruction)。这些指令来自内存,但内存当然不是CPU的“上司”,它更像一份备忘录或日程表,上面记录着一条条需要执行的指令(也就是人们常说的程序)。内存中的指令加载自外存,而外存中的指令是通过I/O模块事先输入进去的(编程),其源头最终指向计算机的使用者——人类。人才是CPU真正的“上司”,如图1.1所示。

图1.1 CPU指令溯源

人们把某个CPU支持的所有指令的合集称为指令集(Instruction Set),数据类型、寄存器数量和种类、内存管理方式等计算机的核心设计都围绕指令集展开,这些内容搭建了计算机的整体框架,统称为指令集架构(Instruction Set Architecture,ISA),简称架构。人们谈论CPU时常说的x86、ARM就是指不同的CPU架构。

以公司职员为例,假设某位职员具备数据整理、统计分析、邮件收发、总结汇报等基本技能。老板可能会对他下达这样的任务:汇总本周的经营数据,整理成表后与上周情况进行对比;将分析结果群发给各部门经理,收齐他们的反馈意见,形成周报后发给老板。

这项任务可以拆分成如表1.1所示的一系列指令,每条指令都是对职员技能的调用。如果将这4项技能用计算机的语言编号(00数据整理、01统计分析、10邮件收发、11总结汇报),那么整个任务的指令代码(简称指令码)序列就是00 01 10 10 11 10。

表1.1 公司职员的任务分解

不过,单单标识技能项的指令是不完整的,职员还需要知道该对谁、对什么事物施展这些技能。不妨把表中的施展对象也一一编号:000本周数据、001汇总表、010上周数据、011分析结果、100各部门经理、101反馈意见、110周报、111老板。那么这项任务的完整指令码序列就有了,具体如下:

00 000 001
01 010 011
10 011 100
10 101
11 011 101 110
10 110 111

如果读者对《01改变世界:计算机发展史趣谈》中讲解的穿孔纸带上的程序还有印象,那一定对上述指令格式并不陌生。指令码中,标识技能的部分称为操作码(Operation Code),标识作用对象的部分称为地址码(Address Code)。单条指令中,操作码有且仅有一个,但地址码可以没有或多个。

地址码可以是待处理的操作数(Operand)[1]本身,但更多情况下,它标识着操作数的地址,操作数存在于内存,或者CPU中一种名为寄存器(Register)的容器中。内存被人为划分成一块块小区域,相当于一个个小抽屉,每个“抽屉”都有自己独有的编号,即内存地址。每个寄存器也有自己独有的编号,即寄存器地址。


[1] 也称运算数,指处理或运算的对象。引入这一概念,是因为“数据”过于宽泛,操作数、地址、指令等都是数据。

一个内存“抽屉”或一个寄存器可以存储一个操作数或一条指令(包括操作码和地址码),在冯•诺依曼体系结构中指令也是一种数据。

仔细琢磨,寄存器其实古已有之,算盘中的档、机械计算器中的齿轮、机电计算器中的继电器,都发挥着临时存储的作用,只不过它们还肩负着运算的使命,那时的运算器和寄存器尚未严格分离。