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

475 lines
10 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.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次 |
> [!example] 示例
> 四地址指令OP A1 A2 A3 A4
> - (A1) OP (A2) → A3
> - 下条指令地址 = A4
### 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
```
**设计原则**
- 使用频度高的指令用短操作码
- 使用频度低的指令用长操作码
- 为扩展留有余地
---
## 7.2 操作数类型和操作类型
### 7.2.1 操作数类型
| 类型 | 说明 | 示例 |
|------|------|------|
| 地址 | 无符号整数 | 指向存储器位置 |
| 数值 | 定点数、浮点数 | 算术运算 |
| 字符 | ASCII码 | 文本处理 |
| 逻辑数 | 位串 | 逻辑运算 |
### 7.2.2 操作类型
#### 数据传送类
| 指令 | 功能 | 示例 |
|------|------|------|
| MOV | 数据传送 | MOV AX, BX |
| LOAD | 从存储器取数 | LOAD R1, [addr] |
| STORE | 存数到存储器 | STORE [addr], R1 |
| PUSH/POP | 栈操作 | PUSH AX |
#### 算术逻辑类
| 指令 | 功能 | 示例 |
|------|------|------|
| ADD/SUB | 加/减 | ADD AX, BX |
| MUL/DIV | 乘/除 | MUL BX |
| AND/OR/NOT | 逻辑运算 | AND AX, BX |
| CMP | 比较 | CMP AX, BX |
| SHL/SHR | 移位 | SHL AX, 1 |
#### 控制转移类
| 指令 | 功能 | 示例 |
|------|------|------|
| JMP | 无条件跳转 | JMP addr |
| JZ/JNZ | 条件跳转 | JZ addr |
| CALL | 调用子程序 | CALL addr |
| RET | 返回 | RET |
| INT | 中断 | INT 21H |
---
## 7.3 寻址方式
> [!info] 定义
> 寻址方式是指令中如何给出操作数地址或操作数的方式。
### 7.3.1 指令寻址
#### 顺序寻址
```mermaid
graph LR
PC[PC] --> |"PC+1"| NEXT[下一条指令]
```
#### 跳跃寻址
```mermaid
graph LR
PC[PC] --> |"JMP addr"| TARGET[目标指令]
```
### 7.3.2 数据寻址
**指令格式**
```mermaid
graph LR
subgraph "数据寻址格式"
OP[操作码] --> MOD[寻址特征] --> ADDR[形式地址]
end
```
**有效地址**$EA = f(寻址方式, 形式地址)$
#### 常见寻址方式
##### 1. 立即寻址
> [!info] 特点
> 操作数直接在指令中
**格式**OP #立即数
**有效地址**$EA = 指令地址 + 1$(操作数在指令中)
**优点**:速度快,不需要访存
**缺点**:操作数范围受地址字段限制
##### 2. 直接寻址
> [!info] 特点
> 地址字段直接给出操作数地址
**格式**OP A
**有效地址**$EA = A$
**优点**:简单,只需一次访存
**缺点**:寻址范围受地址字段限制
##### 3. 间接寻址
> [!info] 特点
> 地址字段给出的是操作数地址的地址
**格式**OP (A)
**有效地址**$EA = (A)$
**优点**:寻址范围大
**缺点**:多次访存,速度慢
```mermaid
graph LR
A[形式地址A] --> |"第一次访存"| B[地址B]
B --> |"第二次访存"| C[操作数]
```
##### 4. 寄存器寻址
> [!info] 特点
> 操作数在寄存器中
**格式**OP R
**有效地址**$EA = R$
**优点**:速度快,不需要访存
**缺点**:寄存器数量有限
##### 5. 寄存器间接寻址
> [!info] 特点
> 寄存器中存放的是操作数的地址
**格式**OP (R)
**有效地址**$EA = (R)$
**优点**:寻址范围大,只需一次访存
**缺点**:需要一次访存
##### 6. 偏移寻址
###### 基址寻址
**格式**OP A基址寄存器BR
**有效地址**$EA = (BR) + A$
**特点**
- 便于程序重定位
- 基址寄存器内容不变
- 形式地址可变
###### 变址寻址
**格式**OP A变址寄存器IX
**有效地址**$EA = (IX) + A$
**特点**
- 便于数组操作
- 变址寄存器内容可变
- 形式地址不变
> [!example] 数组访问示例
> 访问数组元素:$EA = (IX) + A$
> - A数组首地址
> - IX元素下标
> - 每次IX+1访问下一个元素
###### 相对寻址
**格式**OP A
**有效地址**$EA = (PC) + A$
**特点**
- 程序浮动
- A是相对于PC的偏移量
##### 7. 堆栈寻址
**格式**PUSH/POP 操作数
**有效地址**
- PUSH先SP-1再存数
- POP先取数再SP+1
**特点**后进先出LIFO
#### 寻址方式对比
| 寻址方式 | 有效地址 | 访存次数 | 优点 | 缺点 |
|----------|----------|----------|------|------|
| 立即寻址 | 操作数在指令中 | 0 | 速度快 | 范围小 |
| 直接寻址 | EA=A | 1 | 简单 | 范围小 |
| 间接寻址 | EA=(A) | 2+ | 范围大 | 速度慢 |
| 寄存器寻址 | EA=R | 0 | 速度最快 | 数量有限 |
| 寄存器间接 | EA=(R) | 1 | 范围大 | 需要访存 |
| 基址寻址 | EA=(BR)+A | 1 | 便于重定位 | 需要基址寄存器 |
| 变址寻址 | EA=(IX)+A | 1 | 便于数组操作 | 需要变址寄存器 |
| 相对寻址 | EA=(PC)+A | 1 | 程序浮动 | 范围有限 |
| 堆栈寻址 | 栈顶 | 0-1 | 自动管理 | 只能栈操作 |
---
## 7.4 指令格式
### 7.4.1 指令格式设计考虑因素
| 因素 | 考虑内容 |
|------|----------|
| 指令字长 | 固定/可变,长度选择 |
| 操作码 | 固定/可变,长度分配 |
| 地址码 | 地址个数,寻址方式 |
| 数据类型 | 支持的数据类型 |
| 寻址方式 | 提供哪些寻址方式 |
### 7.4.2 指令字长
**固定字长**
- 优点:取指时间固定,硬件简单
- 缺点:浪费空间
**可变字长**
- 优点:节省空间
- 缺点:取指时间不固定
### 7.4.3 指令格式举例
#### IBM 370指令格式
```mermaid
graph LR
subgraph "IBM 370 指令格式"
OP[操作码8位] --> R1[寄存器1] --> R2[寄存器2] --> B2[基址寄存器] --> D2[位移量]
end
```
**特点**
- 固定操作码长度8位
- 基址+位移寻址
- 16个通用寄存器
#### Intel 8086指令格式
```mermaid
graph LR
subgraph "Intel 8086 指令格式"
OP[操作码] --> MOD[寻址方式] --> R/M[寄存器/存储器] --> DISP[位移量]
end
```
**特点**
- 可变操作码长度
- 多种寻址方式
- 8个通用寄存器
### 7.4.4 指令系统设计原则
1. **完备性**:指令功能完整
2. **规整性**:指令格式统一
3. **对称性**:操作对称
4. **可扩充性**:便于扩展
5. **兼容性**:向上兼容
---
## 7.5 RISC技术
### 7.5.1 RISC与CISC
| 特性 | CISC | RISC |
|------|------|------|
| 指令数量 | 多(几百条) | 少(几十条) |
| 指令长度 | 可变 | 固定 |
| 寻址方式 | 多种 | 少数几种 |
| 执行时间 | 不固定 | 固定(一个周期) |
| 访存方式 | 多种指令可访存 | 只有LOAD/STORE |
| 控制方式 | 微程序 | 硬布线 |
| 优化目标 | 缩短程序长度 | 提高执行速度 |
### 7.5.2 RISC特点
**主要特点**
1. **指令数量少**:只包含常用指令
2. **指令长度固定**:简化取指和译码
3. **寻址方式少**:简化寻址逻辑
4. **只有LOAD/STORE访存**:简化数据通路
5. **大量寄存器**:减少访存次数
6. **硬布线控制**:提高执行速度
7. **流水线技术**:提高并行度
8. **优化编译**:充分利用硬件
### 7.5.3 RISC优势
| 优势 | 说明 |
|------|------|
| 速度快 | 指令执行时间固定,便于流水线 |
| 硬件简单 | 控制逻辑简单,成本低 |
| 设计周期短 | 指令少,验证容易 |
| 功耗低 | 逻辑简单,功耗小 |
### 7.5.4 RISC vs CISC对比
```mermaid
graph TB
subgraph "CISC"
A1[复杂指令] --> B1[微程序执行]
B1 --> C1[多周期]
end
subgraph "RISC"
A2[简单指令] --> B2[硬布线执行]
B2 --> C2[单周期]
C2 --> D2[流水线]
end
```
---
## 📝 本章小结
### 核心概念
1. **指令格式**:操作码 + 地址码
2. **寻址方式**:立即、直接、间接、寄存器、基址、变址、相对、堆栈
3. **指令系统设计**:完备性、规整性、可扩充性
4. **RISC技术**:简化指令,提高速度
### 关键公式
- **有效地址**$EA = f(寻址方式, 形式地址)$
- **基址寻址**$EA = (BR) + A$
- **变址寻址**$EA = (IX) + A$
- **相对寻址**$EA = (PC) + A$
### 重点图示
> [!summary] 必须掌握的内容
> 1. 指令格式分类(四地址到零地址)
> 2. 扩展操作码技术
> 3. 各种寻址方式的计算方法
> 4. RISC与CISC的区别
---
## 🧪 自测练习
### 概念题
1. 比较各种指令格式的特点。
2. 说明扩展操作码技术的原理。
3. 解释RISC技术的主要特点。
### 计算题
1. 给定指令字长和操作数地址,设计扩展操作码。
2. 计算各种寻址方式下的有效地址。
### 分析题
1. 设计一个简单的指令系统。
2. 分析RISC和CISC的优缺点。
---
## 🔗 相关链接
- [[06_运算方法]] - 上一章
- [[08_CPU结构与功能]] - 下一章
- [[10_控制单元设计]] - 指令执行
- [[04_存储器]] - 存储器访问
---
*本章难度:⭐⭐⭐⭐ 中等偏难*
*重要程度:⭐⭐⭐⭐ 重点*