计组与微机控制
6.0 32位微处理器
6.0 32位微处理器
32 位微处理器编程结构简介
从这里开始进入 2.2:32 位微处理器编程结构简介。
这部分不是重点讲 8086,而是从 80286、80386、80486 到 Pentium 系列的发展。
一、80286:地址线扩展到 24 位
书上说 80286 在 1982 年推出。它的重要变化是:
地址线扩展到 24 位,物理地址空间达到 16MB引入保护工作模式,支持多任务隔离保护
为什么 24 位地址线是 16MB?
因为:2^24 = 16MB
相比 8086/8088 的 1MB,80286 能访问的物理内存大了很多。
80286 的重要意义:保护模式(引入地址隔离sv39看操作系统第四章)
8086 只有实模式,程序之间隔离能力很弱。一个程序如果乱写内存,可能把操作系统或别的程序破坏掉。80286 引入保护模式以后,可以实现:
任务之间隔离用户程序和操作系统之间隔离内存访问权限检查
这就是现代操作系统多任务机制的基础之一。
二、80386:第一款 32 位微处理器
1985 年推出 80386。
80386 的意义非常大:第一款 32 位 x86 微处理器地址总线 32 位,数据总线 32 位支持 4GB 物理地址空间,为什么 32 位地址是 4GB?
2^32 = 4GB
这和 8086 的 1MB 已经完全不是一个级别。
80386 的三种工作模式
书上提到 80386 可以在三种模式下工作:
实地址模式,受保护的虚拟地址模式,虚拟 8086 模式
实地址模式:兼容 8086,启动时常用。保护模式:现代操作系统主要使用,可以实现内存保护、多任务。虚拟 8086 模式:在保护模式中模拟一个 8086 环境,用来运行旧的 8086 程序。
三、80486:集成 FPU 和 Cache
书上说 80486 相当于在 803386 基础上加入了:
80387 浮点运算协处理器8KB Cache
以前浮点运算协处理器可能是单独芯片,比如 80387。
到了 80486,把浮点单元集成进 CPU 内部。
Cache 是高速缓冲存储器,用来减少 CPU 等内存的时间。
所以 80486 比 80386 性能明显提高。
四、特权级 0~3(Machine System User)
80386/80486 提供四级特权级:0 级1 级2 级3 级
其中:0 级最高,通常给操作系统内核,3 级最低,通常给用户应用程序
这就是现代操作系统“内核态/用户态”的基础思想。
用户程序不能随便执行特权指令,也不能随便访问内核内存。
CPU 会在执行指令时检查:
当前特权级够不够?访问的内存段是否合法?有没有越界?I/O 权限是否允许?
这就是保护模式的核心。
五、Pentium 到 Pentium III
书上大概回顾了几个发展点:Pentium、Pentium MMX:增加 MMX 指令,提高多媒体处理能力。Pentium Pro:加入更大的二级 Cache,引入动态执行技术。Pentium II:可以理解为增强了 MMX 技术的 Pentium Pro。Pentium III:引入 SSE 技术,提高浮点和多媒体运算能力。
从 80386 到 Pentium 系列,性能技术不断增强,但基本编程结构仍然沿用 IA 架构。
所以书上后面选择用 80386/80486 的结构来代表 32 位 x86 编程结构。
六、虚拟 8086 模式
第 27 页中间讲:虚拟 8086 模式是 80386/80486 为了让原来的 8086 程序运行在多任务环境中而设计的。
你可以理解成:在保护模式的大环境里,CPU 给某个任务伪装出一个“8086 小环境”。
这样旧的 DOS/8086 程序以为自己还在 8086 机器上跑,但实际上它是现代保护模式下的一个任务。
所以虚拟 8086 模式的用途是:
兼容旧程序,让多个 8086 程序可以在保护环境中运行
七、SMM 系统管理模式
书上还讲了 SMM:
System Management Mode系统管理模式
它主要用于:电源管理,硬件控制,或厂商固件管理
SMM 一般不是普通程序或操作系统直接使用的。
当系统发生某种管理事件时,CPU 进入 SMM,执行专门的 SMM 代码。
执行完之后,再恢复到原来的程序状态。
可以把它理解成一种很底层、很隐蔽的系统固件管理模式。
实模式下的 32 位寄存器结构
接下来进入:实模式下的 32 位微处理器编程结构。
重点是 80386/80486 的寄存器。
一、8 个 32 位通用寄存器
80386/80486 把 8086 的 16 位通用寄存器扩展成 32 位。

对应关系是:
AX → EAX BX → EBXCX → ECX DX → EDXSI → ESI DI → EDIBP → EBP SP → ESP
前面的 E 可以理解成 Extended,扩展。
所以:
EAX 是 AX 的 32 位扩展EBX 是 BX 的 32 位扩展ECX 是 CX 的 32 位扩展EDX 是 DX 的 32 位扩展
1. 低 16 位仍然可以单独访问
比如 EAX 是 32 位:EAX = 高 16 位 + AX
AX 就是 EAX 的低 16 位。
例如:EAX = 12345678H
那么:AX = 5678H
如果你执行:MOV AX, 1111H
只会修改 EAX 的低 16 位。
结果变成:EAX = 12341111H
高 16 位 1234H 不变。
2. AX、BX、CX、DX 的低 8 位和高 8 位仍然可以访问
和 8086 一样:
AX = AH + ALBX = BH + BLCX = CH + CLDX = DH + DL
所以 EAX 的结构可以这样看:EAX 32 位,低 16 位是 AXAX 的高 8 位是 AH,AX 的低 8 位是 AL
如果:EAX = 12345678H
那么:AX = 5678HAH = 56H,AL = 78H
注意,EAX 的高 16 位没有单独的名字。
也就是说,没有类似 EAH 这种寄存器。
二、段寄存器增加 FS 和 GS
8086/8088 原来有 4 个段寄存器:
CS、DS、ES、SS
80386/80486 增加了两个:
FS、GS
所以一共有 6 个段寄存器:
CS、DS、ES、SS、FS、GS
FS 和 GS 是附加段寄存器。
作用类似 ES,可以让程序多几个可用的数据段寄存器。
简单理解:8086 同一时刻主要有 4 个当前段。80386/80486 增加 FS、GS 后,同一时刻可使用的段更多。
三、IP 扩展为 EIP
8086 的指令指针是:IP:16 位
80386/80486 中扩展成:EIP:32 位
EIP 用来保存下一条指令的偏移地址。
在 32 位保护模式下,EIP 可以表示更大的偏移范围。
但在实模式兼容环境下,很多机制仍然要考虑 8086 的兼容性。
四、FLAGS 扩展为 EFLAGS
8086 的 FLAGS 是 16 位。
80386/80486 扩展成:EFLAGS:32 位
图 2.17 画的是 EFLAGS。

其中低位的一些标志仍然和 8086 兼容,比如:
CF、PF、AF、ZF、SF、TF、IF、DF、OF
这些前面已经讲过。
80386/80486 又增加了一些新的标志位,书上重点列了:
IOPLNTRFVMAC
五、IOPL:I/O 特权级
IOPL 全称:I/O Privilege Level
它占 EFLAGS 中的两个位,用来表示 I/O 特权级。
它主要在保护模式下使用。作用是控制程序能不能执行 I/O 操作,比如:
INOUT
普通用户程序不能随便访问硬件端口,否则可能破坏系统安全。
所以 CPU 用 IOPL 和当前特权级一起判断:
这个程序有没有权限访问 I/O 端口?
六、NT:嵌套任务标志
NT 是:Nested Task
意思是嵌套任务。
它用于任务切换和任务嵌套。
如果一个任务是在另一个任务中被调用或中断进入的,CPU 可以通过 NT 标志帮助维护任务之间的返回关系。
这个标志主要服务于保护模式下的硬件任务机制。
普通 8086 汇编学习里不常直接用它。
七、RF:恢复标志
RF 是:Resume Flag
恢复标志。它和调试异常有关。
当调试器设置断点或单步调试时,有时一条指令执行后可能马上再次触发调试异常。
RF 可以让 CPU 在恢复执行时暂时避免重复触发同一个调试异常。
简单记:RF 用于调试恢复,避免调试故障反复发生
八、VM:虚拟 8086 模式标志
VM 是:
Virtual-8086 Mode
如果:VM = 1
表示 CPU 当前处于虚拟 8086 模式。
也就是在保护模式下模拟 8086 运行环境。
这个标志很关键,因为它告诉 CPU:
当前任务要按照虚拟 8086 的方式解释和执行。
九、AC:对齐检查标志
AC 是:Alignment Check
也就是对齐检查。书上讲它和内存访问地址是否对齐有关。
之前讲过对齐方式
比如:字节操作可以在任意地址访问。
字操作最好放在偶地址。
双字操作最好放在 4 的整数倍地址。
四字操作最好放在 8 的整数倍地址。
为什么?
因为地址对齐时,CPU 访问内存更快,可能一次总线访问就能完成。
如果不对齐,可能要多次访问内存,速度下降。不对齐如何解决也有提过(3.8节)
所以 AC 标志用于检查地址对齐问题。
更准确地说,在保护模式下,当相关条件满足时,AC 可以让 CPU 对不符合对齐要求的访问产生异常,用来帮助系统发现不规范的内存访问。
你可以先按考试层面记:
AC 用于地址对齐检查,主要和保护模式有关
8086 常用标志:
CF、PF、AF、ZF、SF、OF、TF、IF、DF
80386/80486 新增保护相关标志:
IOPL、NT、RF、VM、AC
前一组经常用于普通算术、跳转、串操作。
后一组更多用于保护模式、调试、多任务、虚拟 8086、地址对齐等系统级功能。
