指令是 CPU 执行操作的最小单位。指令格式定义了指令的二进制编码方式,包括操作码和地址码两大部分。指令格式直接影响 CPU 的设计复杂度和程序的执行效率。
| 操作码 OP | 地址码 A1 | 地址码 A2 | ... | 地址码 An |
OP A1 A2 A3 含义:A1 ← (A2) OP (A3) 例:ADD R1, R2, R3 → R1 ← R2 + R3
OP A1 A2 含义:A1 ← (A1) OP (A2) 例:ADD R1, R2 → R1 ← R1 + R2
OP A1 含义(单操作数):A1 ← OP(A1) 例:INC R1 → R1 ← R1 + 1 例:NOT R1 → R1 ← ~R1 含义(隐含操作数):ACC ← (ACC) OP (A1) 例:ADD [1000] → ACC ← ACC + M[1000]
OP 含义:无操作数或隐含操作数 例:NOP(空操作) 例:RET(返回,隐含从栈取返回地址) 例:PUSH/POP(隐含栈指针操作)
所有指令的操作码长度相同 例:8 位操作码 → 最多 256 条指令
操作码长度可变,通过前缀区分 例: 0000 xxxx xxxx xxxx → 4 条指令(0 地址) 001 xxx xxx xxxx xxxx → 16 条指令(1 地址) 01 xxx xxx xxx xxx xxxx → ...(2 地址) 10 ... → ...(3 地址)
指令字长 16 位,每地址 4 位: 三地址:3×4 = 12 位地址码,操作码 4 位 → 2^4 = 16 条 取 4 条 → 操作码 0000~0011 二地址:2×4 = 8 位地址码,操作码 8 位 从三地址操作码扩展:0000xxxx → 16 个编码 取 12 条 → 操作码 00000000~00001011 一地址:1×4 = 4 位地址码,操作码 12 位 从二地址操作码扩展:00000000xxxx → 16 个编码 取 64 条 → 需要 4 个二地址前缀 × 16 = 64 零地址:无地址码,操作码 16 位 从一地址操作码扩展:000000000000xxxx → 16 个编码 取 128 条 → 需要 8 个一地址前缀 × 16 = 128
| 前缀(0-4B) | 操作码(1-3B) | ModR/M(0-1B) | SIB(0-1B) | 偏移(0-4B) | 立即数(0-4B) |
| opcode(6) | rs(5) | rt(5) | rd(5) | shamt(5) | funct(6) |
| opcode(6) | rs(5) | rt(5) | immediate(16) |
| opcode(6) | address(26) |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。