跳转至

指令执行过程

概述

指令执行过程是计算机工作的核心,理解指令如何被取出、分析和执行对于深入理解计算机系统至关重要。本节详细介绍指令执行的各个阶段和具体步骤。

指令周期

指令周期是指取出并执行一条指令所需的全部时间。一个完整的指令周期通常包含以下几个阶段:

1. 取指周期 (Fetch Cycle)

从存储器中取出指令的过程。

步骤:

  1. (PC) → MAR: 将程序计数器PC的内容(指令地址)送到存储器地址寄存器MAR
  2. M(MAR) → MDR: 将MAR指向的存储单元的内容(指令)送到存储器数据寄存器MDR
  3. (MDR) → IR: 将MDR的内容(指令)送到指令寄存器IR
  4. (PC) + 1 → PC: PC自动加1,为取下一条指令做准备

时间: 取指周期时间 = 1个访存时间

2. 间址周期 (Indirect Cycle)

如果指令采用间接寻址,需要根据形式地址获取有效地址。

步骤:

  1. Ad(IR) → MAR: 将指令的地址码字段送到MAR
  2. M(MAR) → MDR: 将有效地址从存储器读出到MDR
  3. (MDR) → Ad(IR): 将有效地址送回指令的地址码字段

注意: 只有采用间接寻址的指令才需要间址周期。

3. 执行周期 (Execute Cycle)

根据指令的操作码执行相应的操作。

不同指令的执行周期不同:

  • 取数指令: 从存储器取操作数到寄存器
  • 存数指令: 将寄存器内容存入存储器
  • 算术运算指令: 执行算术运算
  • 逻辑运算指令: 执行逻辑运算
  • 转移指令: 修改PC值,实现程序跳转

4. 中断周期 (Interrupt Cycle)

如果有中断请求,需要处理中断。

步骤:

  1. 保存断点(PC)和程序状态字(PSW)
  2. 关中断
  3. 获取中断服务程序入口地址
  4. 转去执行中断服务程序

注意: 只有在指令执行完成后才会响应中断。

典型指令的执行过程

1. 取数指令 (LOAD)

功能: 将存储器中的数据取到累加器ACC

指令格式: LOAD A (将地址A的内容取到ACC)

执行步骤:

Text Only
取指周期:
(PC) → MAR          // 指令地址送MAR
M(MAR) → MDR        // 取出指令
(MDR) → IR          // 指令送IR
(PC) + 1 → PC       // PC加1

执行周期:
Ad(IR) → MAR        // 操作数地址送MAR
M(MAR) → MDR        // 取出操作数
(MDR) → ACC         // 操作数送ACC

2. 存数指令 (STORE)

功能: 将累加器ACC的内容存入存储器

指令格式: STORE A (将ACC的内容存入地址A)

执行步骤:

Text Only
取指周期:
(PC) → MAR          // 指令地址送MAR
M(MAR) → MDR        // 取出指令
(MDR) → IR          // 指令送IR
(PC) + 1 → PC       // PC加1

执行周期:
Ad(IR) → MAR        // 存储地址送MAR
(ACC) → MDR         // ACC内容送MDR
(MDR) → M(MAR)      // MDR内容写入存储器

3. 加法指令 (ADD)

功能: 将存储器中的数据与ACC相加,结果存入ACC

指令格式: ADD A (ACC + (A) → ACC)

执行步骤:

Text Only
取指周期:
(PC) → MAR          // 指令地址送MAR
M(MAR) → MDR        // 取出指令
(MDR) → IR          // 指令送IR
(PC) + 1 → PC       // PC加1

执行周期:
Ad(IR) → MAR        // 操作数地址送MAR
M(MAR) → MDR        // 取出操作数
(ACC) + (MDR) → ACC // 加法运算,结果送ACC

4. 无条件转移指令 (JMP)

功能: 无条件转移到指定地址

指令格式: JMP A (PC = A)

执行步骤:

Text Only
1
2
3
4
5
6
7
8
取指周期:
(PC) → MAR          // 指令地址送MAR
M(MAR) → MDR        // 取出指令
(MDR) → IR          // 指令送IR
(PC) + 1 → PC       // PC加1(会被覆盖)

执行周期:
Ad(IR) → PC         // 转移地址送PC

5. 条件转移指令 (JZ)

功能: 如果零标志位为1,则转移

指令格式: JZ A (如果ZF=1,则PC=A)

执行步骤:

Text Only
取指周期:
(PC) → MAR          // 指令地址送MAR
M(MAR) → MDR        // 取出指令
(MDR) → IR          // 指令送IR
(PC) + 1 → PC       // PC加1

执行周期:
if (ZF == 1) {
    Ad(IR) → PC     // 条件满足,转移
}
// 否则顺序执行

指令周期的数据流

取指周期数据流

Text Only
PC → MAR → Memory → MDR → IR
PC + 1 → PC

间址周期数据流

Text Only
Ad(IR) → MAR → Memory → MDR → Ad(IR)

执行周期数据流

根据指令类型不同而不同。

中断周期数据流

Text Only
1
2
3
PC → MDR → Memory(保存断点)
PSW → MDR → Memory(保存PSW)
中断向量 → PC

指令周期的控制信号

取指周期控制信号

  1. PCout, MARin: PC内容输出到总线,写入MAR
  2. Read: 发出读命令
  3. MDRout, IRin: MDR内容输出到总线,写入IR
  4. PC+1: PC自动加1

执行周期控制信号(以加法为例)

  1. IRout, MARin: IR的地址码输出到总线,写入MAR
  2. Read: 发出读命令
  3. MDRout, Yin: MDR内容输出到总线,写入Y寄存器
  4. ACCout, Xout, Add: ACC和Y寄存器内容相加
  5. Zout, ACCin: 运算结果写入ACC

指令流水线

概念

指令流水线是指将指令执行过程划分为多个阶段,多条指令的不同阶段可以并行执行,从而提高CPU的吞吐率。

经典的五级流水线

  1. 取指(IF): 从存储器取指令
  2. 译码(ID): 指令译码,读寄存器
  3. 执行(EX): 执行运算或计算地址
  4. 访存(MEM): 访问存储器
  5. 写回(WB): 结果写回寄存器

流水线的性能指标

  • 吞吐率: 单位时间内完成的指令数
  • 加速比: 流水线方式与串行方式的速度比
  • 效率: 流水线各段的利用率

流水线冲突

  1. 结构冲突: 硬件资源冲突
  2. 数据冲突: 数据依赖关系
  3. 控制冲突: 转移指令引起

参考资料