Appearance
CPU 的功能和基本结构
2026 大纲 五(一)CPU 的功能和基本结构。
CPU 里有哪些部件,是推出来的不是列出来的
打开任何一本教材,CPU 那一章都会先给你一张部件清单:PC、IR、MAR、MDR、ALU、CU、PSW……十来个缩写,看着就想背。但这张清单其实一条都不用背——每个部件都是某项功能的必要条件,从"CPU 要干什么"出发,一个一个都能推出来。
CPU 的功能有五项:指令控制(决定下一条执行哪条)、操作控制(产生每条指令所需的控制命令)、时间控制(控制这些命令何时发出、持续多久)、数据加工(算术与逻辑运算)、中断处理(响应异常与外部请求)。前三项都属于控制器,教材把控制器的功能进一步压成三个动作:取指令、分析指令、执行指令。
下一节就用这三个动作把部件一个个推出来。整章真正需要单独记的只有一处例外:
🔴 MAR 与 MDR 不是从"指令怎么执行"推出来的,而是从"CPU 怎么跟主存打交道"推出来的。 总线上的地址与数据必须稳定保持到访存结束,而 CPU 内部的寄存器随时可能被改写,所以需要一对专用的锁存寄存器。两者都在 CPU 内部,所有访存都经过它们(早期教材把它们画在主存一侧只是逻辑示意)。
本篇后面三节分别处理三类最常被考的判断:谁的位数等于什么、谁对程序员可见、谁属于数据通路。这三类题的共同特点是四个选项长得都像对的,靠感觉选必错,得有判据。
一、部件是怎么推出来的
CPU 的结构不必死记。从这三个动作出发,每个部件都是某项功能的必要条件:
| 要做什么 | 因此必须有 | 部件 |
|---|---|---|
| 自动取指令 | 一个专门存放当前指令地址的寄存器 | PC |
| 分析指令 | 一个存放当前指令的寄存器,和一个对操作码译码的部件 | IR + 指令译码器 |
| 执行指令 | 一个能发出各种操作命令序列的部件 | CU |
| 算术逻辑运算 | 存放操作数的寄存器,和实现运算的部件 | 通用寄存器 + ALU |
| 处理异常和特殊请求 | 一套检测与响应机制 | 中断系统 |
MAR 与 MDR 不在这张表里,理由已在开篇说过——它们由访存需求推出,不由指令执行流程推出。

(唐朔飞《计算机组成原理》第 3 版,见文末教材出处)
图中间那条竖线是 CPU 内部数据总线——本章后面所有微操作都在这条总线上发生。
二、各寄存器的功能
| 部件 | 名称 | 功能 |
|---|---|---|
| ALU | 算术逻辑单元 | 执行加减法、与或非等操作 |
| ACC | 累加器 | 存放操作数和运算结果 |
| MQ | 乘商寄存器 | 乘除运算时存放乘数/商 |
| X | 通用操作数寄存器 | 暂存参与运算的操作数 |
| PC | 程序计数器 | 存放下一条指令的地址,顺序执行时自动递增 |
| IR | 指令寄存器 | 存放当前正在执行的指令 |
| MAR | 存储器地址寄存器 | 锁存要访问的存储器地址 |
| MDR | 存储器数据寄存器 | 锁存读出或待写入的数据 |
| CU | 控制单元 | 对 IR 中的操作码译码,产生控制信号 |
| PSW | 程序状态字寄存器 | 存放条件码与其他状态信息 |
前四行属运算器一侧,后六行属控制器一侧。PSW 中常见的四个标志位:CF 无符号运算产生进位/借位、ZF 结果为 0、SF 结果为负、OF 有符号运算溢出。
关于 PC 和 PSW 各有一条容易记混的:
⚠️ PSW 的产生者与使用者不是同一个部件。 条件码由 ALU 在运算时产生,供控制器在条件转移时读取判断。多数教材把它归入控制器的"控制和状态寄存器",但记这条产生—使用关系比记它归谁管用得多。
🔴 PC 里存的是"下一条指令的地址",但取指周期开始的那一刻它装的是当前指令地址。 两种说法不矛盾——PC 送 MAR 之后立即自增,取指周期结束时它已经指向下一条。而自增必须在取指周期做:转移指令在执行周期改写 PC,自增若留到最后会把刚写进去的目标地址又加掉。先增后改还顺带带来一个便利——相对寻址的基准天然就是"下一条指令的地址"。
三、各寄存器的位数
宽度由各自不同的量决定,不能拿同一个数去套:PC 看能寻址到的指令地址范围(主存 4 GB 按字节编址就是 32 位);IR 看指令字长(32 位定长指令字就是 32 位);MAR 看存储器地址位数,它决定最大寻址空间;MDR 看存储字长(等于数据总线宽度),与机器字长不一定相等。
🔴 按字边界对齐时 PC 可以省掉低位。 32 位指令一律放在 4 的倍数地址上
低 2 位恒为 0、不携带信息。所以"主存 4 GB、按字节编址、32 位定长指令且按字边界对齐"时, 位而 位。只有题面明确说了"按字边界对齐"才能省,否则按满位算。
🔴 三个"字长"是三个独立的量,别混:机器字长
CPU 一次能处理的位数(也就是 ALU 的宽度);指令字长 一条指令占的位数(变长指令根本没有单一值);存储字长 一个存储单元的位数(也就是 MDR 的宽度)。三者可以互不相等,常见设计取整数倍只是为了简化寻址。
机器字长的定义是 CPU 一次能处理的二进制位数,因此哪些部件必须等于它也就定了:
| 部件 | 一定等于机器字长? | 理由 |
|---|---|---|
| ALU | 是 | 机器字长的定义就是 ALU 的宽度 |
| 通用寄存器 | 是 | 要装得下 ALU 的操作数和结果 |
| 指令寄存器 IR | 否 | 等于指令字长,可与机器字长不等 |
| 浮点寄存器 | 否 | 由浮点格式决定(32 位机上的双精度寄存器是 64 位) |
| MDR | 否 | 等于存储字长 |
四、哪些寄存器程序员可见
判据只有一条,不必逐个记:
🔴 汇编指令能不能直接读它、写它,或者通过指令的副作用改变它。 能,就是可见;不能,就是透明。
⚠️ PC 可见这一点最容易想反。 "不能用
MOV随便读写"不等于"不可见"——jmp/call/ret/ 条件分支的语义本质就是改写 PC,call还会把 PC 压栈。条件码寄存器教材称"部分透明",因为它能被条件转移测试、部分标志位还有专门指令置复位;能被指令读到就算可见。
| 程序员可见(属于 ISA) | 程序员透明(实现细节) |
|---|---|
| PC 程序计数器 | MAR 存储器地址寄存器 |
| 通用寄存器组(GPRs) | MDR 存储器数据寄存器 |
| PSW / 条件码寄存器 | IR 指令寄存器 |
| 栈指针 SP、基址寄存器、变址寄存器 | 微指令寄存器、控制存储器 |
| 流水线段间锁存器、TLB、Cache 行 |
右边一列的共同点:它们的装入和使用全部由硬件在取指、译码、访存过程中自动完成,指令集里根本没有能碰到它们的指令。微指令寄存器还有一层——它属于控制器的一种实现方式,换成硬布线控制器它就不存在了,自然不可能进入指令集架构。
五、数据通路的两类元件
| 类别 | 别名 | 特点 | 包括 |
|---|---|---|---|
| 操作元件 | 组合逻辑元件 | 输出只由当前输入决定,不存储状态,无需时钟 | ALU、多路选择器 MUX、加法器、译码器、扩展器 |
| 状态元件 | 时序逻辑元件 | 能保存状态,由时钟边沿更新 | PC、通用寄存器组、各类寄存器、存储器 |
判别方法:撤掉输入后它还记不记得东西。ALU 撤掉输入立刻失忆,是操作元件;PC 会一直记着地址等下一个时钟沿,是状态元件。
数据通路的边界还有一条最常被拿来出判断题的:
🔴 数据通路里有异常事件的检测电路,但没有产生控制信号的控制部件。 溢出、地址越界、缺页这些信号都是从运算与访存的路径上引出来的,所以检测电路在数据通路之内;而控制信号是从控制器送进数据通路的,控制部件本身不属于数据通路。分工很清楚:数据通路负责"数据往哪走、怎么算",控制器负责"什么时候走、走哪条"。
考点速记
- CPU 的部件可以从功能推出来:取指
PC,分析 IR 译码器,执行 CU,运算 ALU 寄存器,异常 中断系统;MAR / MDR 则由访存需求推出,两者都在 CPU 内部。 - 位数各看各的量:PC 看地址范围(按字边界对齐可省低位)、IR 看指令字长、MDR 看存储字长;只有 ALU 与通用寄存器一定等于机器字长。
- 可见性判据是"指令能否读写或改变它":PC、通用寄存器、PSW、基址寄存器、变址寄存器可见,MAR、MDR、IR、微指令寄存器透明。数据通路
操作元件 状态元件,含异常检测电路但不含控制部件。
这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):
- 问哪些寄存器 / 存储器对汇编语言程序员可见:用"指令能否读写或改变它"这一条筛。PC 可见(转移与调用指令的语义就是改写它)、基址寄存器与标志状态寄存器可见;IR、MAR、MDR、微指令寄存器透明。
- 问哪些部件的位数一定与机器字长相同:只有 ALU 与通用寄存器。指令寄存器等于指令字长、浮点寄存器由浮点格式定、MDR 等于存储字长,三者都不一定。
- 给主存容量、编址方式与指令格式,问 PC 和 IR 的位数至少是多少:IR
指令字长;PC 看地址范围,题面说了"按字边界对齐"才减掉低位(4 GB 按字节编址 + 32 位对齐指令 30 位与 32 位)。 - 问数据通路包含 / 不包含什么:包含 ALU 这类组合逻辑元件、寄存器这类时序逻辑元件、以及异常事件的检测电路;不包含生成控制信号的控制部件。这两句正反都被考过。
- 给一组元件问哪些属于操作元件(组合逻辑):ALU 与多路选择器 MUX 是;PC 与通用寄存器组会保存状态,属状态元件。
- 挑关于数据通路与控制器的错误叙述:常设的错点是"通用寄存器组中应该包含程序计数器"——PC 不在通用寄存器组里,它是独立的专用寄存器。
- 给一条指令的功能与寻址方式,问取数及执行过程中用到哪些部件:注意问的是"取数及执行"这两个阶段——指令译码器在译码阶段就用完了,不算在内;寄存器间接寻址要访存,所以存储器算在内。
易错:把 PC 判成"程序员不可见"。转移、调用、返回指令的语义本质就是改写 PC。
易错:不看"按字边界对齐"这个前提就给 PC 减位。没这句话时按满位算。
易错:把控制部件算进数据通路,或把异常检测电路排除在数据通路之外。两处方向正好相反。
易错:把 PC 当成通用寄存器组的一员。
易错:问"取数及执行阶段用到哪些部件"时把指令译码器算进去。它属于译码阶段。
教材出处
- CPU 的功能、四大组成部分与内部结构(图 8.1、图 8.2):唐朔飞《计算机组成原理》第 3 版 §8.1 CPU 的结构,印刷页 p337–p338
- 用户可见寄存器的四种分类、条件码寄存器"部分透明"的表述:同上,印刷页 p339
- MDR 与 IR 在取指过程中的关系:同上,印刷页 p340