Appearance
指令格式与操作类型
考情分析
指令格式和操作码扩展是 408 指令系统的基础,常以选择题或大题第一小问出现。零地址指令的使用场景和三地址指令的操作流程要能准确描述。
指令的基本结构
一条指令由两部分组成:
- 操作码:指定操作类型(加法、移位、跳转等),位数决定可以表示的指令条数
- 地址码:指定操作数的来源和结果的去处
按地址码个数分类
三地址指令
含义:
例:ADD R1, R2, R3(R1 + R2 → R3)
- 三个操作数地址均显式指定
- 指令长,但不破坏源操作数
二地址指令
含义:
例:ADD R1, R2(R1 + R2 → R1)
- 最常用的格式,x86 等 CISC 架构广泛使用
- 会破坏源操作数
一地址指令
含义:
例:ADD X(ACC + X → ACC)
- 隐式操作数是累加器,无需在指令中指定
- 早期累加器架构(如 8080)广泛使用
零地址指令
两种情况:
- 无需操作数:
NOP(空操作)、HLT(停机) - 操作数隐含在栈顶:堆栈型机器中,操作数从栈顶自动弹出,结果压回栈顶
例:后缀表达式计算机,ADD 弹出栈顶两个数相加后压回。
按操作类型分类
| 类别 | 典型指令 | 说明 |
|---|---|---|
| 数据传送 | MOV, LOAD, STORE | 寄存器与存储器之间的数据移动 |
| 算术运算 | ADD, SUB, MUL, DIV | 整数/浮点运算 |
| 逻辑运算 | AND, OR, NOT, XOR | 按位逻辑操作 |
| 移位操作 | SHL, SHR, ROL, ROR | 算术/逻辑/循环移位 |
| 转移指令 | JMP, JZ, JNZ, CALL, RET | 改变程序流 |
| 输入输出 | IN, OUT | I/O 操作 |
| 特权指令 | 中断、停机等 | 只能在核心态执行 |
指令格式设计
定长操作码
所有指令的操作码位数相同。
- 简单,便于硬件译码(直接查表)
- 灵活性差,不同类型指令地址码位数一致
变长操作码(扩展操作码)
不同指令的操作码位数不同,短操作码对应地址多的指令,长操作码对应地址少的指令。
详见「指令设计(操作码扩展)」篇。
交互可视化
指令字长
- 单字长指令:一条指令占一个机器字
- 半字长指令:操作简单,压缩码空间
- 双字长指令:操作数需要更多位(如包含立即数或长地址)
注意区分:
- 机器字长:CPU 一次能处理的数据位数(ALU 位宽)
- 指令字长:一条指令的二进制长度
- 存储字长:存储器每个单元的位数
三者可以相同,也可以不同。
考点清单
- 三地址:OP A1, A2, A3(A1 OP A2 → A3)
- 二地址:OP A1, A2(A1 OP A2 → A1,破坏A1)
- 一地址:隐含累加器 ACC
- 零地址:NOP/HLT,或堆栈操作
- 操作码位数
→ 最多表示 条指令 - 机器字长 ≠ 指令字长 ≠ 存储字长,三者独立