第 2 章 IA-32 微处理器
一. IA-32 微处理器是 8086 的延伸
1. 8086 功能的扩展
IA-32 微处理器是 8086 的延伸,以 8086 处理器为基础
1.1. 从 16 位扩展到 32 位
32 位地址能寻址 4GB 物理地址
8086 的地址分配
采用分段机制用 20 位段基地址加上 16 位的偏移量形成了 20 位的地址,可以选址 1MB 的物理地址。
1.2. 从实模式至保护模式
1981 年 IBM 刚刚推出 IBM-PC 时,由于硬件资源的有限所以采用的操作系统是单用户、单任务的磁盘操作系统。操作系统本身没有程序隔离,也没有保护。
从 80286 开始,在 80386 中真正完善保护模式。在保护模式下,程序运行于四个特权级,通过这种方式实现操作系统核心程序与应用程序的严格隔离。
1.3. 片内存储管理单元(MMU)
32 位地址,可寻址 4GB 物理地址,但应用程序却可能需要庞大的地址空间。因此,在操作系统中提供了虚拟存储器管理机制,而这要求硬件支持。
MMU(Memory Management Unit),是 CPU 中用来管理虚拟存储器、物理存储的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
1.4. 浮点支持
工程应用、图形处理、科学计算等要求浮点支持。自 80486 芯片开始,在 IA-32 微处理器中集成了 x87(及其增强)浮点单元。
1.5. MMX 技术
MMX(Multi-media Extension Technology)多媒体扩展指令集技术支持多媒体的应用,如音乐合成、语音合成、语音识别等。
1.6. 流 SIMD 扩展(Streaming SIMD Extensions, SSE)
自 Pentium III 处理器开始,在 IA-32 微处理器中引进了流 SIMD(单指令多数据)扩展(SSE)技术,是继 MMX 的扩展指令集。 SSE 能够提供更高分辨率的图像浏览和处理、高质量音频、MPEG2 视频以及更高精度和更快响应速度。
2. 8086 性能的提高
2.1. 利用流水线技术提高操作的并行性
8086 中利用流水线把取指令和执行指令重叠,减少等待取指令的时间,使大部分执行时间为四个时钟周期。
80386 利用芯片内 6 个能并行操作的功能部件,使执行一条指令的时间缩短为两个时钟周期。
2.2. 引入片内缓存 Cache
利用指令执行的局部性原理,把近期可能要用到的指令与数据放在工作速度比主存储器更快容量更小的缓存中。
目前,通常在处理器芯片上有指令和数据分开的一级缓存与指令和数据混合的二级缓存。目前,缓存的容量越来越大,进一步提高了处理器的性能。
二. 8086 功能结构
1. 总线接口单元 BIU
负责与存储器或者 I/O 接口传送信息
组成
- 段寄存器
CS
DS
SS
ES
- 指令指针
IP
- 地址形成逻辑
- 总线控制逻辑
- 指令队列
2. 执行单元 EU
负责指令的译码与执行
组成
- 数据寄存器
AX
BX
CX
DX
- 指针寄存器
SI
DI
BP
SP
- 算术逻辑单元
3. 分类的优势
将 EU 和 BIU 分开可以实现取指部分和执行指令部分分开。采用“流水线式”非同步工作模式,使得总线控制逻辑和指令执行逻辑之间相互独立又相互配合。
在 8086 中,由于 BIU 和 EU 是分开的,所以,取指和执行可以重叠进行。
这样就大大减少了等待取指所需要的时间,提高了 CPU 的利用率。这种重叠的操作技术就被称为流水线。
三. 8086 的执行环境
1. 基本执行概要
- 地址空间
- 基本程序执行寄存器
- 堆栈 (Stack)
- I/O 端口
2. 基本程序执行寄存器
2.1. 1MB 线性地址空间
20 根地址线, 的地址空间
2.2. 八个 16 位通用寄存器
寄存器 | 功能 |
---|---|
AX | 操作数和结果数据的累加器 |
BX | 在 DS 段中数据的指针 |
CX | 串和循环操作的计数器 |
DX | I/O 指针 |
SI | 源变址寄存器,指向 DS 寄存器段中的数据指针、串操作的源指针 |
DI | 目的变址寄存器,指向在 ES 寄存器段中的数据的指针、串操作的目标指针 |
SP | 堆栈指针,在 SS 段中 |
BP | 基址指针寄存器,堆栈上数据指针,在 SS 段中 |
2.3. 段寄存器
在 8086 系统中,代码、数据、堆栈信息这 3 类信息通常分别存放在各自的内存区域中
8086 系统中把可直接寻址的 1MB 内存空间划分为称为“段”(Segment)的逻辑区域,每个段的物理长度为 64KB ,而段的起始地址由称为“段寄存器”(Segment Register)的 4 个 16 位寄存器决定。
寄存器 | 功能 |
---|---|
CS | Code Segment 指向当前的代码段,指令由此段中取出 |
DS | Stack Segment 指向当前的堆栈段,堆栈操作的对象就是该段中存储单元的内容 |
SS | Data Segment指向当前的数据段,通常用来存放程序变量 |
ES | Extra Segment 指向当前的附加段,通常也用来存放数据以及—些专用指令的操作 |
2.4. 标志状态寄存器 FLAGS
- 6 位状态位:
CF
AF
ZF
SF
OF
PF
- 3 位控制位:
IF
DF
TF
从属 | 标志 | 注释 |
---|---|---|
状态位 | CF | 进位标志 |
^^ | AF | 辅助进位标志,低 4 位向高 4 位借位(用于 BCD 码运算) |
^^ | ZF | 零标志位,反映运算结果是否为 0 |
^^ | SF | 符号标志,反映带符号数运算结果是否为负 |
^^ | OF | 带符号数运算溢出标志 |
^^ | PF | 奇偶校验标志 |
控制位 | IF | 中断允许标志,1 表示允许响应 |
^^ | DF | 在进行字符串操作时,每执行一条串操作指令,需调整源/目的操作数地址,DF 控制地址递增(0)还是递减(1) |
^^ | TF | 追踪标志,当 TF 为 1 时,微处理器每执行完一条指令自动产生一个内部中断,常用于程序的调试 |
2.5. IP 指令指针寄存器
16 位专用寄存器,指向当前需要取出的指令,当 BIU 从内存中取出一个指令字节后,IP 自动加 1,指向下一指令字节
IP 指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(Effective Address ,EA)
IP 寄存器不能直接由软件访问,程序中的转移指令、返回指令以及中断处理能对 IP 进行操作
3. 存储器组织
处理器在它的总线上寻址的存储器称为物理存储器
8086 有 20 条地址引线,它的直接寻址能力为 。所以,8086 组成的系统有 1MB 的存储器,地址编号从 00000H
到 FFFFFH
存储空间都按 8 位字节进行组织,每个存储单元存储一个字节数据。若存放“字”数据(16位),则存放在相邻两个存储单元中,按小数端存放规则,高字节存放在高地址单元,低字节存放在低地址单元(W
= BH:BL
)
8086 微处理器内部的数据通路和寄存器皆为 16 位,内部 ALU 只能进行 16 位运算,在程序中也只能使用 16 位地址,寻址范围局限在 ,为了能寻址 1MB 的地址,引入“分段”的概念。
8086 微处理器与内存储器之间所有信息交换都要使用 20 位的物理地址,而在程序中所涉及的地址是 16 位的逻辑地址。对给定的任一存储单元而言有两部分逻辑地址(Logical Address):
- 段基值:决定所在段第一个字节的位置
- 存放在段寄存器
CS
DS
SS
ES
- 存放在段寄存器
- 段内偏移量(Offset):该存储单元相对于该段起始单元的距离
- 由寄存器
SP
BP
SI
DI
IP
BX
和直接地址以及上述寄存器和直接地址的组合而形成
- 由寄存器
寻址物理单元过程
由基地址加上由 SP
IP
BP
SI
DI
等可由 CPU 处理的 16 位偏移量来形成 20 位物理地址。在形成 20 位物理地址时,段寄存器种的 16 位数会自动左移 4 位,然后与 16 位偏移量相加
操作类型 | 隐含的段基值 | 可替换的段基值 | 偏移地址 |
---|---|---|---|
取指令 | CS | 无 | [CS:IP] |
堆栈操作 | SS | 无 | [SS:SP] |
BP 用作基址寄存器 | SS | CS DS ES | [SS:EA] |
通用数据读写 | DS | CS ES SS | [DS:EA] |
字符串操作(源地址) | DS | CS ES SS | [DS:SI] |
字符串操作(目的地址) | ES | 无 | [ES:DI] |
^memory-organization
在不改变段寄存器值的情况下,寻址的最大范围是 64KB。所以,若有一个任务,它的程序长度、堆栈长度以及数据区长度都不超过 64KB,则可在程序开始时,分别给 DS、SS、ES 置值,然后在程序中就可以不再考虑这些段寄存器,程序就可以在各自的区域中正常地进行工作。