Files
obsidian/计算机组成原理/学习笔记/07_指令系统_补充版.md

433 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第7章 指令系统
> 📖 本章介绍机器指令系统的分类、寻址方式和指令格式设计。
> 🎯 重点理解寻址方式和指令格式设计
>
> **考试范围**7.1~7.4.1、7.5节不考,但 RISC vs CISC 对比属于常考内容。
> **复习重点**例题7.1~7.7课后习题7.1~7.8、7.16~7.19
> **本章核心考点**:寻址方式分析(有效地址+操作数、扩展操作码设计、CISC vs RISC、指令格式分析
---
## 📋 本章目录
- [[#7.1 机器指令]]
- [[#7.2 操作数类型和操作类型]]
- [[#7.3 寻址方式]]
- [[#7.4 指令格式]]
- [[#7.5 RISC技术]]
- [[#本章小结]]
- [[#例题与解析]]
- [[#真题与作业精选]]
---
## 7.1 机器指令
### 7.1.1 指令的一般格式
> [!info] 定义
> 机器指令是计算机能识别和执行的基本命令,由操作码和地址码组成。
```mermaid
graph LR
subgraph "指令格式"
OP[操作码] --> ADDR[地址码]
end
```
#### 操作码
**功能**:指明指令要完成的操作
**长度**
- **固定长度**:便于硬件设计,译码快
- **可变长度**:节省空间,译码复杂
操作码就像菜谱上的"动作",告诉厨师要做什么(炒、煮、蒸、烤)。固定长度每个动作都用相同长度的编码,可变长度常用动作用短编码不常用动作用长编码。
#### 地址码
**功能**:指出操作数地址、结果地址、下条指令地址
**格式分类**
```mermaid
graph TB
A[指令格式] --> B[四地址指令]
A --> C[三地址指令]
A --> D[二地址指令]
A --> E[一地址指令]
A --> F[零地址指令]
```
| 格式 | 地址字段 | 操作 | 访存次数 |
|------|----------|------|----------|
| 四地址 | A1, A2, A3, A4 | (A1)OP(A2)→A3 | 4次 |
| 三地址 | A1, A2, A3 | (A1)OP(A2)→A3 | 4次 |
| 二地址 | A1, A2 | (A1)OP(A2)→A1 | 4次 |
| 一地址 | A1 | ACCOP(A1)→ACC | 2次 |
| 零地址 | 无 | 栈操作 | 0-2次 |
地址码就像菜谱上的"材料"四地址指令把A1和A2的数相加结果存到A3下条指令在A4三地址指令把A1和A2的数相加结果存到A3二地址指令把A1和A2的数相加结果存到A1一地址指令把ACC和A1的数相加结果存到ACC零地址指令弹出栈顶两个数相加结果压入栈。
### 7.1.2 扩展操作码技术
> [!info] 目的
> 在指令字长固定的情况下,增加指令种类。
**原理**:操作码长度随地址数减少而增加
```mermaid
graph TB
subgraph "扩展操作码示例16位指令"
A["4位操作码<br/>15条三地址指令"] --> B["8位操作码<br/>15条二地址指令"]
B --> C["12位操作码<br/>15条一地址指令"]
C --> D["16位操作码<br/>16条零地址指令"]
end
```
**设计原则**
- 使用频度高的指令用短操作码
- 使用频度低的指令用长操作码
- 为扩展留有余地
扩展操作码就像邮政编码系统短操作码常用指令用短编码节省空间长操作码不常用指令用长编码种类多。4位操作码15条三地址指令1111保留8位操作码15条二地址指令12位操作码15条一地址指令16位操作码16条零地址指令。
> [!tip] 考试提示
> 扩展操作码设计是期中/期末的高频考点。核心思路先确定操作码需要的位数操作种类数取log2向上取整再用剩余位作为地址码。如果要扩大寻址范围可以考虑间接寻址用间接寻址可以把有效地址扩展到整个存储空间
---
## 7.2 操作数类型和操作类型
### 7.2.1 操作数类型
| 类型 | 说明 | 示例 |
|------|------|------|
| 地址 | 无符号整数 | 指向存储器位置 |
| 数值 | 定点数、浮点数 | 算术运算 |
| 字符 | ASCII码 | 文本处理 |
| 逻辑数 | 逻辑运算 | 位操作 |
地址是无符号整数指向存储器位置用于寻址操作数值是定点数或浮点数用于算术运算字符是ASCII码用于文本处理逻辑数用于逻辑运算和位操作。
### 7.2.2 操作类型
**数据传送**LOAD从存储器取数据到寄存器、STORE从寄存器存数据到存储器
**算术逻辑运算**ADD加法、SUB减法、AND逻辑与、OR逻辑或
**移位操作**SHL逻辑左移、SHR逻辑右移、SAL算术左移、SAR算术右移
**转移操作**JMP无条件转移、JZ条件转移、CALL调用子程序、RET返回
**输入输出**IN从I/O端口读数据、OUT向I/O端口写数据
数据传送像从仓库取材料到工作台;算术逻辑运算像把两个数加起来或相减;移位操作像所有位向左移动;转移操作像跳转到指定位置;输入输出像从外部设备读数据。
---
## 7.3 寻址方式
> [!tip] 考试提示
> 寻址方式分析是本章最高频的考点几乎每年都会出题。关键要会算有效地址EA和操作数并能判断每种寻址方式需要访存几次。
### 7.3.1 指令寻址
**顺序寻址**PC = PC + 1按顺序执行指令
**跳跃寻址**PC = 跳转地址,跳转到指定地址执行
指令寻址像找下一条指令的方式:顺序寻址按顺序执行下一条指令,跳跃寻址跳转到指定地址执行。
### 7.3.2 数据寻址
**立即寻址**操作数在指令中比如MOV A, #5把5存到A。东西就在你手里速度快不需要访问内存只能用于常数。
**直接寻址**操作数地址在指令中比如MOV A, [1000]把地址1000的数存到A。东西在仓库的某个位置简单直接访问地址范围有限。
**间接寻址**操作数地址的地址在指令中比如MOV A, [[1000]]。仓库里有一张纸条告诉你东西在哪里,灵活可以动态改变地址,但速度慢需要多次访问内存。
**寄存器寻址**操作数在寄存器中比如MOV A, R1把R1的数存到A。东西就在你手边的盒子里速度最快不需要访问内存寄存器数量有限。
**寄存器间接寻址**操作数地址在寄存器中比如MOV A, [R1]。盒子里有一张纸条告诉你东西在哪里,灵活可以动态改变地址,需要访问内存。
**基址寻址**:有效地址 EA = A + (BR)其中BR是基址寄存器内容不变A是形式地址可变。东西在仓库的某个区域用区域号+偏移量定位,适合程序重定位。
**变址寻址**:有效地址 EA = A + (IX)其中IX是变址寄存器内容可变A是形式地址不变。东西在仓库的某个位置用变址+偏移量定位,适合数组访问。
> [!important] 基址 vs 变址的区别(考试常考)
> - **基址寻址**BR基址寄存器内容固定形式地址A可变。用于程序重定位。
> - **变址寻址**IX变址寄存器内容可变形式地址A固定。用于数组遍历等。
>
> 例题:变址寄存器(IX)=0004HPC=0003H。
> - 变址寻址EA = A + (IX) = A + 0004HA不变IX可变。
> - 基址寻址EA = A + (BR) = A + (BR)BR不变A可变。
**相对寻址**:操作数地址 = PC + 偏移量比如JMP +10跳转到PC+10的位置。东西在当前位置的某个偏移位置适合相对跳转。
> [!tip] 访存次数分析(复习资料原题)
> 不同寻址方式的访存次数是考试重点:
> - `ADD 04H, R0`直接寻址3次访存取指2次 + 取操作数1次
> - `ADD (04H), R0`间接寻址4次访存取指2次 + 取数1次 + 写回1次
>
> 规律:每多一层间接,就多一次访存。考试中要仔细区分直接寻址和间接寻址。
---
## 7.4 指令格式
### 7.4.1 指令格式设计原则
**设计原则**
1. **规整性**:指令长度对齐,便于译码
2. **高效性**:常用指令短,不常用指令长
3. **兼容性**:保持向后兼容
4. **扩展性**:留有扩展空间
指令格式设计就像设计邮票:规整性指令长度对齐便于译码,高效性常用指令短不常用指令长,兼容性新处理器能运行旧程序,扩展性保留一些编码用于未来扩展。
---
## 7.5 RISC技术
> [!tip] 考试提示
> CISC vs RISC 对比是本章的经典考点,经常以简答题或对比题的形式出现。要记住两者在指令数量、指令长度、控制方式、流水线支持等方面的区别。
### 7.5.1 RISC与CISC对比
| 特性 | RISC | CISC |
|------|------|------|
| 指令数量 | 少(几十条) | 多(几百条) |
| 指令长度 | 固定 | 可变 |
| 寻址方式 | 简单(少) | 复杂(多) |
| 指令周期 | 单周期 | 多周期 |
| 流水线 | 支持(友好) | 部分支持 |
| 编译器 | 复杂 | 简单 |
| 控制方式 | 硬布线控制 | 微程序控制 |
| 代表 | ARM、MIPS | x86 |
RISC精简指令集指令少简单速度快容易实现流水线但编译器复杂代码密度低CISC复杂指令集指令多复杂功能强编译器简单代码密度高但难以实现流水线速度慢。
ARM处理器手机、MIPS处理器嵌入式是RISCx86处理器个人电脑是CISC。
> 记忆口诀RISC——少而精、快而简、硬布线、流水线CISC——多而全、慢而杂、微程序、编译简。
### 7.5.2 RISC特点
**主要特点**
1. **指令数量少**:通常只有几十条指令
2. **指令长度固定**:所有指令长度相同
3. **寻址方式简单**:只有几种简单的寻址方式
4. **单周期执行**:大多数指令在一个周期内完成
5. **流水线支持**:容易实现流水线
6. **大量寄存器**通常有32个以上寄存器
7. **硬布线控制**:用硬布线实现控制单元
指令数量少容易实现速度快但功能有限;指令长度固定译码简单容易实现流水线但代码密度低;寻址方式简单译码简单速度快但灵活性差;单周期执行速度快容易实现流水线但某些复杂指令需要多个周期;流水线支持提高吞吐率但需要处理流水线冲突;大量寄存器减少访存次数速度快但增加硬件成本;硬布线控制速度快但不灵活难以修改。
---
## 📝 本章小结
### 核心概念
1. **指令格式**:操作码 + 地址码
2. **寻址方式**:立即寻址、直接寻址、间接寻址等
3. **指令类型**:数据传送、算术逻辑、移位、转移、输入输出
4. **RISC技术**:精简指令集,速度快
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| 指令 | Instruction | 机器指令 |
| 操作码 | Operation Code | 指明操作类型 |
| 地址码 | Address Code | 指明操作数地址 |
| 寻址方式 | Addressing Mode | 找到操作数的方式 |
| 有效地址 | Effective Address | 实际访问的存储器地址 |
| RISC | Reduced Instruction Set Computer | 精简指令集计算机 |
| CISC | Complex Instruction Set Computer | 复杂指令集计算机 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 指令格式图
> 2. 各种寻址方式图
> 3. 扩展操作码图
> 4. RISC与CISC对比图
---
## 🧪 例题与解析
### 例题1指令格式设计
**题目**设计一个16位指令系统要求支持15条三地址指令、15条二地址指令、15条一地址指令、16条零地址指令。
**答案**
三地址指令4位操作码1111保留3个×4位=12位地址码指令数2⁴-1=15条。
二地址指令8位操作码1111xxxxxxxx≠11112个×4位=8位地址码指令数15条。
一地址指令12位操作码1111xxxxxxxxxxxxxxxx≠111111111个×4位=4位地址码指令数15条。
零地址指令16位操作码1111xxxxxxxxxxxx0位地址码指令数16条。
### 例题2寻址方式分析
**题目**:分析以下指令的寻址方式:
1. MOV A, #5
2. MOV A, [1000]
3. MOV A, R1
4. MOV A, [R1]
5. MOV A, [BASE + 100]
**答案**
1. MOV A, #5立即寻址操作数5在指令中速度快不需要访问内存。
2. MOV A, [1000]直接寻址操作数在地址1000简单直接访问。
3. MOV A, R1寄存器寻址操作数在寄存器R1速度最快不需要访问内存。
4. MOV A, [R1]寄存器间接寻址R1指向的地址的数灵活可以动态改变地址。
5. MOV A, [BASE + 100]基址寻址BASE+100的数适合程序重定位。
### 例题3RISC与CISC比较
**题目**比较RISC和CISC的特点。
**答案**
RISC指令数量少几十条、指令长度固定、寻址方式简单、单周期执行、支持流水线、编译器复杂、寄存器多、硬布线控制CISC指令数量多几百条、指令长度可变、寻址方式复杂、多周期执行、部分支持流水线、编译器简单、寄存器少、微程序控制。
RISC像精简工具工具少简单速度快容易使用效率高但功能有限CISC像复杂工具工具多复杂功能强功能强大使用方便但使用复杂效率低。
### 例题4扩展操作码设计
**题目**设计一个12位指令系统要求支持15条二地址指令、15条一地址指令、16条零地址指令。
**答案**
二地址指令4位操作码1111保留2个×4位=8位地址码指令数2⁴-1=15条。
一地址指令8位操作码1111xxxxxxxx≠11111个×4位=4位地址码指令数15条。
零地址指令12位操作码1111xxxxxxxx0位地址码指令数16条。
### 例题5寻址方式计算
**题目**某计算机有16位地址线8位数据线采用直接寻址方式求寻址范围。
**答案**
16位地址线可以表示2¹⁶=65536个地址即有65536个存储单元。8位数据线表示每个单元存8位数据1字节总容量65536×8位=64KB。
这就像一个仓库有65536个格子每个格子能放8个鸡蛋总容量就是64KB。
---
## 📖 真题与作业精选
> 以下题目来自期中/期末考试、课后作业及复习资料,是本章最常考的题型。
### 真题1寻址方式求有效地址复习资料原题
**题目**:已知变址寄存器(IX)=0004HPC=0003H分别说明变址寻址和基址寻址的有效地址计算方式并指出两者的关键区别。
**答**
- 变址寻址EA = A + (IX) = A + 0004H。这里形式地址A固定不变变址寄存器IX的内容可以改变适合用于数组遍历——每次循环只需修改IX即可访问数组的不同元素。
- 基址寻址EA = A + (BR)。这里基址寄存器BR的内容固定不变形式地址A可以改变适合程序重定位——整个程序加载到不同内存区域时只需修改BR。
**关键区别**基址时BR不变A可变程序搬家只需改BR变址时A不变IX可变遍历数组只需改IX
### 真题2指令访存次数复习资料原题
**题目**:分析以下指令各需几次访存:
1. `ADD 04H, R0`
2. `ADD (04H), R0`
**答**
1. `ADD 04H, R0`直接寻址3次访存。
- 取指令需要2次访存PC先指向指令地址取指令后PC+1若指令跨存储字边界则需取两次
- 取操作数需要1次访存直接从地址04H读取操作数
2. `ADD (04H), R0`间接寻址4次访存。
- 取指令需要2次访存
- 间接寻址需要先从04H取出真正的地址再从该地址取操作数共2次访存
- 注意:如果该指令还需要写回结果到内存,访存次数还会增加
> 规律总结:直接寻址比间接寻址少一次访存。考试中要注意区分直接寻址的`04H`和间接寻址的`(04H)`——括号表示"间接"。
### 真题3扩展操作码设计期中原题
**题目**某指令系统共有78种操作指令字长为16位。问
1. 操作码至少需要多少位?
2. 剩余多少位可用于地址码?
3. 若要将寻址范围扩大到2^16可以采用什么方法
**答**
1. 78种操作操作码需要的位数 = ceil(log2(78)) = 7位因为2^6=64<782^7=128>=78
2. 地址码位数 = 16 - 7 = 9位。
3. 9位地址码只能寻址2^9=512个单元远小于2^16。可以采用**间接寻址**来扩大寻址范围——指令中的9位地址指向一个存储单元该单元中存放的才是16位的有效地址从而实现对2^16=65536个单元的寻址。
> [!tip] 解题技巧
> 扩展操作码设计题的关键步骤①算操作码位数log2向上取整②用指令字长减去操作码位数得到地址码位数③计算寻址范围④如果寻址范围不够考虑间接寻址扩展。这是期中考试曾经考过的原题务必掌握。
### 真题4CISC vs RISC 对比(考试高频简答题)
**题目**从指令数量、指令长度、寻址方式、控制器实现、指令周期和流水线支持等方面比较CISC和RISC。
**答**
| 比较项目 | CISC | RISC |
|----------|------|------|
| 指令数量 | 多(几百条),功能强 | 少(几十条),精简 |
| 指令长度 | 可变,不固定 | 固定长度 |
| 寻址方式 | 多种,灵活复杂 | 少数几种,简单 |
| 控制方式 | 微程序控制 | 硬布线控制 |
| 指令周期 | 多周期,时间长 | 单周期(多数),时间短 |
| 流水线 | 部分支持,难以高效流水 | 天然友好,易于流水线实现 |
| 编译器 | 简单,硬件做更多事 | 复杂,编译器做优化 |
| 编程 | 编程方便,指令表达力强 | 编程相对麻烦 |
| 代表 | x86PC处理器 | ARM手机、MIPS嵌入式 |
CISC的设计哲学是"硬件做更多事"让编程更方便RISC的设计哲学是"软件做更多事"让硬件更简单高效。现代处理器中x86内部其实也采用了类似RISC的微操作来提高效率。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**指令 = 操作码 + 地址码**。操作码指明做什么,地址码指明操作数在哪。
**地址码个数**四地址A1 OP A2 -> A3下条在A4、三地址->A3、二地址->A1、一地址ACC OP A1 -> ACC、零地址栈操作
**扩展操作码**:地址数越少,操作码越长,指令种类越多。常用指令用短操作码,不常用指令用长操作码。操作码位数 = ceil(log2(操作种类数))。
**七种寻址方式**立即数在指令里最快、直接地址在指令里、间接地址指向的位置存着真正地址多一次访存、寄存器数在寄存器最快之一、寄存器间接寄存器里存地址、基址EA=A+(BR)BR不变A可变适合重定位、变址EA=A+(IX)A不变IX可变适合数组、相对PC+偏移,适合跳转)。
**RISC vs CISC**RISC指令少、固定长度、单周期、流水线友好、硬布线控制ARM/MIPSCISC指令多、可变长度、多周期、微程序控制x86
**指令格式设计**:规整性(长度对齐)、高效性(常用指令短)、兼容性(向后兼容)、扩展性(留余地)。
> **本章常见考题类型**
> 1. 寻址方式识别与有效地址计算(必考)
> 2. 扩展操作码设计(期中考过原题)
> 3. 访存次数分析(注意直接/间接寻址的区别)
> 4. CISC vs RISC对比简答题高频考点
> 5. 指令格式分析与设计
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[06_运算方法]] - 上一章
- [[08_CPU结构与功能]] - 下一章
- [[09_控制单元功能]] - 控制单元相关内容
---
*本章难度:⭐⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐⭐ 重要*
*考试占比:期中/期末约10~15分以寻址方式和扩展操作码设计为主*