475 lines
10 KiB
Markdown
475 lines
10 KiB
Markdown
|
|
# 第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_存储器]] - 存储器访问
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本章难度:⭐⭐⭐⭐ 中等偏难*
|
|||
|
|
*重要程度:⭐⭐⭐⭐ 重点*
|