三、指令周期的数据流


指令周期的数据流描述了在取指周期执行周期中,数据、地址和控制信号在CPU、内存和I/O子系统之间流动的路径。


核心概念:总线是关键通道

数据流的核心是系统总线,它通常分为三组:

  1. 数据总线:在CPU和内存/I/O之间双向传输指令和数据
  2. 地址总线:CPU单向发出,指定要读写的内存地址或I/O端口地址。
  3. 控制总线:传输控制信号(如内存读、内存写、中断确认等),协调各部件操作。

数据流就是数据、地址和控制信号在这些总线上“穿梭”的过程。


两个主要阶段的数据流

指令周期主要由两个阶段循环构成:取指周期执行周期

一、取指周期的数据流

这个阶段的目标是从内存中读取下一条指令。无论指令是什么,所有指令的取指阶段数据流都是相同的。

参与部件

  • CPU:程序计数器(PC)、指令寄存器(IR)、内存地址寄存器(MAR)、内存数据寄存器(MDR)/数据缓冲寄存器、控制单元(CU)
  • 内存

数据流步骤

  1. 传送地址

    • CPU内部:PC中的内容(即下一条指令的地址)被拷贝到内存地址寄存器(MAR) 中。
    • CPU外部:MAR中的地址通过地址总线发送到内存模块。
  2. 发出读命令

    • CPU的控制单元(CU) 通过控制总线向内存发送一个 “内存读” 信号。
  3. 读取指令

    • 内存模块根据地址总线上的地址,定位到对应的存储单元,将其中的内容(即指令代码)取出。
    • 内存将该指令代码通过数据总线发送回CPU。
  4. 接收并存储指令

    • CPU通过数据总线接收指令代码,并将其存入内存数据寄存器(MDR)
    • 指令代码再从MDR被移动到指令寄存器(IR) 中保存,以备下一阶段(译码)使用。
  5. 更新程序计数器

    • 同时,在指令被读取后,程序计数器(PC) 的值会自动增加(例如+1或+4,取决于指令长度和架构),以指向下一条指令的地址。

取指周期数据流总结
PC -> MAR -> 地址总线 -> 内存
控制总线:读信号
内存 -> 数据总线 -> MDR -> IR
PC++


二、执行周期的数据流

这个阶段的数据流因指令而异,因为不同指令要执行的操作完全不同。控制单元(CU)会对IR中的指令进行译码,从而激活不同的数据通路。

我们以三种典型指令为例:

1. 内存加载指令(如 LOAD R1, X)

  • 功能:将内存地址X中的数据加载到寄存器R1中。
  • 数据流
    • 译码:CU识别出这是LOAD指令,操作数是地址X。
    • 传送地址:将IR中的地址部分(X)送入MAR -> 通过地址总线发送到内存。
    • 发出读命令:CU通过控制总线发送 “内存读” 信号。
    • 读取数据:内存将地址X处的数据通过数据总线送回CPU -> 存入MDR。
    • 写回寄存器:MDR中的数据被移动到指定的目标寄存器R1中。

2. 算术运算指令(如 ADD R1, R2)

  • 功能:将寄存器R1和R2中的内容相加,结果存回R1。
  • 数据流
    • 译码:CU识别出这是ADD指令。
    • 取操作数:寄存器R1和R2的值被直接送入算术逻辑单元(ALU) 的输入端。
    • 执行操作:CU命令ALU执行加法操作。
    • 接收结果:ALU输出计算结果。
    • 写回寄存器:计算结果被送回到目标寄存器R1中。
    • 注意:此操作完全在CPU内部完成,不涉及内存访问,速度极快。

3. 存储指令(如 STORE R1, X)

  • 功能:将寄存器R1中的数据存储到内存地址X中。
  • 数据流
    • 译码:CU识别出这是STORE指令。
    • 传送数据:将寄存器R1中的数据送入MDR。
    • 传送地址:将IR中的地址部分(X)送入MAR -> 通过地址总线发送到内存。
    • 发出写命令:CU通过控制总线发送 “内存写” 信号。
    • 写入数据:MDR中的数据通过数据总线被写入到内存的地址X处。

4. 转移指令(如 JMP X)

  • 功能:改变程序执行顺序,跳转到地址X处执行。
  • 数据流
    • 译码:CU识别出这是跳转指令。
    • 更新PC:将IR中的地址部分(X)直接加载到程序计数器(PC) 中。
    • 这样,下一个取指周期将从地址X开始,而不是顺序的下一个地址。

三、中断周期的数据流

中断周期的数据流:这个过程完全由控制单元(CU) 协调,其核心目标是保存现场(主要是程序断点)并跳转到中断服务程序

核心原则

  • 栈操作:假设栈向低地址增长,采用“先修改指针,后存入数据” 的方式。
  • 硬件自动执行:中断周期是由硬件自动触发的一系列操作,并非由某条特定指令引起。

中断周期数据流详细步骤

整个中断周期可以清晰地划分为两个阶段:

  1. 保存现场阶段:将程序计数器(PC)的内容(即断点)压入系统栈。
  2. 跳转阶段:加载中断服务程序(ISR)的入口地址到PC。

其数据流如下图所示:

flowchart TD A[中断发生] --> B["阶段一: 保存断点"]; subgraph B["阶段一: 保存断点"] direction TB B1[SP当前值送ALU] --> B2[ALU计算: 新SP = SP - 字长]; B2 --> B3["更新SP寄存器<br>同时将新地址送MAR"]; B3 --> B4[PC断点值送MDR]; B4 --> B5[将新栈顶地址MAR发至地址总线]; B5 --> B6[发内存写控制信号]; B6 --> B7[将断点数据MDR发至数据总线写入内存]; end B --> C["阶段二: 跳转至ISR"]; subgraph C["阶段二: 跳转至ISR"] direction TB C1[CU根据中断号计算<br>中断向量表地址]; C1 --> C2[从内存读取ISR入口地址]; C2 --> C3[将入口地址加载至PC]; end C --> D[进入下一个取指周期<br>CPU从ISR开始执行];
阶段一:保存断点(压栈操作)

目标:将PC(断点)存入栈中,并更新栈顶指针SP

  1. 计算新栈顶地址

    • SP -> ALU (将当前栈指针送入算术逻辑单元)
    • ALU执行: ALU输出 = SP - 字长 (计算新的空栈顶位置)
    • ALU输出 -> SP (先修改指针:将新地址写回SP寄存器,更新栈顶)
    • ALU输出 -> MAR (同时,将新栈顶地址送入内存地址寄存器)
  2. 准备断点数据

    • PC -> MDR (将程序计数器中的断点地址送入内存数据寄存器)
  3. 执行内存写操作

    • MAR -> 地址总线 (将新的栈顶地址发送到内存)
    • 控制总线(内存写信号) -> 内存 (CU发出“写”命令)
    • MDR -> 数据总线 -> 内存 (后存入数据:将断点写入新的栈顶位置)
阶段二:跳转至中断服务程序(ISR)

目标:将PC指向中断处理程序的入口地址。

  1. 获取ISR入口地址

    • CU根据中断向量号,计算出中断向量在中断向量表(IVT) / 中断描述符表(IDT) 中的内存地址。
    • CU执行一次内存读操作:从上述表中读取出ISR的入口地址,并将其存入MDR
  2. 更新PC

    • MDR -> PC (CU控制将入口地址从MDR加载到程序计数器PC中,覆盖原有值)

总结与要点

  1. 领导者控制单元(CU) 是全程的指挥者,发出所有控制信号。
  2. 核心数据流
    • 保存断点PC -> MDR -> 栈内存SP - 字长 -> SP, MAR
    • 跳转中断向量表[中断号] -> MDR -> PC
  3. 关键特点
    • 硬件自动完成:整个过程由硬件触发并执行,对程序员透明。
    • 原子性:中断周期的操作是不可分割的,保证了现场保存的完整性。
    • 精确中断:中断响应总是在一条指令执行结束后、下一条指令开始前发生。

中断周期是计算机实现并发实时响应能力的基石,其数据流体现了硬件和软件之间精密协同的工作原理。


总结

指令周期的数据流可以高度概括为以下模式化的循环:

取指周期数据流(固定)

PC → MAR → 地址总线 → 内存
控制总线(读) → 内存
内存 → 数据总线 → MDR → IR
PC 自增

执行周期数据流(可变)

  • 涉及内存地址/数据 → MAR/MDR ↔ 地址/数据总线 ↔ 内存
  • 涉及运算寄存器 ↔ ALU ↔ 寄存器
  • 涉及跳转地址 → PC

整个过程由控制单元(CU) 产生的控制信号严格指挥,像交通警察一样,精确控制着数据在总线和其他部件间的流动方向和时机。理解数据流是理解计算机体系结构如何实现“自动计算”的关键。

posted @ 2025-09-11 19:08  guanyubo  阅读(21)  评论(0)    收藏  举报