vault backup: 2026-06-28 16:34:33
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
---
|
||||
tags:
|
||||
- 接口与通讯技术
|
||||
- x86
|
||||
- 指令系统
|
||||
- 寄存器
|
||||
- 选择题
|
||||
- 重点复习
|
||||
create time: 2026-06-28 16:30
|
||||
---
|
||||
|
||||
# x86 指令系统与寄存器 选择题考点
|
||||
|
||||
## 概述
|
||||
|
||||
x86 指令系统与寄存器在 3 套试卷中共出现 7 题,是考点最分散但也最有规律的部分。核心围绕**段寄存器功能、寻址方式、隐含寄存器、标志位计算、位操作指令、堆栈操作**六个方向。
|
||||
|
||||
## 正文
|
||||
|
||||
### 1. 段寄存器功能分工
|
||||
|
||||
| 段寄存器 | 全称 | 用途 | 关联指令/操作 |
|
||||
|----------|------|------|---------------|
|
||||
| **CS** | Code Segment | 代码段 | 取指令 |
|
||||
| **DS** | Data Segment | **数据段(默认数据段基址)** | 访问变量 |
|
||||
| **SS** | Stack Segment | 堆栈段 | PUSH/POP/CALL |
|
||||
| **ES** | Extra Segment | 附加段 | 串操作目的段 |
|
||||
|
||||
> [!important] 高频考点
|
||||
> **DS(数据段寄存器)用于存放当前数据段段首址。** 访问内存变量时默认使用 DS 作为段基址。
|
||||
|
||||
### 2. 寻址方式辨析
|
||||
|
||||
| 寻址方式 | 示例 | 操作数来源 |
|
||||
|----------|------|-----------|
|
||||
| 寄存器 | `MOV AX, BX` | 寄存器中 |
|
||||
| 寄存器间接 | `MOV AX, [BX]` | 内存,地址在寄存器 |
|
||||
| 变址 | `MOV AX, [SI+10H]` | 内存,SI/DI + 偏移 |
|
||||
| **立即数** | `MOV AX, 1234H` | **指令中直接编码的常数** |
|
||||
| **I/O 间接** | `IN AL, DX` | **I/O 端口地址在 DX 中** |
|
||||
|
||||
> [!question] 思考题
|
||||
> `MOV AX, 1234H` 中 1234H 是立即数,`MOV AX, [1234H]` 中 1234H 是什么?
|
||||
>
|
||||
> 答:后者是**直接寻址**,1234H 是内存地址,CPU 会去访问该内存单元取数据。方括号 `[]` 是关键区别。
|
||||
|
||||
### 3. 隐含寄存器
|
||||
|
||||
| 指令 | 隐含使用的寄存器 | 作用 |
|
||||
|------|:---:|------|
|
||||
| **LOOP** | **CX** | 循环计数器,每次减 1,为 0 时退出 |
|
||||
| I/O 间接寻址 | **DX** | 存放 16 位 I/O 端口地址 |
|
||||
| MUL/DIV | AX | 乘法被乘数/除法被除数 |
|
||||
| XLAT | BX + AL | 查表基址 + 偏移 |
|
||||
|
||||
> [!tip] 记忆规律
|
||||
> - **L**OOP → **C**X(都是"循环"相关)
|
||||
> - I/O 间接 → **D**X(**D**ata e**X**change,数据交换端口)
|
||||
|
||||
### 4. 标志位计算(ADD 指令)
|
||||
|
||||
以 `ADD AL, BL` 为例:
|
||||
|
||||
```
|
||||
AL = 58H = 0101 1000
|
||||
BL = 96H = 1001 0110
|
||||
────────────────────
|
||||
1110 1110 = EEH
|
||||
```
|
||||
|
||||
| 标志位 | 判断规则 | 本例结果 |
|
||||
|--------|----------|----------|
|
||||
| **SF**(符号标志) | 结果最高位 D7 | D7=1 → **SF=1** |
|
||||
| **ZF**(零标志) | 结果是否为 0 | EEH≠0 → **ZF=0** |
|
||||
| CF(进位标志) | 最高位是否有进位 | 无进位 → CF=0 |
|
||||
| OF(溢出标志) | 两个同号数相加结果变号 | 58H正+96H负→不同号,OF=0 |
|
||||
|
||||
### 5. 位操作指令
|
||||
|
||||
**通用规则:AND 清零,OR 置位,XOR 取反。**
|
||||
|
||||
| 目标 | 指令模板 | 掩码构造规则 |
|
||||
|------|----------|-------------|
|
||||
| 某位清零 | `AND AL, mask` | 目标位=0,其余=1 |
|
||||
| 某位置位 | `OR AL, mask` | 目标位=1,其余=0 |
|
||||
| 某位取反 | `XOR AL, mask` | 目标位=1,其余=0 |
|
||||
|
||||
> [!example] 真题
|
||||
> 将 AL 的 D1 位清零,其他位不变。D1 对应掩码 = `1111 1101` = **0FDH**。
|
||||
> 答案:**AND AL, 0FDH**
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A["位操作需求"] --> B["清零某位"]
|
||||
A --> C["置位某位"]
|
||||
A --> D["取反某位"]
|
||||
B --> B1["AND 指令<br/>目标位掩码=0"]
|
||||
C --> C1["OR 指令<br/>目标位掩码=1"]
|
||||
D --> D1["XOR 指令<br/>目标位掩码=1"]
|
||||
style B1 fill:#fdd,stroke:#333,color:#000
|
||||
style C1 fill:#dfd,stroke:#333,color:#000
|
||||
style D1 fill:#ffd,stroke:#333,color:#000
|
||||
```
|
||||
|
||||
### 6. 堆栈操作 POP
|
||||
|
||||
POP 指令执行步骤(以 `POP AX` 为例):
|
||||
|
||||
```
|
||||
栈顶物理地址 = SS × 10H + SP
|
||||
|
||||
POP AX:
|
||||
① AL ← [SS:SP] (低地址 → 低字节)
|
||||
SP ← SP + 1
|
||||
② AH ← [SS:SP] (高地址 → 高字节)
|
||||
SP ← SP + 1
|
||||
```
|
||||
|
||||
> [!example] 真题
|
||||
> (SS)=1000H, (SP)=1234H, (11234H)=12H, (11235H)=34H
|
||||
> 栈顶地址 = 1000H × 10H + 1234H = **11234H**
|
||||
> POP AX: AL=12H, AH=34H → **AX = 3412H**
|
||||
|
||||
> [!warning] 易错点
|
||||
> POP 弹出顺序:**先弹低字节给低寄存器,再弹高字节给高寄存器**(小端序)。不要搞反 AH 和 AL 的取值!
|
||||
|
||||
## 关联笔记
|
||||
|
||||
- [[IO端口编址方式|填空题专题:IO端口编址方式]]
|
||||
- [[寄存器与指令系统|填空题专题:寄存器与指令系统]]
|
||||
- [[小端序与存储器组织 选择题考点]]
|
||||
Reference in New Issue
Block a user