定长操作码指令格式

定长操作码的定义只有一句:所有指令的操作码位数相同、位置相同——固定占据指令字的最高 位。

它的全部优点和全部缺点都从这一句里直接推出来,所以这一节短,但它是 4.1.4 的完整背景:扩展操作码之所以要被发明,就是因为定长操作码在这里遇到了一堵墙。

机制

编码容量:一个 的硬上界

位定长操作码能区分的指令条数:反过来,要容纳 条指令:这个公式是双向的,两个方向都会考。 而由于操作码占了 位,在指令字长 、有 个等长地址字段时:

每个地址字段位数

一道标准题的五步

例 某机指令字长 16 位,采用定长操作码,指令系统共 12 条指令,全部为二地址指令,两个地址码等长。

  1. 定操作码位数: 位(4 位可编 16 条,够;3 位只能编 8 条,不够)
  2. 定地址码位数: 位
  3. 地址码若是寄存器编号:最多 个通用寄存器
  4. 地址码若是主存直接地址:直接寻址范围 个存储单元
  5. 检查: ✅

第 3、4 步是同一个数字的两种读法——这个 6 位字段到底代表寄存器号还是主存地址,题目必须告诉你,格式本身看不出来(见 4.1.2 的边界讨论)。

定长操作码的代价:不可扩展

把上题改一个字:指令系统要扩充到 20 条。

  • 位
  • 地址码 位 ——不是整数

只能把地址码砍成 5 位(浪费 1 位)或把指令字长加到 18 位(破坏对齐)。多加 8 条指令,代价是每个操作数的直接寻址范围从 64 个单元掉到 32 个。

这就是定长操作码的墙:操作码位数被”最坏情况”绑架。 哪怕指令系统里只有 3 条指令真的需要两个地址, 也必须按全部指令的总数来定,那 位在每一条指令里都得占着。

为什么硬件仍然偏爱它

代价这么明显,为什么 MIPS、RISC-V 这些现代 ISA 反而坚持定长操作码?因为它的收益不在代码密度,而在时序:

graph LR
    subgraph 定长操作码
        A1["取指完成"] --> B1["OP 位置已知<br/>直接送译码器"] --> C1["一级译码<br/>延迟固定"]
    end
    subgraph 变长操作码
        A2["取指完成"] --> B2["先看前几位<br/>判断 OP 有多长"] --> C2["再取剩余 OP<br/>二级/多级译码"] --> D2["延迟不固定"]
    end
    classDef good fill:#d5e8d4,stroke:#82b366
    classDef bad fill:#f8cecc,stroke:#b85450
    class A1,B1,C1 good
    class A2,B2,C2,D2 bad

三条具体收益,每一条都在后面的章节兑现:

  1. 译码是一级组合逻辑——一个 译码器,延迟固定且最小。
  2. 地址字段的位置也固定,所以寄存器可以在译码还没出结果时就先读出来(反正位置就在那儿,读错了不用就是)。这是流水线 ID 段能把”译码”和”取寄存器”合并成一拍的前提,见 5.5 指令流水线(本地资料)。
  3. PC 增量是常数,取指部件不必等译码结果就能算下一条指令地址。

这三条合起来就是 RISC 选择定长指令字 + 定长操作码的全部理由,会在 4.4.2正式登场。“浪费空间换取时序的确定性”——这是第 2 章”面积换时间”之外,本书的另一条工程取舍主线。

边界

定长操作码 ≠ 定长指令字。 再强调一次这对名词(4.1.2 已辨析):定长操作码说的是 OP 字段,定长指令字说的是整条指令。统考题里”指令字长固定、操作码可扩展”是最常见的组合,一点也不矛盾。

是上界,不是实际条数。 时”最多 16 条指令”,题目问”最多”就答 16,问”至少需要几位”才用 。问”最多”和问”至少”的答案不是同一个数,读题时圈出来。

里的 要数清楚。 若题目说”除已有 12 条外还需保留 2 条备用”,;若说”其中 3 条是零地址指令”,那 仍是指令总数——零地址指令一样要占一个操作码编码。

操作码全 1 或全 0 有时被保留。 若题目明说”操作码 1111 留作扩展窗口”,可用编码就是 条。这是 4.1.4 的引子,此处只需记住:题目一提”保留”,容量就要减。

对照速查

已知求公式
操作码 位最多几条指令
指令 条至少几位操作码
、、 个等长地址每个地址字段位数
地址字段 位(寄存器号)最多几个通用寄存器
地址字段 位(主存直接地址)直接寻址范围 个单元
判断对错
定长操作码的位置固定在指令最高位✅
定长操作码译码只需一级组合逻辑✅
定长操作码必然浪费编码空间✅(按最坏情况定位数)
定长操作码要求指令字长固定❌
位操作码至少能编 条指令❌(是最多)
零地址指令不占用操作码编码❌
定长操作码的优点是代码密度高❌(反了,密度低)

考点

  • 定长操作码:位数固定、位置固定(最高 位)
  • 位最多 条指令; 条指令至少需 位
  • 地址字段位数 ,进而定寄存器个数或直接寻址范围
  • 缺点:操作码位数被指令总数绑架,扩展一条指令可能要牺牲全部指令的地址位
  • 优点全在时序:一级译码、字段位置固定(可提前读寄存器)、PC 增量恒定 → 流水线友好
  • 「浪费空间换时序确定性」,是 RISC 选择定长格式的根本理由

链接