Lecture 13:知识 - 指令格式
Chinese-language Computer Science 408 note: Lecture 13:知识 - 指令格式. Original source available where applicable.
On this page
This note is currently available in Chinese. The original wording, formulas and diagrams are preserved to avoid an unverified technical translation.
描述:指令格式规定二进制字段如何表达操作与操作数。总长度固定时,地址数越多,留给每个地址的位数越少;扩展操作码以更长的码换取更多较少地址指令的编码空间。
4.1 地址数与基本指令格式
一条机器指令是有意义的二进制语句,通常由操作码 OP和若干地址码 A构成。
| 地址数 | 格式与语义 | 典型场景 |
|---|---|---|
| 零地址 | 仅 OP;或两个操作数隐含在栈顶/次栈顶,结果压栈 | NOP、停机、关中断、栈式后缀表达式 |
| 一地址 | OP A1,可为单操作数;或 $(ACC)\ OP\ (A1)\to ACC$ |
加 1、取反、累加器型二元操作 |
| 二地址 | OP A1,A2,$(A1)\ OP\ (A2)\to A1$ |
算术、逻辑运算,A1 常为目的数 |
| 三地址 | OP A1,A2,A3,$(A1)\ OP\ (A2)\to A3$ |
两源一目的,减少中间结果覆盖 |
| 四地址 | 三地址结果外加 A4 为下一条指令地址 | 可显式改变 PC,现代常由转移格式替代 |
- 零地址不等于“不操作数据”:栈机可隐含读两个栈顶操作数;一地址也可能是二元操作,只是另一操作数隐含在 ACC。
- $n$ 位无符号地址码在直接寻址时可表示 $2^n$ 个地址。总指令长度固定时,增加地址字段数会占用更多编码位;若操作码等其他字段位宽也固定,就必须缩小每个地址字段,直接寻址范围随之缩小。若允许缩短操作码,取舍则可能是指令种类减少,不能一概断言寻址范围必降。
4.2 指令字长、存储字长和机器字长
| 名称 | 含义 | 关系 |
|---|---|---|
| 指令字长 | 一条指令的总二进制位数 | 决定取指可能需要几次访存 |
| 存储字长 | 一个存储单元的位数 | 通常与 MDR 位数一致 |
| 机器字长 | CPU 一次能直接处理的整数数据位数 | 常与整数 ALU、通用寄存器宽度一致;外部数据总线宽度不一定相同 |
- 若机器字长=存储字长=16 bit,则一条双字长指令通常需两次主存读出;半字长、单字长、双字长均指相对机器字长的倍数。
- 在教材常见的定长、整字取指模型中,IR 通常能容纳一条完整指令;变长指令处理器也可能使用预取缓冲、多个内部寄存器分段保存指令,因此不能脱离具体实现断言 IR 位数必等于最长指令。浮点寄存器位数则由其数据格式决定,二者都不必等于机器字长。
- 定长指令字:同 ISA 内所有指令总长度相同;变长指令字:不同指令总长度可不同。它与“定长/变长操作码”是两个独立维度。
4.3 定长与扩展操作码
4.3.1 定长操作码
所有指令 OP 字段位数相同。$n$ 位 OP 最多表示 $2^n$ 条指令。优点是译码电路简单、识别快;缺点是指令种类增加时必须固定占用更多位,压缩地址码空间。
4.3.2 扩展操作码
扩展操作码通常采用“定长指令字 + 可变长操作码”:地址数越少,其空出的字段越可继续作为 OP 扩展位,使有限指令字长能容纳更多指令类型。
| 设计规则 | 含义 |
|---|---|
| 前缀码规则 | 短操作码不能是任何长操作码的前缀,否则译码无法判断何时结束 |
| 唯一性 | 所有完整操作码不得重复 |
| 频率优先 | 高频指令宜分配短操作码,降低平均译码/分析开销 |
| 分层保留 | 较长地址格式保留部分 OP 码作为“继续扩展”前缀,剩余码给下一层较少地址格式 |
例如 16 位指令、每地址码 4 位:三地址格式只有 4 位 OP。若把 1111 保留作扩展前缀,则三地址指令有 $2^4-1=15$ 条;在 1111 后继续使用下一组 4 位扩展,可编码二地址指令,同时还应继续保留一个前缀供一地址、零地址指令使用。计算时每层都要先扣除已保留的扩展码。
- 扩展操作码的收益是在固定指令字长下容纳更多指令种类;代价是操作码位置/长度不再完全统一,译码与控制逻辑更复杂。它优化的是编码空间分配,不保证每条指令执行更快。
题型:#扩展操作码设计
第一部分:通用步骤
- 画出固定总长度及每类地址数占用的地址字段,余下位置就是该层可用 OP 位。
- 从地址最多的指令开始,按题目给的条数依次分配普通 OP;该层若还要设计更少地址指令,预留若干 OP 作为扩展前缀。
- 将“当前层第 $m+1$ 个未用编码”视为下一层的前缀,重复分配;每层都检查短码不是长码前缀。
- 最后核对全部指令条数、前缀互斥性和总字长,不能只计算 $2^n$ 而忘记保留码。
第二部分:易错点
- 不要将“变长操作码”误当“变长指令字”。扩展操作码正是指令总长固定、OP 长度可变的常见组合。
- 不是每个剩余位都能自由给当前层:若某编码的后续位已用于扩展,它不能再作为短指令完整操作码。
- 题中地址字段可代表主存地址、寄存器号或其他编码;地址数只描述字段个数,不能自动等同于访存次数。
源 PDF 两组编码例题
**逐层保留示例。**16 位定长指令、每个地址码 4 位时,可分配 15 条三地址、15 条二地址、15 条一地址和 16 条零地址指令:三地址层把 1111 留作扩展前缀;二地址层再把 1111 1111 留出;一地址层再把 1111 1111 1111 留出;最后 4 位从 0000 到 1111 可形成 16 条零地址指令。每一层之所以是 15 而非 16,都是因为还要给下一层保留一个前缀。
**另一组分配示例。**原页还给出 15 条三地址、12 条二地址、62 条一地址和 32 条零地址的组合。三地址仍使用首 4 位的 0000~1110,把 1111 留给扩展;二地址在其后的 4 位使用 0000~1011,剩下 1100~1111 四个前缀。将其中 1100~1110 各再扩 4 位,可得 $3\times16=48$ 条一地址;在 1111 分支上再分给一地址 14 个码(0000~1101),共 $48+14=62$ 条。剩余 1110、1111 两个更长前缀各再扩 4 位,形成 $2\times16=32$ 条零地址。各层数量不是独立的 $2^n$,而由前一层留下的前缀数决定。
**2022 年真题。**16 位定长指令,地址码 6 位,只有二地址、一地址和零地址三种格式。二地址指令需要 4 位初始操作码;共有 16 个前缀,其中 12 个分配给二地址指令,剩 4 个前缀可扩展为 $4\times2^6=256$ 个 10 位操作码。一地址指令用了 254 个,还剩 2 个 10 位前缀;每个再接最后 6 位可产生 64 条零地址指令,所以零地址指令最多为:
$$2\times2^6=128\text{ 条}$$
4.4 指令功能分类
| 类别 | 示例 |
|---|---|
| 数据传送 | LOAD、STORE |
| 算术/逻辑 | 加减乘除、与或非、比较 |
| 移位 | 逻辑移位、算术移位 |
| 转移 | JMP 无条件转移、JZ 条件转移 |
| 输入输出 | I/O 读写、控制 |
- 分类看指令主要语义,而不是仅看有几个地址字段。例如
JZ可只有一个目标地址却属于控制转移,不是普通一地址算术指令。
4.5 指令/微操作记号的阅读
原页末图用 R[i] 表示第 $i$ 个通用寄存器,用 PC、MDR 表示专用寄存器,用 M[addr] 表示地址 addr 处的主存单元;箭头左侧是来源,右侧是写入目的地。这里的记号须结合上下文判断是位置还是其中的内容:
| 写法 | 读法 |
|---|---|
R[6] × R[3] → R[2] |
两个寄存器中的数相乘,结果写入 R[2] |
R[6] + 10 → PC、MDR → PC |
结果或源寄存器内容写入 PC |
R[6] → M[10086] |
将寄存器内容写入主存地址 10086 |
R[3] << 2 → M[R[6]] |
左移后的值写入 R[6] 内容所指的主存地址,属于寄存器间接访问 |
M[PC+10] → MDR |
读取 PC+10 所指主存单元的内容,送入 MDR |
R[6] 和 M[R[6]] 不能混为一谈:前者读寄存器,后者先用寄存器内容形成地址,再读/写主存。该图是阅读教材微操作的记号示例,不表示所有 ISA 的汇编语法都相同。
相关知识
- 科目导航:计算机组成原理导航
- 阅读顺序:上一篇:寻址方式 · 下一篇:数据对齐和大小端存放
4.6 本节复盘
- 零到四地址指令的差别在显式地址字段数;零/一地址指令可通过栈顶、ACC 等隐含操作数完成真实运算。
- 指令字长、存储字长、机器字长分别描述指令、单元和 CPU 整数通路,彼此不必相等;定长指令字与定长操作码也不是同一概念。
- 扩展操作码以地址字段减少换取 OP 扩展位,必须遵守前缀码和唯一性规则,并从多地址指令逐层保留/分配。
- 计算扩展码时最常漏掉为下一层保留的前缀;功能分类、地址数和实际访存次数需分别判断。