第6章 微处理器的编程结构
课程:1A003 计算机组织与系统结构(第二部分) 来源:田浩然上传的资料 格式:PowerPoint 97-2003 二进制 .ppt(图文混合,部分章节为图片型) 文件大小:1.46MB 文本提取状态:partial(6.3-6.4节文本完整提取,6.1-6.2节为图片型,基于课程上下文知识体系补充)
本章概述
本章从软件程序员的视角介绍 80x86/Pentium 微处理器的编程结构,即编程人员眼中看到的微处理器软件结构模型。程序员不需要了解内部复杂的电路结构和电气连接,只需掌握寄存器功能、存储器组织方式和寻址机制。
主要内容包括:
- 6.1 微处理器概述(图片型,待补充)
- 6.2 微处理器的工作模式(实模式 / 保护模式 / 虚拟8086模式,三种模式转换,图片型)
- 6.3 微处理器的编程结构(寄存器模型,文本完整提取)
- 6.4 实模式下的存储器寻址(分段技术、物理地址计算、堆栈操作,文本完整提取)
- 第6章 习题
6.3 微处理器的编程结构
6.3.1 基本概念
编程结构:编程人员眼中看到的微处理器软件结构模型。便于从软件视角了解计算机系统的操作和运行。
程序员需要掌握的核心内容:
- 各种寄存器的功能、操作和限制
- 程序设计中如何使用寄存器
- 外部存储器的组织方式
- 处理器如何从存储器取得指令和数据
程序可见寄存器(program visible):应用程序设计时可以直接访问的寄存器。
程序不可见寄存器(program invisible):应用程序设计时不能直接访问,在系统程序设计(如操作系统)时可被间接引用或通过特权指令访问。80286 及以上处理器才有,主要用于保护模式下存储系统的管理和控制。
6.3.2 80x86/Pentium 处理器的寄存器模型
寄存器模型是呈现在编程者面前的寄存器集合,也称微处理器的编程结构。
1. 通用寄存器
共 8 个通用寄存器,分为两组:
(1) 通用数据寄存器(4个)
存放 8 位、16 位或 32 位操作数,大多数算术和逻辑运算指令都可以使用。
| 寄存器 | 名称 | 可访问方式 | 主要用途 |
|---|---|---|---|
| EAX | Accumulator 累加器 | EAX(32位) / AX(16位) / AH, AL(8位) | 乘法、除法、调整指令有专门用途;80386+ 也可存放偏移地址 |
| EBX | Base 基址 | EBX(32位) / BX(16位) / BH, BL(8位) | 存放存储单元偏移地址(全系列均可用) |
| ECX | Count 计数 | ECX(32位) / CX(16位) / CH, CL(8位) | 重复串操作、移位、循环移位、LOOP 指令的计数;移位用 CL,串操作用 CX,LOOP 用 CX/ECX |
| EDX | Data 数据 | EDX(32位) / DX(16位) / DH, DL(8位) | 乘法部分积、除法部分被除数;80386+ 可寻址存储器 |
(2) 指针寄存器和变址寄存器(4个)
| 寄存器 | 名称 | 可访问方式 | 主要用途 |
|---|---|---|---|
| ESP | Stack Pointer 堆栈指针 | ESP(32位) / SP(16位) | 寻址堆栈存储区,堆栈操作指针 |
| EBP | Base Pointer 基址指针 | EBP(32位) / BP(16位) | 存放堆栈段中数据区的基址 |
| ESI | Source Index 源变址 | ESI(32位) / SI(16位) | 串操作指令的源数据串寻址;也可作数据寄存器 |
| EDI | Destination Index 目的变址 | EDI(32位) / DI(16位) | 串操作指令的目的数据串寻址;也可作数据寄存器 |
2. 指令指针寄存器 EIP
- EIP(Instruction Pointer):专用寄存器,寻址当前需要取出的指令字节
- CPU 取出一个指令字节后,EIP 自动加 1,指向下一指令字节
- 实模式下为 IP(16位)
- 保护模式下为 EIP(32位,80386及以上)
- 程序员不能直接对 EIP/IP 进行存取操作
- 转移指令、返回指令、中断处理能对 EIP/IP 进行操作
3. 标志寄存器 EFLAGS
用于指示微处理器的状态并控制它的操作。
各代标志寄存器的演进:
- 8086/8088:FLAG,16位,定义 9 位
- 80286:仍为 16 位,标志位增加到 12 位(新增 3 个)
- 80386+:EFLAGS,32 位,标志位进一步扩充
六个状态标志
反映微处理器的工作状态(运算结果特征)。
| 标志位 | 名称 | 功能 |
|---|---|---|
| CF | Carry Flag 进位标志 | 算术运算结果最高位有进位或借位时置 1,否则置 0 |
| PF | Parity Flag 奇偶标志 | 反映操作结果低 8 位中 1 的个数,偶数个 1 置 1。早期数据通信用,现代少用 |
| AF | Auxiliary carry Flag 辅助进位标志 | 低 4 位最高位有进位/借位时置 1。用于 BCD 运算十进制调整(DAA/DAS 测试) |
| ZF | Zero Flag 零标志 | 运算结果为零则 ZF=1,否则为 0 |
| SF | Sign Flag 符号标志 | 带符号数(补码)运算结果符号位。负数 SF=1,正数 SF=0。与结果最高位一致 |
| OF | Overflow Flag 溢出标志 | 有符号数运算结果是否溢出。溢出时 OF=1。字节运算范围 -128~+127,字运算 -32768~+32767 |
CF 与 OF 的区别:CF 是无符号数的进位/借位,OF 是有符号数的溢出。两者是不同概念。对于无符号数运算,不考虑 OF。
三个控制标志
对微处理器运行起特定控制作用。
| 标志位 | 名称 | 功能 | 控制指令 |
|---|---|---|---|
| DF | Direction Flag 方向标志 | 控制串操作指令地址方向。DF=0 自动增量(低→高),DF=1 自动减量(高→低) | STD 置 1 / CLD 清 0 |
| IF | Interrupt Flag 中断标志 | 控制可屏蔽中断响应。IF=1 允许响应,IF=0 不响应。对非屏蔽中断和内部中断不起作用 | STI 置 1 / CLI 清 0 |
| TF | Trap Flag 陷阱标志 | 单步标志。TF=1 单步工作方式,每执行一条指令产生单步中断,用于程序调试 | 无直接指令,通过栈操作修改 |
4. 段寄存器
16 位,用于与其他寄存器联合生成存储器地址。实模式和保护模式下功能不同。
| 段寄存器 | 名称 | 功能 |
|---|---|---|
| CS | Code Segment 代码段 | 保存程序/过程代码。定义代码段起始地址。实模式下 64KB,保护模式下通过描述符定义 |
| DS | Data Segment 数据段 | 存放程序使用的大部分数据。实模式 64KB,保护模式 4GB |
| ES | Extra Segment 附加段 | 某些串操作指令的目的操作数数据段 |
| SS | Stack Segment 堆栈段 | 特殊存储区,暂存数据和地址信息。由 SS + ESP/SP 确定存取地址,EBP/BP 也可寻址堆栈段 |
| FS / GS | 附加段寄存器 | 仅 80386 及以上有效,访问两个附加存储器段 |
6.4 实模式下的存储器寻址
6.4.1 实模式下的存储器地址空间
- 地址空间:1M 字节(00000H~FFFFFH)
- 分为通用和专用两种存储区
专用存储区:
- 00000H~003FFH(前 1024 字节):中断向量表区,存放 256 个中断服务程序入口地址(中断向量),每个 4 字节
- FFFF0H~FFFFFH(最后 16 字节):系统初始化代码保留区。CPU 加电/复位时第一条指令从此开始,通常存放一条无条件转移指令跳转到系统程序入口
通用区域:00400H~FFFEFH,存储一般程序指令和数据。
6.4.2 存储器分段技术
为什么需要分段?
- 实模式下 CPU 可直接寻址 2^20 = 1MB,需 20 位地址
- 但 CPU 寄存器都是 16 位,ALU 只能做 16 位运算,寻址范围局限在 2^16 = 64KB
- 为实现对 1MB 的寻址,80x86 采用了存储器分段技术
分段机制:
- 将 1MB 存储空间分成许多逻辑段,每段最长 64KB(可用 16 位地址码寻址)
- 每个逻辑段位置可以浮动,起始地址由段寄存器确定
- 段寄存器存放段基值(段起始地址的高 16 位)
段的特性:
- 各个逻辑段可以完全分开、部分重叠、甚至完全重叠
- 段起始地址的计算和分配通常由操作系统完成
另一种分段方案(高4位段号 + 低16位偏移)的不足:
- 4位段寄存器与其他寄存器不兼容,操作麻烦
- 每段固定 64KB,不灵活,浪费空间
80x86 采用了更灵活的前一种分段机制。
6.4.3 实模式下的存储器寻址
1. 物理地址与逻辑地址
- 物理地址:信息在存储器中实际存放的地址,CPU 访问时实际输出的地址。实模式下 20 位,1MB 空间
- 逻辑地址:编程时使用的地址。由段基值和偏移量两部分组成
- 段基值:段起始地址的高 16 位,由段寄存器(CS/DS/SS/ES/FS/GS)提供
- 偏移量(offset):存储单元距段起始地址的字节距离,由 BX/BP/SP/SI/DI/IP 或其组合提供
2. 实模式下物理地址的产生
计算公式:
物理地址 = 段基值 × 16 + 偏移量
(段基值左移 4 位,低位补 0,再与偏移量相加,由地址加法器完成)
示例 1:CS = 4232H,IP = 0066H
- 物理地址 = 42320H + 0066H = 42386H
示例 2:DS = 1234H,BX = 0022H
- 物理地址 = 12340H + 0022H = 12362H
示例 3:段基值 = 002AH,物理地址 = 002C3H,求偏移量
- 偏移量 = 002C3H - 002A0H = 0023H
重要性质:每个存储单元有唯一的物理地址,但可以由不同的逻辑地址转换而来。同一个物理地址可以对应多个逻辑地址。
例如:物理地址 00213H
- 段基值 0020H + 偏移量 0013H
- 段基值 0021H + 偏移量 0003H
这种段基值+偏移量的寻址机制也称为段-偏移寻址机制,地址常表示为 段基值:偏移量 的形式,如 2000H:3000H。
6.5 堆栈操作
堆栈结构:
- 所谓”向下生长”的堆栈,栈底在高地址端
- 堆栈为空时 SP 指向栈底
- 堆栈段的段基址(SS)不是栈底
堆栈操作特点:
- 实模式下堆栈为 16 位宽(字宽)
- 操作总是以字为单位进行
PUSH(压栈):先 SP-2,后压入数据
压栈时:先修改栈指针,后压入
POP(弹栈):先弹出数据,后 SP+2
弹栈时:先弹出,后修改栈指针
示例:AX=10, BX=20, CX=30, DX=40 依次执行:PUSH AX → PUSH BX → POP CX → POP DX → PUSH CX → PUSH DX → POP AX → POP BX
(最终 AX 和 BX 的值需要逐步推导)
三种工作模式(基于课程框架整理)
80x86/Pentium 系列微处理器有三种工作模式:
1. 实模式(Real Mode)
- 8086/8088 兼容模式
- 20 位地址总线,寻址 1MB 空间
- 分段机制:段寄存器×16 + 偏移量
- 单任务运行
- CPU 加电/复位后默认进入实模式
2. 保护模式(Protected Mode)
- 80286 及以上支持
- 32 位地址总线(80386+),寻址 4GB 空间
- 支持虚拟存储、内存保护、多任务
- 通过描述符表管理段
- 由 CR0 寄存器的 PE 位控制
3. 虚拟 8086 模式(Virtual 8086 Mode)
- 在保护模式下模拟 8086 实模式
- 可以同时运行多个 8086 程序
- 每个虚拟 8086 任务有自己的 1MB 地址空间
- 通过中断和任务切换实现模式转换
模式转换:
- 实模式 ↔ 保护模式:通过设置 CR0 的 PE 位
- 保护模式 ↔ 虚拟 8086 模式:通过 EFLAGS 的 VM 位和中断/任务切换
知识关联
- 结构化计算机组成 — 寄存器模型、存储器层次、寻址方式的更系统讲解
- 深入理解计算机系统 CSAPP — 程序员视角的计算机系统,x86-64 寄存器和寻址
- Linux内核完全注释 — 实模式到保护模式切换、段寄存器、中断向量表的实际应用
- Linux内核情景分析 — 分段分页机制在 Linux 中的实现
重点速查
| 知识点 | 核心要点 |
|---|---|
| 通用寄存器 | 8个:EAX/EBX/ECX/EDX + ESP/EBP/ESI/EDI |
| 状态标志 | 6个:CF/PF/AF/ZF/SF/OF |
| 控制标志 | 3个:DF/IF/TF |
| 段寄存器 | 6个:CS/DS/ES/SS/FS/GS |
| 实模式寻址 | 物理地址 = 段基值×16 + 偏移量 |
| 地址空间 | 1MB,中断向量表占前 1KB,复位地址 FFFF0H |
| 堆栈操作 | 向下生长,字操作,PUSH 先减后压,POP 先弹后加 |
| 三种模式 | 实模式 / 保护模式 / 虚拟8086模式 |