知识点

CPU的核心部件

部件的分工

CPU执行程序的过程可以拆成取指令、译码、执行、写回几步,每一步由不同的部件承担。Simple-MIPS是32位架构:内存按字节编址,一条指令固定占4字节,通用寄存器也都是32位。下表给出四个核心部件的分工。

部件保存或处理的内容在指令执行中的作用
程序计数器PC下一条要执行的指令的内存地址把取指地址交给内存;顺序执行时指向下一条指令
指令寄存器IR当前正在执行的指令暂存取回的32位指令,供控制单元译码
算术逻辑单元ALU两个输入操作数和一个输出结果完成算术、逻辑、移位和比较运算
寄存器组32个32位通用寄存器存放参与运算的数据与地址,是ALU的直接数据来源

PC保存的是地址而不是指令本身;指令从内存取回后才放进IR。这两个部件都与“当前执行到哪条指令”有关,区别在于PC指向下一条,IR保存当前这一条。

各部件的职责

程序计数器PC

PC存储下一条要执行的指令的内存地址。可以把它想成读书时的书签,标记下一次从哪里继续。顺序执行时,它在取指后增加4:一条Simple-MIPS指令是32位,即4字节,下一条指令正好在相邻的4字节之后。分支和跳转指令会直接改写PC,顺序执行、循环和条件分支都靠这一点实现。

PC只负责提供地址,不判断该地址上是什么内容;取回指令之后的工作由IR和控制单元接手。

指令寄存器IR

取指时,内存按PC给出的地址送回32位指令,这条指令先放进IR,再由控制单元译码并发出执行信号。IR只保存当前这一条指令,取下一条时会覆盖它的内容。

一条Simple-MIPS指令的32位通常划分为几个字段:

  • 操作码:指出指令类型,例如加载、存储、减法;
  • 寄存器编号:指出源寄存器和目标寄存器;
  • 立即数或地址偏移:供内存访问或算术运算使用的常数。

算术逻辑单元ALU

ALU是执行运算的部件,通常接收两个操作数,输出一个结果。它处理的运算包括:

  • 算术运算:加、减、乘、除;
  • 逻辑运算:与、或、非、异或;
  • 移位运算:左移、右移,包含逻辑移位和算术移位;
  • 比较运算:比较两个数的大小,设置条件标志。

执行哪一种运算由控制单元根据操作码决定。ALU本身不区分当前是哪条指令,它只对送进来的操作数执行被指定的运算。

寄存器组

寄存器是CPU内部的高速存储单元,用来临时存放数据和地址。它的访问通常在1个时钟周期内完成,比内存快得多;数量有限,Simple-MIPS有32个通用寄存器;每个寄存器固定32位。

寄存器按用途有习惯命名:

寄存器用途
$zero恒为0
$at汇编器临时使用
$v0–$v1函数返回值
$a0–$a3函数参数
$t0–$t9临时寄存器
$s0–$s7需要跨调用保留的寄存器

$zero的值由硬件固定,写入也会被丢弃,因此常用来提供常数0。以上是常见命名,完整编号共32个;寄存器编号如何出现在指令里,见Simple-MIPS教学指令集。

一条指令的取指与执行

  1. PC把地址送到内存,内存返回该地址上的32位指令;顺序执行时PC同时增加4。
  2. 指令进入IR,控制单元按操作码译码,确定要读哪些寄存器、做什么运算、是否访问内存。
  3. 寄存器组把操作数送入ALU,ALU完成运算;如果指令是load或store,还要由内存完成读写。
  4. 结果写回寄存器组,PC已经指向下一条指令。

例子

跟踪sub $t0, $t1, $t2的部件流转

设当前PC为0x00400000,$t1的值为9,$t2的值为4,执行

sub.s
sub $t0, $t1, $t2
  1. 取指:PC把0x00400000交给内存,取回该地址上的32位指令,PC变为0x00400004。

  2. 译码:指令进入IR。控制单元从操作码认出这是减法,从寄存器编号字段读出源寄存器 $t1、$t2和目标寄存器 $t0。

  3. 执行:寄存器组把9和4送入ALU,ALU做减法,得到5。

  4. 写回:结果写回 $t0。PC已经指向0x00400004处的下一条指令。

执行后 $t0的值为5,$t1与 $t2不变。

:::

用 $zero复制寄存器的值

add $t0, $t1, $zero的第二个操作数是恒为0的 $zero,加法不改变 $t1的值,只把它复制到 $t0。这条指令与move $t0, $t1做同一件事,两种写法的取舍见Simple-MIPS教学指令集。

交互探索

逐步执行一条减法指令,查看PC、IR、ALU和目标寄存器的状态。

一条减法指令经过哪些部件?

逐步查看取指、译码、执行和写回中的部件状态。

正在准备演示…

题集

练习

  1. 取回的指令在执行前先存放在哪个部件?

    选择答案
    参考解答

    取指后指令进入IR,由控制单元译码;PC保存的是地址。

  2. 一条Simple-MIPS指令长32位,顺序执行时PC每次增加多少字节?

    PC增加 字节。

    参考解答

    32位等于4字节,相邻指令的地址相差4。

  3. 哪个寄存器的值恒为0?

    选择答案
    参考解答

    $zero由硬件固定为0,常用来提供常数0。

  4. ALU可以直接完成下列哪些运算?

    题 alu-ops · choice
    参考解答

    读内存由load指令经内存完成,ALU只处理送进来的操作数。