首页/计算机组成原理/中央处理器/指令执行过程 🔗 在 Obsidian 中打开
计算机组成原理 · 中央处理器

指令执行过程

重要度 ⭐⭐⭐⭐⭐中央处理器取指译码执行中断时钟周期CPU
速查
一条指令的生命周期 = 取指译码执行 →(访存 / 写回)→ 中断检查。取指是所有指令的公共操作,且 PC 在取指阶段就完成自增

速查

项目
取指PC → MAR → 主存 → MDR → IR,同时 PC + 1
译码分析操作码 OP(IR) 和操作数地址 Ad(IR)
执行取操作数 → 运算 → 存结果
一句话指令周期是 CPU 从主存取出执行完一条指令所需的全部时间,由若干机器周期组成,机器周期又由若干时钟周期(节拍)组成。

核心概念

指令周期的分解

指令周期 = 取指周期 + 执行周期

更细的分解:
指令周期 = 取指 + 译码 + 执行 + 访存 + 写回 + 中断检查

三级时间单位

层次含义关系
时钟周期(节拍 / T)CPU 的最小时间单位,一次基本微操作最小
机器周期(CPU 周期)完成一个基本工作阶段(如取指)= 若干时钟周期
指令周期完整执行一条指令= 若干机器周期

四类工作周期的从属关系

指令周期(最长)
  ├── 取指周期     (必有)
  ├── 间址周期     (仅间接寻址时有)
  ├── 执行周期     (必有)
  └── 中断周期     (仅有中断请求且允许响应时有)
标志触发器CPU 内部用 FE / IND / EX / INT 四个触发器区分当前处于哪个工作周期,控制器据此发出不同的微操作命令。

四大工作周期

1. 取指周期(Fetch)

1. PC → MAR              // 将 PC 的值送 MAR
2. MAR → 地址总线         // 地址送地址总线
3. CU 发出读命令          // 控制器发读信号
4. 主存 → 数据总线 → MDR  // 内存数据送 MDR
5. MDR → IR              // 指令送 IR
6. PC ← PC + 指令长度     // PC 自动更新
7. OP(IR) → ID           // 操作码送译码器
节拍微操作
T0PC → MAR
T1MAR → 地址总线,CU 发读命令
T2等待主存响应
T3MDR ← 数据总线
T4MDR → IR
T5PC ← PC + len
T6OP(IR) → 译码器

2. 间址周期(Indirect)

触发条件:指令使用间接寻址,需先从主存取出有效地址 EA。

1. MAR ← Ad(IR)      // 形式地址送 MAR
2. CU 发出读命令
3. MDR ← M[MAR]      // 从主存取出有效地址
4. Ad(IR) ← MDR      // 用 EA 更新指令的地址码

3. 执行周期(Execute)

加法指令 ADD R1, [addr]

1. MAR ← Ad(IR)      // 取地址
2. MDR ← M[MAR]      // 取操作数
3. R1  ← R1 + MDR    // ALU 做加法
4. 更新标志位(ZF / CF / OF / SF)

存数指令 STO R1, [addr]

1. MAR ← Ad(IR)      // 取地址
2. MDR ← R1          // 取数据
3. M[MAR] ← MDR      // 写入主存

无条件转移 JMP addr

1. PC ← Ad(IR)       // 直接改写 PC

条件转移 BEQ R1, R2, offset

1. if (R1 == R2) then PC ← PC + offset
   // 需 ALU 做比较(相减)并根据标志位判断
观察取指周期对所有指令都相同;执行周期的微操作序列因指令而异,这正是控制器(硬布线 / 微程序)设计的复杂点所在。

4. 中断周期(Interrupt)

响应条件(三者必须同时满足):

  • 有中断请求;
  • CPU 允许中断(中断使能 IF = 1,未处于关中断状态);
  • 当前指令执行完毕(指令级原子性)。
1. 关中断
2. 保存断点:PC(返回地址)压栈或存入特定单元
3. 保存现场:PSW 和通用寄存器压栈
4. 识别中断源:确定中断类型 → 取中断服务程序入口
5. 转入服务程序:PC ← 中断服务程序入口地址

指令执行的完整流程

取指周期 译码 间址周期(可选) 执行周期 中断周期(可选) 取下一条指令 间接寻址时
图:指令周期状态转换 —— 取指与执行必有,间址与中断按条件插入,最后回到取指开始下一条指令
读图要点整个循环永不停止(除非停机指令 HLT):CPU 上电后就在"取指—执行"这个大环里不断转圈,中断只是在环上临时插入一个岔路。

指令流水线基础

流水线思想

把指令执行拆成多个阶段,各阶段使用不同的硬件部件,因而可以让多条指令在不同阶段上重叠推进。

方式时间轴(每格 1 个 $\Delta t$)
非流水线I1: 取指 译码 执行 写回,I2 必须等 I1 全部完成后才开始
流水线I1 进入译码时 I2 即可开始取指,每拍流出一条指令

理想加速比

设有 $n$ 条指令、$k$ 级流水线,每级耗时 $\Delta t$:

  • 非流水线总时间:$T_{\text{非}} = n \times k \times \Delta t$
  • 流水线总时间:$T_{\text{流}} = (k + n - 1) \times \Delta t$
$$S = \frac{T_{\text{非}}}{T_{\text{流}}} = \frac{n \times k \times \Delta t}{(k+n-1)\times \Delta t} = \frac{nk}{k+n-1}$$
极限当 $n \to \infty$ 时 $S \to k$,即理想加速比等于流水线级数。$(k-1)$ 就是流水线的"填充 / 排空"开销。

各类指令的执行时间

指令类型取指译码执行访存写回总周期
寄存器运算111014
Load(取数)111115
Store(存数)111104
分支111003
为什么 Load 最长Load 既要访存取回数据,又要写回寄存器,五个阶段全用上;Store 不写寄存器、分支不访存也不写回,因此更短。这正是 MIPS 五级流水线以 Load 作为"关键路径"的原因。

常见考法

  1. 写微操作序列:给定指令(如 ADD R1,[addr])与总线结构,按节拍写出取指 / 执行周期的微操作。
  2. 数指令周期含几个机器周期:注意间址与中断周期是否存在。
  3. 指令周期时间计算:由各类指令占比与周期数求平均 CPI,再乘时钟周期。
  4. 状态转换图判断:给出一段执行序列问处于哪个工作周期。
  5. 流水线加速比:套 $S = nk/(k+n-1)$,并讨论 $n \to \infty$ 的极限。
  6. PC 何时更新:几乎每年都以选择题形式出现的经典陷阱。
某机器指令组成:寄存器运算 40%、Load 30%、Store 20%、分支 10%,按上表周期数,则 $\text{CPI} = 0.4\times4 + 0.3\times5 + 0.2\times4 + 0.1\times3 = 4.2$。若时钟周期 $\Delta t = 2\ \text{ns}$,执行 $10^6$ 条指令耗时 $4.2 \times 2 \times 10^6\ \text{ns} = 8.4\ \text{ms}$。

易错点

必记
  1. PC 在取指阶段就更新,不是执行阶段——这样转移指令在执行阶段改写 PC 才能生效。
  2. 间址周期只在间接寻址时才有,直接寻址 / 寄存器寻址都没有。
  3. 中断在每条指令执行完毕后才检查,不会打断一条指令的中途。
  4. PC 自增由硬件自动完成,无需额外指令,也不占用执行周期。
  5. 执行周期的长度因指令而异,取指周期则对所有指令相同。
  6. 流水线的理想加速比等于级数 $k$,不是 $k$ 的倍数,也不会超过 $k$。
  7. 中断响应时先保存断点(PC)再保存现场(PSW / 通用寄存器),顺序不能颠倒。

核心结论

  1. 指令周期 = 取指周期 + 执行周期,可选插入间址周期与中断周期。
  2. 取指是所有指令的公共操作;PC 自增发生在取指阶段。
  3. 时钟周期 < 机器周期 < 指令周期,三者层层包含。
  4. 不同指令的执行周期微操作不同,这是控制器设计的核心难点。
  5. 中断检查在指令边界进行,保证了指令执行的原子性
  6. 流水线不缩短单条指令延迟,只提高吞吐率,理想加速比为 $k$。

记忆卡片

PC 什么时候加 1?
取指周期内由硬件自动完成,早于执行周期,因此转移指令改写 PC 才有效。
取指周期的数据流向?
PC → MAR → 地址总线 → 主存 → 数据总线 → MDR → IR。
间址周期做什么?
按形式地址访存一次,取回有效地址 EA 并回填 Ad(IR)。
中断响应三条件?
有请求 + CPU 开中断 + 当前指令执行完毕。
保存断点 vs 保存现场?
断点是 PC(返回地址),由硬件保存;现场是 PSW 和通用寄存器,先断点后现场。
哪类指令周期数最多?
Load:五个阶段全用(取指/译码/执行/访存/写回),共 5 拍。
$S=\dfrac{nk}{k+n-1}$ 的极限?
$n \to \infty$ 时 $S \to k$,即流水线级数就是理想加速比上界。
三级时间单位关系?
指令周期 ⊇ 机器周期 ⊇ 时钟周期(节拍是最小单位)。

交互动画 · 取指周期逐拍走查

取指周期数据通路(点击"下一步"逐拍推进) PC MAR 主存 MDR IR 译码器 CU +len 地址总线 / 数据总线
动画说明七拍对应上表 T0~T6。注意第 6 拍(PC ← PC + len)与取指的访存操作互不干扰,因此实际机器常把它与 T1/T2 并行完成以缩短取指周期。

相关知识点

cpu-function-and-structure data-path control-unit instruction-pipeline

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。