Skip to content

指令执行过程

2026 大纲 五(二)指令执行过程

一条指令为什么要拆成四段

取指周期间址周期(可选)执行周期中断周期(可选)

这四段的名字不必硬记,因为划分它们的依据只有一条:这一段访问存储器是为了什么。取指周期取的是指令,间址周期取的是操作数的有效地址,执行周期取的是操作数(当指令确实要访存时),中断周期存的是程序断点。每一次访存都要占用一个完整的存储周期,所以它天然就是时间上的分界点。

四段里只有取指周期是每条指令都有的:间址只在间接寻址时出现,中断只在本条指令结束时确有请求才进入。所以不同指令的指令周期长度差别可以很大——JMP X 的指令周期几乎就等于取指周期,而乘法指令的执行周期要做很多轮加法与移位。

🔴 也只有取指周期能画出统一的数据流图。 前三个子周期里,取指与间址对所有指令都一样,唯独执行周期因指令而异,只能逐条分析。这也正是控制器设计的难点所在:取指部分是固定电路,执行部分才需要按操作码分支。

图 8.5 指令周期示意图
图 8.5 指令周期示意图
(唐朔飞《计算机组成原理》第 3 版,见文末教材出处)

一、取指周期

任务:从内存中读取指令,送入 IR。所有指令的取指操作完全相同,因此这是唯一可以画出统一数据流图的公共阶段。

步骤微操作说明
1(PC)MARPC 的内容(指令地址)送 MAR,再送地址总线
21RCU 经控制总线发出读命令
3M[MAR]MDR主存把指令经数据总线送入 MDR
4(MDR)IR指令送入指令寄存器
5OP(IR)CU操作码送控制单元译码
6(PC)+1PCPC 自增,指向下一条指令

最后一步的位置是硬性的:

🔴 PC 自增必须放在取指周期。 转移指令在执行周期改写 PC,自增若留到指令末尾,就会把刚写进去的目标地址又加掉。先增后改还有个副产品——取指结束后 PC 已经是"下一条指令的地址",相对寻址正是以此为基准。

⚠️ "+1"是简写。 实际增量取决于编址方式与指令字长:按字节编址、32 位定长指令则每次加 4;可变长指令要按本条指令的实际字节数递增,而这个值要译码之后才能确定。

这张表还顺带回答了一类判断题:即使是空操作指令,它的指令周期里也有寄存器被改变——至少 PC 自增了,IR、MAR、MDR 也都被写过。"NOP 不改变任何寄存器"是错的。

二、间址周期

任务:当指令采用间接寻址时,取出操作数的有效地址触发条件:指令中的寻址特征位表明是间接寻址。

步骤微操作说明
1Ad(IR)MAR指令中的形式地址送 MAR
21R读内存
3M[MAR]MDR读出的内容就是有效地址
4(MDR)MAR有效地址送 MAR,为执行周期访存做准备

多重间接寻址时重复上述过程,直至取到最终有效地址。

🔴 间址周期取的是地址,不是操作数。 这个周期结束时 MDR 里装的是一个地址;真正的操作数要到执行周期才取出。所以一条采用间接寻址的访存指令一共要访存三次:取指、取有效地址、取操作数。

三、执行周期

任务:完成指令规定的操作。以几类典型指令为例(设为单地址格式,隐含使用 ACC):

指令功能微操作序列
ADD X(直接寻址)ACCACC+M[X]Ad(IR)MARM[MAR]MDR(ACC)+(MDR)ACC
STA X(存数)M[X]ACCAd(IR)MAR(ACC)MDR1W(MDR)M[MAR]
JMP X(无条件转移)PCXAd(IR)PC只改写 PC,不访存,是最简单的执行周期
BZ X(条件转移)ZF=1 则转移ZF=1,则 Ad(IR)PC;否则不操作

条件转移的判断依据来自 PSW 中的标志位,而标志位是前一条运算指令留下的——这正是 PSW 存在的意义。

四、中断周期

任务:保存断点,转入中断服务程序。CPU 在每条指令执行阶段结束前发出中断查询信号;若有请求,则进入中断周期。

步骤微操作说明
10EINT关中断,防止保存断点的过程被打断
2(SP)1SP(SP)MAR栈指针减 1,准备压栈
31W发写命令
4(PC)MDR(MDR)M[MAR]断点(PC 的值)经数据总线存入存储器
5中断服务程序入口地址 PC为下一个取指周期做好准备

第 1 步的位置不能动:

🔴 必须先关中断,再保存断点。 如果保存断点的过程中又响应了一个中断,两次压栈用的是同一个 SP,断点会被覆盖或错位,原程序再也回不去了。另外,保存断点用的地址由 CU 提供(比如栈指针的内容)而不是指令给出的——整个中断周期完全由硬件自主完成

还要注意中断周期的位置:它是指令周期的第四个子周期,发生在本条指令执行结束之后、下一条取指之前。所以中断是"指令级"响应的,CPU 不会在一条指令执行到一半时中途响应(异常除外,详见 异常和中断机制)。

五、CPU 怎么知道自己在哪个周期

CPU 内设置四个标志触发器——FE(取指)、IND(间址)、EX(执行)、INT(中断),任一时刻只有一个被置 1,用它选通对应的微操作序列。这四个触发器的状态就是控制器的"当前状态",这一思路在《硬布线控制器》中会展开成完整的状态机。

每条边的跳转条件都能从前面几节推出来:

由什么决定什么时候判
FE IND 还是 FE EX指令的寻址特征位取指周期译码后
IND IND是否多重间接寻址每取到一层地址后
EX INT 还是 EX FE是否确有中断请求且允许中断执行阶段结束前的中断查询

因为四个触发器任一时刻只有一个为 1,这是一张真正的状态图而不是流程示意——箭头就是触发器的置位/复位动作。

六、三种周期的关系

三个名字层层嵌套:时钟周期(节拍、T 周期)是 CPU 的最小时间单位,T=1/f机器周期(CPU 周期)是完成一个基本操作所需的时间、含若干时钟周期;指令周期是取出并执行一条完整指令所需的全部时间。

指令周期机器周期时钟周期

而不是 >,是因为单周期 CPU 中三者相等;多周期里指令周期含多个机器周期、机器周期又含多个时钟周期。

⚠️ 三处口径要留意。"一个指令周期含几个机器周期"没有通用答案,取决于 CPU 的设计方式与具体指令;机器周期(CPU 周期)是四个子周期中的一段,与指令周期差一个数量级,两个名字长得像别混。机器周期也不一定等于存取周期——它由最耗时的基本操作决定,多数机器中最慢的就是访存,所以教材常直接取存取周期;同理取指周期也不一定只是一个机器周期,指令字长大于存储字长时取一条指令要访存多次。

考点速记

  1. 四个子周期取指 间址(可选) 执行 中断(可选),划分依据是访存目的不同;只有取指周期每条指令都有,也只有它能画统一数据流图。
  2. PC 自增必须在取指周期完成,否则会覆盖转移指令写入的目标地址;间址周期取的是有效地址而非操作数,间接寻址的访存指令共访存三次
  3. 中断周期的动作顺序是硬性的——关中断 保存断点 转入服务程序,全程由硬件完成;CPU 用四个工作周期标志触发器区分当前所处子周期;指令周期机器周期时钟周期,单周期 CPU 中三者相等。

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 挑关于指令执行的错误叙述(题面通常先声明"不采用 Cache 和指令预取、且处于开中断状态"):四个选项分别踩"每个指令周期至少访存一次"(对,取指必访存)、"指令周期 一个时钟周期"(对)、"空操作指令的指令周期中任何寄存器都不会被改变"(,PC 自增了,IR / MAR / MDR 也都被写过)、"每条指令执行结束时都可能被外部中断打断"(对,中断周期就在这个位置)。
  • 问哪些指令可能不改变"程序下一条指令的地址":判据是从主程序的视角看,原本约定要执行的下一条还会不会被执行条件转移在条件不成立时顺序执行,算"可能不改变";返回指令把控制权还原到 CALL 之后那条,正是主程序原本要执行的下一条,也算不改变;而过程调用陷入指令都必然把控制权送往别处,算改变。

易错:认为 NOP 的指令周期里没有任何寄存器变化。PC 至少要自增。

易错:把间址周期取到的东西当成操作数。它取的是有效地址,操作数在执行周期才取。

易错:把中断周期的两步顺序写反。先关中断、再保存断点,反过来断点会丢。

易错:认为 CPU 可以在指令执行到一半时响应外部中断。中断是指令级响应的,异常才可能在指令内部触发。

教材出处
  • 指令周期的定义、JMP 与乘法指令的周期差异(图 8.5、图 8.6):唐朔飞《计算机组成原理》第 3 版 §8.2.1 指令周期的基本概念,印刷页 p342
  • 四个子周期的访存目的对照、四个工作周期标志触发器(图 8.8、图 8.9):同上,印刷页 p343
  • 取指、间址、中断三个周期的数据流,以及"执行周期无法用统一数据流图表示":同上,§8.2.2 指令周期的数据流,印刷页 p344–p345

相关知识

CPU 的功能和基本结构单总线数据通路硬布线控制器异常和中断机制

真题练习