# 4.1 指令格式 ## 一、指令的基本格式 ### 1.1 指令的组成 **指令 = 操作码 + 地址码** **操作码(Opcode)**: - 指明指令的操作类型 - 如:加、减、乘、除、传送、跳转等 **地址码(Address)**: - 指明操作数的地址 - 可以是寄存器号、内存地址、立即数等 ### 1.2 指令格式 ``` | 操作码 | 地址码 | |--------|--------| ``` **指令长度**: - 定长指令:所有指令长度相同 - 变长指令:指令长度可变 --- ## 二、操作码 ### 2.1 定长操作码 **特点**: - 操作码位数固定 - 译码简单 - 指令条数受限 **表示**: - n位操作码,最多2^n条指令 ### 2.2 扩展操作码 **特点**: - 操作码位数可变 - 短操作码留空给长操作码扩展 - 增加指令条数 **方法**: - 短操作码用完后,用特定编码扩展 - 如:1111表示扩展,后面跟更多位 **例子(16位指令)**: ``` 4位操作码 + 12位地址码: 0000 ~ 1110:15条三地址指令 1111 + 4位 + 8位地址码: 1111 0000 ~ 1111 1110:15条二地址指令 1111 1111 + 4位 + 4位地址码: ... ``` --- ## 三、地址码 ### 3.1 零地址指令 **格式**: ``` | 操作码 | ``` **特点**: - 无地址码 - 操作数隐含 **例子**: - NOP:空操作 - HALT:停机 - RET:返回(地址在堆栈中) - 堆栈运算(操作数在栈顶) ### 3.2 一地址指令 **格式**: ``` | 操作码 | A1 | ``` **特点**: - 一个操作数地址 - 另一个操作数隐含(如ACC) **例子**: ``` ADD A:ACC + [A] -> ACC INC A:[A] + 1 -> [A] ``` ### 3.3 二地址指令 **格式**: ``` | 操作码 | A1 | A2 | ``` **特点**: - 两个操作数地址 - 结果存放到其中一个地址 **例子**: ``` ADD A, B:[A] + [B] -> [A] MOV A, B:[B] -> [A] ``` ### 3.4 三地址指令 **格式**: ``` | 操作码 | A1 | A2 | A3 | ``` **特点**: - 两个源操作数地址 - 一个目的操作数地址 **例子**: ``` ADD A, B, C:[A] + [B] -> [C] ``` ### 3.5 四地址指令 **格式**: ``` | 操作码 | A1 | A2 | A3 | A4 | ``` **特点**: - 两个源操作数地址 - 一个目的操作数地址 - 下一条指令地址 **例子**: ``` ADD A, B, C, D:[A] + [B] -> [C],下条指令地址D ``` ### 3.6 地址码比较 | 类型 | 地址数 | 优点 | 缺点 | |-----|--------|------|------| | 零地址 | 0 | 指令短 | 功能受限 | | 一地址 | 1 | 较短 | 需要ACC | | 二地址 | 2 | 常用 | 覆盖源操作数 | | 三地址 | 3 | 不覆盖 | 指令长 | | 四地址 | 4 | 显式跳转 | 指令太长 | --- ## 四、寻址方式 ### 4.1 寻址方式的概念 **寻址方式**: - 确定操作数地址的方法 - 指令中如何表示操作数位置 ### 4.2 常见寻址方式 **隐含寻址**: - 操作数地址隐含在指令中 - 如:ACC、堆栈 **立即寻址**: - 操作数直接在指令中 - 如:ADD #5 - 速度快,但范围受限 **直接寻址**: - 指令中给出操作数的有效地址 - 如:ADD 1000 - 地址范围受限 **间接寻址**: - 指令中给出操作数地址的地址 - 如:ADD @1000 - 扩大寻址范围,但速度慢 **寄存器寻址**: - 操作数在寄存器中 - 如:ADD R1 - 速度快 **寄存器间接寻址**: - 寄存器中存放操作数地址 - 如:ADD (R1) - 灵活 **基址寻址**: - 有效地址 = 基址寄存器 + 偏移量 - 如:ADD 100(R1) - 用于程序重定位 **变址寻址**: - 有效地址 = 变址寄存器 + 偏移量 - 如:ADD 100(R1) - 用于数组访问 **相对寻址**: - 有效地址 = PC + 偏移量 - 如:ADD 100(PC) - 用于转移指令 **堆栈寻址**: - 操作数在堆栈中 - 如:PUSH、POP - 隐含寻址 ### 4.3 寻址方式的表示 **操作码隐含**: - 不同操作码对应不同寻址方式 **地址码中的寻址方式位**: - 地址码高位表示寻址方式 - 如:2位寻址方式位,00=直接,01=间接,... --- ## 五、指令字长 ### 5.1 指令字长的决定因素 **操作码长度** **地址码长度** **地址个数** ### 5.2 定长指令字 **特点**: - 所有指令长度相同 - 取指简单 - 译码简单 **例子**: - RISC处理器常用32位定长指令 ### 5.3 变长指令字 **特点**: - 指令长度可变 - 节省空间 - 取指复杂 **例子**: - x86处理器,1-15字节变长指令 --- ## 六、考研重点 1. **指令的基本格式**: - 操作码 - 地址码 2. **操作码**: - 定长操作码 - 扩展操作码 3. **地址码**: - 零地址 - 一地址 - 二地址 - 三地址 - 四地址 4. **寻址方式**: - 隐含寻址 - 立即寻址 - 直接寻址 - 间接寻址 - 寄存器寻址 - 寄存器间接寻址 - 基址寻址 - 变址寻址 - 相对寻址 - 堆栈寻址 5. **指令字长** --- *下一节:4.2 寻址方式*