--- tags: - 接口与通讯技术 - 寄存器 - 指令系统 - 寻址方式 - 重点复习 create time: 2026-06-28 15:00 --- # 寄存器与指令系统 ## 概述 x86 指令系统中的寄存器使用规则和寻址方式是接口与通讯技术的基础知识。本专题覆盖 3 套试卷中出现的寄存器拼接、隐含寄存器、间接寻址寄存器以及 LEA 指令等高频考点。 ## 正文 ### 1. 16 位寄存器的字节拼接 x86 的 16 位通用寄存器可以由两个 8 位寄存器拼接而成: | 16 位寄存器 | 高 8 位 | 低 8 位 | 拼接公式 | |:----------:|:------:|:------:|---------| | **AX** | AH | AL | AX = AH × 256 + AL | | **BX** | BH | BL | BX = BH × 256 + BL | | **CX** | CH | CL | CX = CH × 256 + CL | | **DX** | DH | DL | DX = DH × 256 + DL | > [!important] 拼接规则 > **高位在前,低位在后**。DH 存放高 8 位,DL 存放低 8 位。 > [!example] 真题计算 > (DL) = 12H,(DH) = 34H,则 (DX) = ? > > $$DX = DH \times 100H + DL = 34H \times 100H + 12H = \textbf{3412H}$$ > > 即 DH(34H)为高字节,DL(12H)为低字节,拼接后 DX = **3412H**。 ```mermaid graph LR A["DH = 34H"] --> C["DX"] B["DL = 12H"] --> C C --> D["DX = 3412H"] style A fill:#f9f,stroke:#333,color:#000 style B fill:#bbf,stroke:#333,color:#000 ``` > [!question] 思考题 > 如果 (AL) = FFH,(AH) = 00H,则 (AX) = ? > > 答:AX = 00H × 100H + FFH = **00FFH**。注意高位在前的拼接规则。 ### 2. LOOP 指令隐含的寄存器 `LOOP` 指令的执行流程: 1. **CX ← CX - 1**(自动递减计数器) 2. 若 CX ≠ 0,跳转到目标地址;若 CX = 0,退出循环 CX 作为 **Count Register**(计数寄存器),是 LOOP 指令**隐含使用**的寄存器,无需在指令中显式指定。 ```asm MOV CX, 10 ; 循环 10 次 AGAIN: ; 循环体 LOOP AGAIN ; CX 自动减 1,不为 0 则跳回 AGAIN ``` > [!warning] 易错点 > 如果 CX 初始值为 0,LOOP 会执行 **65536 次**(16 位模式下 CX 从 0 减 1 变为 FFFFH,不为 0 继续循环,直到减到 0 才退出)。 ### 3. 间接寻址的四个寄存器 x86(16 位模式)中,能够用于**寄存器间接寻址**的寄存器只有 4 个: | 寄存器 | 默认段寄存器 | 常见用途 | |-------|------------|---------| | **BX** | DS | 基址寄存器,常用于数据访问 | | **BP** | SS | 基址指针,常用于栈帧访问 | | **SI** | DS | 源变址寄存器 | | **DI** | ES | 目的变址寄存器 | > [!important] 考试关键点 > 能够实现对存储单元进行间接寻址的寄存器有 **BX**、BP、SI 和 DI。 > > AX、CX、DX **不能**直接用于内存间接寻址。 ```asm MOV AL, [BX] ; 从 DS:BX 指向的内存单元读取 MOV AL, [SI] ; 从 DS:SI 指向的内存单元读取 MOV AL, [BP] ; 从 SS:BP 指向的内存单元读取(默认段为 SS) MOV AL, [DI] ; 从 ES:DI 指向的内存单元读取(串操作时默认段为 ES) ``` ### 4. LEA 指令 `LEA`(Load Effective Address)指令将源操作数的**有效地址(EA)**加载到目标寄存器中,而不是内存内容。 | 指令 | 功能 | 结果 | |------|------|------| | `LEA BX, [SI]` | 将 SI 的有效地址(偏移地址)加载到 BX | BX = SI 的值 | | `MOV BX, [SI]` | 将 SI 指向的内存单元内容加载到 BX | BX = 内存[SI] 的值 | > [!example] 真题分析 > (DS) = 2000H,(SI) = 3000H,(23000H) = 12H,(23001H) = 34H > > 执行 `LEA BX, [SI]` 后: > - LEA 取的是**有效地址**,即偏移地址 SI = 3000H > - 但题目答案为 **2000H**,可能存在特殊的考查角度 > > > [!warning] 注意 > > 此题答案 2000H 与标准 LEA 指令行为不完全吻合。若严格按照 `LEA BX,[SI]`,BX 应等于 SI = 3000H。建议结合教材确认具体考查意图。 > [!question] 思考题 > `LEA BX, [BX+SI+10H]` 的作用是什么? > > 答:将 BX+SI+10H 的计算结果(有效地址)存入 BX。LEA 常用于地址计算而非单纯的地址加载。 ### 5. 真题回顾 > [!example] 【真题】在 PC 系列微机中,如果各寄存器的内容为 (DL)=12H,(DH)=34H,则 (DX)=\_\_\_\_\_\_。 > > **答案**:3412H > [!example] 【真题】在 PC 系列微机指令系统中,循环指令 LOOP 隐含使用的寄存器是\_\_\_\_\_\_。 > > **答案**:CX > [!example] 【真题】在 PC 系列微机指令系统中,能够实现对存储单元进行间接寻址的寄存器有\_\_\_\_\_\_,BP,SI 和 DI。 > > **答案**:BX > [!example] 【真题】若当前各相关寄存器及存储单元的内容为:(DS)=2000H,(SI)=3000H,(23000H)=12H,(23001H)=34H,则执行完指令 `LEA BX,[SI]` 后,(BX)=\_\_\_\_\_\_。 > > **答案**:2000H ## 关联笔记 - [[IO端口编址方式]] - [[接口与通讯技术/试题册/index|试题册索引]]