4. 处理器基础:计算机的“大脑”

各位未来的计算机科学家,大家好!本章至关重要,因为我们将深入探索计算机的“大脑”:中央处理器 (CPU)。理解 CPU 的工作原理是计算机科学的基础。我们将探讨它的内部架构、如何执行指令,以及如何使用最底层的编程语言——汇编语言来与它“对话”。

别担心“寄存器”或“总线”这些听起来像复杂机械结构的术语——我们会用简单、现实生活中的类比来拆解它们。学完本章后,你将彻底明白计算机是如何处理你发出的每一条指令的!

4.1 中央处理器 (CPU) 架构

冯·诺依曼架构与存储程序概念

几乎所有现代计算机都基于冯·诺依曼架构 (Von Neumann Architecture)。这一由约翰·冯·诺依曼提出的概念,定义了计算机系统的结构。

其核心理念是存储程序概念 (Stored Program Concept)

  • 程序指令和程序所使用的数据都存放在同一个存储单元(主存或 RAM)中。
  • 这使得 CPU 能够通过相同的路径(总线)从内存中获取指令和数据。

类比:想象一位厨师(CPU),他把菜谱(指令)和食材(数据)都放在同一个储藏室(内存)里。无论是拿下一步的菜谱还是拿下一个食材,他都要去同一趟储藏室。

CPU 与系统的关键组件

CPU 及其周边环境由几个关键的交互组件组成:

  1. 算术逻辑单元 (ALU): 这是 CPU 的“计算器”。它执行所有的算术运算(如加、减、乘、除)和逻辑运算(如 AND、OR、NOT、比较)。
  2. 控制单元 (CU): 这是“经理”或“交通警察”。它协调 CPU 的所有活动,并指挥 CPU 与其他设备之间的数据流。它负责解码指令并生成控制信号。
  3. 即时访问存储器 (IAS): 这是计算机主存 (RAM) 的别称。它存放着处理器当前正在使用的指令和数据。
  4. 系统时钟: 生成定时信号(脉冲),同步 CPU 的所有操作。时钟速度决定了 CPU 每秒能执行多少个周期。

寄存器(CPU 的草稿纸)

寄存器 (Registers) 是 CPU 内部极小、超高速的存储位置。它们用于保存 CPU 即刻需要的数据。

寄存器分为两类:

  1. 通用寄存器: 用于在算术或逻辑运算过程中临时存储数据(在本大纲中,我们通常只考虑累加器这一种通用寄存器)。
  2. 专用寄存器: 每个寄存器在取指-执行周期中都有特定的、明确的角色。

以下是你必须掌握的关键专用寄存器

  • 程序计数器 (PC): 存储下一条要获取的指令的内存地址。(它字面上指向下一步操作。)
  • 内存地址寄存器 (MAR): 存储当前正在读取写入的内存位置地址。
  • 内存数据寄存器 (MDR): 存储刚从内存中获取,或即将写入内存的数据或指令
  • 累加器 (ACC): 存储 ALU 计算后的中间结果。
  • 当前指令寄存器 (CIR): 存储当前正在解码和执行的指令。
  • 变址寄存器 (IX): 用于变址寻址,修改地址,常用于处理列表或数组。
  • 状态寄存器: 存储位(标志位),指示 CPU 的当前状态,例如是否发生了溢出,或上一次计算结果是否为零。

记忆小窍门: MAR 对应地址 (Address),MDR 对应数据 (Data)。它们协同工作以访问内存。

快速回顾:寄存器职能

如果你需要知道内存中“哪里”要去,就使用 MAR。如果你需要保存刚取出来的具体“东西”,就使用 MDRACC

系统总线(数据高速公路)

总线是连接计算机系统组件的一组平行线,用于实现数据传输。主要有三种类型:

  1. 地址总线: 携带被访问的内存位置或外围设备的地址。
    • 方向: 单向(CPU 输出地址)。
    • 影响: 宽度(线路数量)决定了系统能够寻址的最大内存容量。
  2. 数据总线: 在组件之间传输数据或指令。
    • 方向: 双向(数据双向流动)。
    • 影响: 宽度决定了可以同时传输多少位数据。(总线越宽,数据传输越快)。
  3. 控制总线: 携带控制信号(如读、写、时钟同步),负责管理数据流的时序和方向。
    • 方向: 单向和双向(信号在两个方向上传输)。

类比:想象铁路系统。地址总线是轨道(单向,决定位置)。数据总线是火车车厢(运送货物)。控制总线是信号箱,管理哪列火车去往何处。

取指-执行周期 (F-E Cycle)

这是 CPU 为执行程序指令而持续进行的过程。它有三个主要阶段:取指、解码、执行。

周期步骤(使用寄存器传输符号 RTN)

1. 取指阶段 (Fetch): 从内存获取下一条指令。

  • MAR ← [PC]:将下一条指令的地址从程序计数器 (PC) 复制到内存地址寄存器 (MAR)。
  • PC ← [PC] + 1:将 PC 增加 1,指向随后的指令(为下一个周期做准备)。
  • MDR ← [MAR]:从 MAR 中的地址获取存储的指令,并加载到内存数据寄存器 (MDR)。
  • CIR ← [MDR]:将指令从 MDR 复制到当前指令寄存器 (CIR)。

2. 解码阶段 (Decode): 控制单元 (CU) 解释存储在 CIR 中的指令。

  • CU 确定指令的含义(如 ADD、JUMP、LOAD)。
  • 准备执行所需的任何数据,有时需要从内存中获取操作数。

3. 执行阶段 (Execute): 执行指令。

  • 如果是算术或逻辑指令,ALU 执行运算(如将值加到 ACC 中)。
  • 如果是跳转/分支指令,PC 可能会被更新为新地址。
  • 向其他组件发送控制信号。

关键总结: F-E 周期是一个无限循环。它每秒运行数百万次,移动地址、获取指令并执行计算。

影响 CPU 性能的因素

计算机系统的速度和效率受若干硬件因素影响:

  • 处理器类型和内核数量: 更多内核允许 CPU 同时执行多个 F-E 周期(并行处理)。
  • 时钟速度: 以吉赫兹 (GHz) 为单位。时钟速度越快,意味着每秒能执行的取指-执行周期越多。
  • 总线宽度: 更宽的数据总线允许更多位并行传输(例如,64 位总线比 32 位总线传输数据更快)。
  • 高速缓存 (Cache): 位于 CPU 芯片上或附近的极速小容量存储器 (SRAM)。它存储频繁使用的指令和数据,访问速度远快于访问主内存。缓存越大,通常性能越好。

外设连接(接口)

使用不同的接口将外设连接到计算机:

  • 通用串行总线 (USB): 连接各种外设(键盘、鼠标、闪存驱动器)的多功能标准。它使用串行数据传输。
  • 高清多媒体接口 (HDMI): 主要用于传输高质量数字视频和音频信号(例如,将 PC 连接到显示器或电视)。
  • 视频图形阵列 (VGA): 用于连接模拟显示器的较老标准。它只传输视频信号,不传输音频。

中断(处理紧急事件)

中断 (Interrupt) 是从设备或软件发送给 CPU 的信号,导致 CPU 暂停当前任务以处理紧迫事件。

  • 目的: 确保关键任务(如按键或磁盘读取完成)得到及时处理,避免 CPU 浪费时间不断检查(轮询)设备。
  • 可能原因: 硬件故障(如断电)、I/O 完成(打印机工作结束)、计时器到期、非法指令(除以零)。
  • 检测: CPU 在每个取指-执行周期结束时检查中断。
  • 处理过程:
    1. CPU 检测到中断信号。
    2. 所有寄存器的内容(特别是 PC)被保存到一个特殊位置(堆栈),以便 CPU 稍后能回到之前的任务。
    3. PC 被加载对应中断服务程序 (ISR) 的起始地址。
    4. 执行 ISR(处理紧急请求的程序)。
    5. ISR 完成后,从堆栈中恢复寄存器的原始内容,CPU 从中断点恢复执行原来的任务。
重点总结:4.1 概要

冯·诺依曼架构定义了存储程序概念。CPU 使用专用寄存器(PC, MAR, MDR, CIR, ACC)执行 F-E 周期。总线传输数据和地址,中断允许 CPU 高效管理紧迫的外部请求。

4.2 汇编语言

汇编语言与机器码的关系

机器码 (Machine Code) 是编程的最底层——它是 CPU 直接执行的原始二进制指令(1 和 0)。它非常繁琐,人类几乎无法阅读或编写。

汇编语言 (Assembly Language) 是一种低级编程语言,使用助记符(如 ADD, JMP, LDM 等简短易记的缩写)来代表机器码指令。

  • 核心关系: 汇编语言与机器码之间存在一一对应关系。一条汇编指令直接翻译成一条机器码指令。
  • 汇编器 (Assembler): 一种名为汇编器的软件,负责将汇编代码翻译成可执行的机器码。

两遍汇编器 (Two-Pass Assembler)

由于汇编程序通常使用标号(如 LOOP 或 START 等内存地址的符号名称),汇编器需要通过两遍扫描来完整翻译代码。

第一遍:构建符号表

  1. 汇编器逐行读取源代码。
  2. 识别程序中使用的所有标号
  3. 计算每个标号定义的内存地址。
  4. 创建一个符号表 (Symbol Table),将每个标号映射到其对应的地址。
  5. *关键点:此阶段尚未生成任何机器码。*

第二遍:翻译

  1. 汇编器第二次读取源代码。
  2. 将每条助记符指令翻译成等效的二进制机器码。
  3. 当遇到用作操作数的标号(例如 JMP START)时,在符号表(第一遍创建的)中查找其实际内存地址,并将该地址插入机器码指令中。
  4. 生成最终的可执行机器码程序。

为什么需要两遍?如果程序靠前的指令(第一遍)引用了程序靠后定义的标号(第二遍),汇编器必须依靠符号表才能知道那个靠后的地址。

指令分组

汇编语言指令通常按功能分组:

  • 数据移动: 在寄存器和内存之间移动数据(如 LDM, STO, MOV)。
  • 输入输出 (I/O): 处理 CPU 与外设之间的数据传输(如 IN, OUT)。
  • 算术运算: 数学计算(如 ADD, SUB, INC, DEC)。
  • 无条件指令: 总是改变执行流程的指令(如 JMP – 跳转)。
  • 条件指令: 仅在状态寄存器中的条件满足时才改变流程的指令,通常跟随 COMPARE 指令(如 JPE - 若为真则跳转, JPN - 若为假则跳转)。
  • 比较指令: 根据比较结果设置状态寄存器中的标志位(如 CMP – 比较 ACC 内容)。

寻址模式

寻址模式定义了指令的操作数部分如何指向所需的数据。这对于编写高效的汇编代码至关重要。

我们参考大纲中提供的指令集表(请参阅大纲摘录第 21 页)。

  1. 立即寻址 (Opcode #n):
    • 操作数本身就是需要使用的实际数据
    • 示例:LDM #10(将数字 10 加载到累加器中)。
    • 优点:速度最快,因为不需要访问内存获取数据。
  2. 直接寻址 (Opcode
    ):
    • 操作数是数据存储的内存地址
    • 示例:LDD 500(将内存位置 500 的内容加载到 ACC 中)。
    • 优点:访问固定内存位置的简单方法。
  3. 间接寻址 (Opcode I
    ):
    • 操作数是一个地址,该地址中存放着另一个地址。CPU 从第一个位置读取地址,然后使用第二个地址获取实际数据。
    • 示例:LDI 500(前往位置 500,读取存放在那里的地址,假设是 800,然后将位置 800 的内容加载到 ACC 中)。
    • 优点:对于指针或需要动态更改数据指向位置时非常有用。
  4. 变址寻址 (Opcode X
    ):
    • 有效地址是通过将操作数中的地址与变址寄存器 (IX) 的内容相加计算得出的。
    • 示例:LDX 500(有效地址 = 500 + [IX])。
    • 优点:通过简单递增变址寄存器,实现对数组或列表元素的顺序访问,至关重要。
  5. 相对寻址:
    • 主要用于跳转/分支指令。跳转的地址是相对于程序计数器 (PC) 当前值的偏移量。
    • 优点:使跳转指令具有可重定位性(如果程序在内存中移动,跳转指令仍能相对于当前位置正确工作)。
重点总结:4.2 概要

汇编语言使用助记符表示机器码。两遍汇编器通过先建立符号表,再进行翻译来处理标号。寻址模式定义了指令寻找数据的方式,从立即寻址(数据直接在指令中)到变址寻址(数据位置通过计算得出)。

4.3 位操作

位操作是指使用逻辑运算或移位来改变寄存器或内存位置中的单个比特。这对于底层编程中设置标志位、缩放数值和控制设备至关重要。

二进制移位

二进制移位将寄存器(如 ACC)中的所有位向左或向右移动指定的位数 (n)。

1. 逻辑移位 (LSL 和 LSR)
  • 逻辑左移 (LSL #n): 将位向左移动 'n' 位。右端补 0。
    • 效果:将数值乘以 \(2^n\)。
  • 逻辑右移 (LSR #n): 将位向右移动 'n' 位。左端补 0。
    • 效果:将数值除以 \(2^n\)。
2. 算术移位

这些移位是为有符号数(补码)设计的。

  • 算术左移: 与逻辑左移相同。
  • 算术右移: 将位向右移动,但左侧的第一位(符号位)会被保留/复制,以维持数值原始的正负号。如果数字是负数(符号位为 1),左侧不会自动补 0。

常见错误:逻辑移位只能用于无符号数,因为它们不保留符号位。

3. 循环移位 (旋转移位)

从寄存器一端移出的位被插入到另一端。没有位会丢失,也不会补充 0。

示例:如果 10110010 循环左移 1 位,它变为 01100101

用于监测和控制的位操作(位掩码)

位操作,通常称为位掩码 (Bit Masking),用于直接与硬件控制寄存器交互。通过使用“掩码”(特定的二进制模式)配合逻辑运算符(AND, OR, XOR),我们可以隔离、设置或清除特定的位。

1. 设置位 (使用 OR)

为确保特定位为 1(设置),我们对该位使用位与 OR 运算,掩码中只有目标位置为 1。

OR 规则:X OR 1 = 1 以及 X OR 0 = X

示例:设置 ACC 的第 3 位(从右起,位位置 2)(01010000):

ACC:0101 0000
掩码:0000 0100
OR 结果:0101 0100 (第 3 位现已确保为 1。)

2. 清除位 (使用 AND)

为确保特定位为 0(清除),我们对该位使用位与 AND 运算,掩码中只有目标位置为 0(其他位置均为 1)。

AND 规则:X AND 0 = 0 以及 X AND 1 = X

示例:清除 ACC 的第 8 位(从右起,位位置 7)(11011100):

ACC:1101 1100
掩码:0111 1111 (我们使用想要清除位的反转形式)
AND 结果:0101 1100 (第 8 位现已确保为 0。)

3. 测试/检查位 (使用 AND)

要查看某位当前是否被设置(1),我们使用位与 AND 运算,掩码中只有被测试的位为 1。

如果结果为零,说明该位为 0。如果结果不为零,说明该位为 1。

示例:测试 ACC 的第 5 位(位置 4)(10100000):

ACC:1010 0000
掩码:0001 0000
AND 结果:0000 0000 (第 5 位为 0。)

重点总结:4.3 概要

二进制移位执行快速乘除法。位掩码使用 AND 来清除位,OR 来设置位,通常使用 AND 来测试硬件寄存器中特定位的状态。

祝贺你!你已经掌握了处理器核心运作的基本原理。这些知识构成了理解所有软件如何与硬件交互的基石。继续练习 F-E 周期步骤和各种寻址模式——它们是考试中的核心重点!