第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 位操作数,大多数算术和逻辑运算指令都可以使用。

寄存器名称可访问方式主要用途
EAXAccumulator 累加器EAX(32位) / AX(16位) / AH, AL(8位)乘法、除法、调整指令有专门用途;80386+ 也可存放偏移地址
EBXBase 基址EBX(32位) / BX(16位) / BH, BL(8位)存放存储单元偏移地址(全系列均可用)
ECXCount 计数ECX(32位) / CX(16位) / CH, CL(8位)重复串操作、移位、循环移位、LOOP 指令的计数;移位用 CL,串操作用 CX,LOOP 用 CX/ECX
EDXData 数据EDX(32位) / DX(16位) / DH, DL(8位)乘法部分积、除法部分被除数;80386+ 可寻址存储器

(2) 指针寄存器和变址寄存器(4个)

寄存器名称可访问方式主要用途
ESPStack Pointer 堆栈指针ESP(32位) / SP(16位)寻址堆栈存储区,堆栈操作指针
EBPBase Pointer 基址指针EBP(32位) / BP(16位)存放堆栈段中数据区的基址
ESISource Index 源变址ESI(32位) / SI(16位)串操作指令的源数据串寻址;也可作数据寄存器
EDIDestination 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 位,标志位进一步扩充
六个状态标志

反映微处理器的工作状态(运算结果特征)。

标志位名称功能
CFCarry Flag 进位标志算术运算结果最高位有进位或借位时置 1,否则置 0
PFParity Flag 奇偶标志反映操作结果低 8 位中 1 的个数,偶数个 1 置 1。早期数据通信用,现代少用
AFAuxiliary carry Flag 辅助进位标志低 4 位最高位有进位/借位时置 1。用于 BCD 运算十进制调整(DAA/DAS 测试)
ZFZero Flag 零标志运算结果为零则 ZF=1,否则为 0
SFSign Flag 符号标志带符号数(补码)运算结果符号位。负数 SF=1,正数 SF=0。与结果最高位一致
OFOverflow Flag 溢出标志有符号数运算结果是否溢出。溢出时 OF=1。字节运算范围 -128~+127,字运算 -32768~+32767

CF 与 OF 的区别:CF 是无符号数的进位/借位,OF 是有符号数的溢出。两者是不同概念。对于无符号数运算,不考虑 OF。

三个控制标志

对微处理器运行起特定控制作用。

标志位名称功能控制指令
DFDirection Flag 方向标志控制串操作指令地址方向。DF=0 自动增量(低→高),DF=1 自动减量(高→低)STD 置 1 / CLD 清 0
IFInterrupt Flag 中断标志控制可屏蔽中断响应。IF=1 允许响应,IF=0 不响应。对非屏蔽中断和内部中断不起作用STI 置 1 / CLI 清 0
TFTrap Flag 陷阱标志单步标志。TF=1 单步工作方式,每执行一条指令产生单步中断,用于程序调试无直接指令,通过栈操作修改

4. 段寄存器

16 位,用于与其他寄存器联合生成存储器地址。实模式和保护模式下功能不同。

段寄存器名称功能
CSCode Segment 代码段保存程序/过程代码。定义代码段起始地址。实模式下 64KB,保护模式下通过描述符定义
DSData Segment 数据段存放程序使用的大部分数据。实模式 64KB,保护模式 4GB
ESExtra Segment 附加段某些串操作指令的目的操作数数据段
SSStack 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位偏移)的不足:

  1. 4位段寄存器与其他寄存器不兼容,操作麻烦
  2. 每段固定 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 位和中断/任务切换

知识关联


重点速查

知识点核心要点
通用寄存器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模式