Files

132 lines
4.3 KiB
Markdown
Raw Permalink 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.
---
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端口编址方式]]
- [[寄存器与指令系统|填空题专题:寄存器与指令系统]]
- [[小端序与存储器组织 选择题考点]]