跳至主要內容

2.指令执行过程


指令周期

CPU从主存中取出并执行一条指令的时间称为指令周期,不同指令的指令周期可能不同。指令周期常用若干机器周期来表示,一个机器周期又包含若干时钟周期(也称节拍或T周期,它是CPU操作的最基本单位)。

每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等

image.png
image.png
image.png
image.png

上述4个工作周期都有 CPU 访存操作,只是访存的目的不同。

  1. 取指周期是为了取指令
  2. 间址周期是为了取有效地址
  3. 执行周期是为了取操作数
  4. 中断周期是为了保存程序断点

为了区别不同的工作周期,在CPU内设置4个标志触发器FE、ND、EX和NT,它们分别对应取指、间址、执行和中断周期,并以“1”状态表示有效,分别由1→FE、1→ND、1→EX和1→NT这4个信号控制。

注意

中断周期中的进栈操作是将SP减1,这和传统意义上的进栈操作相反,原因是计算机的堆栈中都是向低地址增加,所以进栈操作是减1而不是加1

指令周期的数据流

取指周期

取指周期的任务是根据 PC 中的内容从主存中取出指令代码并存放在IR中。

PC 中存放的是指令的地址, 根据此地址从内存单元中取出 的是指令, 并放在指令寄存器 IR 中, 取指令的同时, PC 加 1 。
取指周期的数据流向如下:

  1. PC 1\to^{1} MAR 2\to^2 地址总线 3\to^3 主存。
  2. CU 发出读命令 4\to^4 控制总线 5\to^5 主存。
  3. 主存 6\to^6 数据总线 7\to^7 MDR 8\to^8 IR(存放指令)。
  4. CU 发出控制信号 9\to^9 PC 内容加 1
image.png
image.png

间址周期

间址周期的任务是取操作数有效地址。

将指令中的地址码送到MAR并送至地址总线,此后CU向存储器发读命令,以获取有效地址并存至MDR。

间址周期的数据流向如下:

  1. Ad(IR)(或MDR) 1\to^1 MAR 2\to^2 地址总线 3\to^3 主存。
  2. CU发出读命令 4\to^4 控制总线 5\to^5 主存。
  3. 主存 6\to^6 数据总线 7\to^7 MDR(存放有效地址)。
    其中,Ad(IR)表示取出IR中存放的指令字的地址字段。
image.png
image.png

执行周期

执行周期的任务是取操作数,并根据IR中的指令字的操作码通过ALU操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向

中断周期

处理中断请求,假设程序断点存入堆栈中,并用SP指示栈顶地址,而且进栈操作先修改栈顶指针,后存入数据
中断周期的数据流向如下:

  1. CU控制将SP减1,SP 1\to^1 MAR 2\to^2 地址总线 3\to^3 主存。
  2. CU发出写命令 4\to^4 控制总线 5\to^5 主存。
  3. PC 6\to^6 MDR 7\to^7 数据总线 8\to^8 主存(程序断点存入主存)。
  4. CU(中断服务程序的入口地址) 9\to^9 PC。
image.png
image.png

指令执行方案

单指令周期

  • 所有指令都选用相同的执行时间来完成,每条指令都在一个时钟周期内完成,指令间串行执行
  • 时钟周期取决于执行时间最长的指令的执行时间
  • 对于那些本来可以在更短时间内完成的指令, 要使用这个较长的周期来完成,会降低整个系统的运行速度

多指令周期

  • 对不同类型的指令选用不同的执行步骤[1],指令间串行执行
  • 指令需要几个周期就为其分配几个周期,不再要求所有指令占用相同的执行时间。

流水线方案

指令之间可以并行执行的方案,称为流水线方案,其追求的目标是力争在每个时钟脉冲周期完成一条指令的执行过程(只在理想情况下才能达到该效果)。这种方案通过在每个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。


  1. 不同个数的时钟周期完成不同指令的执行过程 ↩︎