8088/8086微处理器
简介
- 8088/8086属于第三代微处理器的典型代表。
- 第三代微处理器和第二代微处理器的主要区别在于字长有了跨越式发展。
- 第二代微处理器主要是以8位微处理器为主要代表,第三代微处理器主要是以16位微处理器为主要代表
- 最初Inter公司的第三代微处理器主推8086芯片,它是一款16位微处理器,它在内部结构和对外通道上的处理能力都是16位,也就是说该芯片能够并行处理16位二进制码。但是为了与之前推出的主板和其他外部部件兼容,所以Inter公司又推出了8088微处理器。
- 8088和8086的主要区别在外部通道上,8086的对外通道是16位的,而8088的对外通道是8位的;两者内部结构都是16位。
说明:
面对科学研究,以学习前沿技术为主,面对教学研究,以学习基本原理和基础知识为主。因此不论是8086、8088还是如今的64位微处理器,它们最核心部分的基本原理都是类似的。为了后续学习方便,这里以学习8088芯片为主。
关注点:
- 8088/8086CPU能够实现指令并行流水工作的原因;
- 实地址模式下的存储器地址变换原理
- 如何知道CPU当前工作状态及指令运算结果的特征
8088/8086CPU的特点
此处的特点是与第二代及其之前的CPU相比
- 采用并行流水线工作方式
- 通过设置指令预取队列实现——CPU内部结构
- 对内存空间实行分段管理
- 将内存分为4个段并设置地址段寄存器,以实现对1MB空间的寻址——实模式存储器寻址
- 支持协处理器
- 处理浮点运算
8088/8086CPU的两种工作模式
8088/8086可工作于两种模式下
- 最小模式:是单处理器模式,所有控制信号由微处理器产生
- 最大模式:是多处理器模式,部分控制信号由外部总线控制器产生
- 用于包含协处理器的情况下
最小模式下的总线连接示意图:
- CPU将地址信息通过控制总线发出后会将地址信息存入地址锁存器,防止该通道后续传输的数据信息冲掉该地址信息
- 数据收发模块是一个驱动器,连接CPU和数据总线,负责数据的收发
- 所有控制信号都由微处理器产生。所以CPU直接与地址总线相连
最大模式下的总线连接示意图:
- 由于需要与协处理器进行协调工作,所以控制信息通过总线控制器与控制总线连接,也就是说部分控制信号由外部总线控制器产生
两种工作模式的选择方式
8088是工作在最小还是最大模式由$MN/\overline{MX}$引线的状态决定
- $MN/\overline{MX}-0$工作于最大模式
- $MN/\overline{MX}-1$工作于最小模式
8088CPU的主要引线及内部结构
8088CPU最小模式下的主要引脚信号
- 完成一次访问内存或接口所需要的主要信号
- 与外部同步控制信号
- 中断请求和响应信号
- 总线保持和响应信号
访存/接口信号
#
也就是上横线,表示低电平有效#DEN
是数据收发器的选通信号
【例】当#WR=1
,#RD=0
,IO/#M=0
时,表示CPU当前正在进行读存储器操作
外部同步控制信号
- READY实现CPU与内存/接口之间同步控制的信号
- 在一个标准的总线周期中,正常情况下,可以完成一次访存或访接口的操作;但如果接口或内存还没准备就绪,可以在T3时钟周期之后,插入若干个TWAIT周期
中断请求和响应信号
总线保持信号
8088和8086CPU引脚功能比较
8088内部结构
-
无论是哪种型号的CPU,在总的功能上都包括三个部分:控制器、运算器、寄存器组
-
Inter公司在逻辑上把CPU分为执行单元和总线接口单元
- 执行单元:用来执行程序
- 总线接口单元:用来访问内存/接口
-
图中实线是片内总线,也就是CPU的内部通道
执行单元
- FLGAS标志寄存器:用来保留运算结果的特征。比如:两个数相加结果是否有进位、结果是否是零、结果是否有溢出等等
总线接口单元
- CPU从内存取到指令后不是直接经过译码交给运算器去执行,而是先放入指令预取队列中暂存
- 指令预取队列是并行流水线工作的基础
- 地址加法器可以将两个16位的地址相加得到一个20位的地址
指令预取队列的存在使EU和BIU两个部分可同时进行工作。EU在分析和执行指令时,BIU可以去取指令,实现了指令的并行执行。
8088CPU内部寄存器
8088CPU内部含14个16位寄存器,按功能可分为三类:
-
8个通用寄存器
- 数据寄存器:AX、BX、CX、DX
- 地址指针寄存器:SP、BP
- 变址寄存器:SI、DI
-
4个段寄存器
- CS、DS、ES、SS
-
2个控制寄存器
- IP、FLAGS
通用寄存器
数据寄存器
每个数据寄存器可分别拆分为两个8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL
数据寄存器特有的习惯用法:
- AX:累加器
- 所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中;
- BX:基址寄存器
- 在间接寻址中用于存放基地址;
- CX:计数寄存器
- 用于在循环或串操作指令中存放计数值;
- DX:数据寄存器。
- 在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。
地址指针寄存器
- SP:堆栈指针寄存器,其内容为栈顶的偏移地址
- BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。
BX与BP在应用上的区别:
- 作为通用寄存器,二者均可用于存放数据;
- 作为基址寄存器,用BX表示所寻找的数据在数据段;用BP则表示数据在堆栈段。
变址寄存器
- SI:源变址寄存器
- DI:目标变址寄存器
- 变址寄存器在指令中常用于存放数据在内存中的地址。
控制寄存器
- IP:指令指针寄存器,其内容为下一条要取的指令的偏移地址
- FLAGS:标志寄存器,存放运算结果的特征
- 6个状态标志位:CF、PF、AF、ZF、SF、OF,表示运算结果的特征
- 3个控制标志位:IF、TF、DF,表示处理器当前的工作状态
状态标志位
- CF(Carry Flag)
- 进位标志位。加(减)法运算时,若最高位有进(借)位则CF=1
- PF(Parity Flag)
- 奇偶标志位。运算结果的低8位中“1”的个数为偶数时PF=1
- AF(Auxiliary Carry Flag)
- 辅助进位标志位。加(减)操作中,加减法做到一半时有没有形成进位/借位,如果有则AF=1
- ZF(Zero Flag)
- 零标志位。当运算结果为零时ZF=1
- SF(Sign Flag)
- 符号标志位。当运算结果的最高位为1时,SF=1
- OF(Overflow Flag)
- 溢出标志位。当算术运算的结果超出了有符号数的可表达范围时, OF=1
控制标志位
- TF(Trap Flag)
- 陷阱标志位,也叫跟踪标志位。TF=1时,使CPU处于单步执行指令的工作方式。
- IF(Interrupt Enable Flag)
- 中断允许标志位。IF=1使CPU可以响应可屏蔽中断请求。
- DF(Direction Flag)
- 方向标志位。在数据串操作时确定操作的方向。
段寄存器
- 作用
- 用于存放相应逻辑段的段基地址
- 8086/8088内存中逻辑段的类型
- 代码段 —— 存放指令代码
- 数据段 —— 存放操作的数据
- 附加段 —— 存放操作的数据
- 堆栈段 —— 存放暂时不用但需保存的数据。
- CS
- 代码段寄存器,存放代码段的段基地址。
- DS
- 数据段寄存器 ,存放数据段的段基地址。
- ES
- 附加段寄存器,存放数据段的段基地址。
- SS
- 堆栈段寄存器, 存放堆栈段的段基地址
实地址模式下的存储器寻址
- 内存分段管理思想
- 实地址模式下的内存地址变换
- 段寄存器的应用
- 堆栈的概念
内存储器管理
- 8088 CPU是16位体系结构的微处理器
- 可以同时处理(产生)16位二进制码
- 直接管理64K个内存单元
- 如何使8088 CPU管理1MB内存
- 通过内存分段管理方式实现
- 由两个16位的地址产生一个20位地址
内存地址变换
- 物理地址:每个内存单元在整个内存空间中的唯一地址
- 内存地址变换:将32位的逻辑地址(段基地址+偏移地址)变换为20位物理地址
内存单元的编址
- 内存每个单元的地址在逻辑上都由两部分组成:
- 段(基)地址
- 指示存储单元在整个内存空间中处于哪个区域(段)
- 段内地址(相对地址/偏移地址)
- 指示存储单元在段中的相对位置(与段中第1个单元的距离)
- 逻辑段的起始地址称为段首
- 每个逻辑段内的第一个单元
- 由偏移地址的定义得:段首的偏移地址为0
- 段(基)地址
由于段首的偏移地址为0,所以将后16位0写为4位0,这样16位段基地址加上4位偏移地址构成20位的物理地址
物理地址 = 段基地址 × 16+偏移地址
- 段基地址×16相当于段基地址左移4位
逻辑段
【例】1M的内存空间需要20位的地址来管理,而8088是16位的体系结构,能够管理的内存空间是64K,现在想让8088CPU能够管理1M大小的内存空间,就需要对内存空间进行分段。
-
物理分段的话,1M的内存空间可以分为16个64K大小的内存空间,也就是将1M的内存空间分为16个物理上的内存段
-
物理分段可能会造成内存空间的浪费,所以我们在内存管理上常采用逻辑分段的方式
-
逻辑分段可以根据需要不断调整段的大小,同一块内存区域在不同的时间点可以属于不同的程序,也叫分时复用。逻辑段并不是物理上真实存在的段,而是逻辑上的段
-
由于段基地址有16位,所以在逻辑层面上内存空间最多可以分为64K个逻辑段
段寄存器
-
作用:用于存放相应逻辑段的段基地址
-
8088/8086内存中逻辑段可以有64K个,它们可以分为四种类型
- 代码段 —— 存放指令代码
- 数据段 —— 存放操作的数据
- 附加段 —— 存放操作的数据
- 堆栈段 —— 存放暂时不用但需保存的数据,比如子函数调用等
-
8086/8088内存中每类逻辑段的数量
- 最多为64K个
-
四种类型的逻辑段对应着四个段寄存器。段寄存器的值表明相应逻辑段的段基地址在内存中的位置:
- CS:代码段寄存器,存放代码段的段基地址。
- DS:数据段寄存器 ,存放数据段的段基地址。
- ES:附加段寄存器,存放数据段的段基地址。
- SS:堆栈段寄存器, 存放堆栈段的段基地址
-
每个程序最多只能分为4段
【例1】已知数据的段基地址和偏移地址,计算该数据所在内存单元的物理地址
- 问:设某操作数存放在数据段,DS=250AH,数据所在单元的偏移地址=0204H。
- 答:则该操作数所在单元的物理地址为:
- 250AH ×16+0204H = 252A4H
逻辑段与逻辑地址
-
内存的分段是逻辑分段,不是物理段。各个逻辑段在地址上可以不相连、可以部分重合,也可以完全重合。
-
每个内存单元具有唯一物理地址,但可能具有多个逻辑地址。即:
-
一个内存单元可以同时处于两个逻辑段
-
一个内存单元可以在不同的时刻属于相同(或不同)类型的段
-
一个内存单元在同一时刻可以属于不同类型的段
-
-
同一程序模块装入内存时,不同类型的段可以装入在相同/不同的物理空间
- 两个逻辑段完全重合或部分重合
-
两个不同的程序模块装入内存时, 同一类型的逻辑段也可以装入相同或不同的物理空间中
堆栈及堆栈段的使用
【例】已知段基地址1000H和物理地址10200H,求偏移地址
- 偏移地址 = 物理地址 - 段基地址 × 16
- 10200H - 1000H × 16 = 10200H - 10000H = 0200H
8088系统总线
-
CPU工作时序:
- CPU各引脚信号在时间上的关系
-
总线周期:
- CPU完成一次访问内存(或接口)操作所需要的时间。
- 一个总线周期至少包括4个时钟周期。
总线的工作时序图
【例】8088最小模式下的读总线周期的工作时序
- 横坐标是时间轴,纵坐标是各个引脚信号的幅值
- 竖着看时序图,各个时刻,每个引脚信号的信息
- CLK:时钟信号,CPU工作基准时间
- A19/S6-A16/S3:总线信号,4根信号线的集合,高4位地址信号状态信号分时复用,这里只关心它的状态是否有效;鼓起来表示有效,凹下去表示无效
- AD7-AD0:低8位地址和低8位数据信号分时复用。在传送地址信号时为单向,传送数据信号时为双向
- IO/#M:是一根信号线,有两种可能的状态(高电平和低电平)
- 在第一个时间点(第一条红线)
- 各个信号都处于无效状态,也就是之前的随机状态
- 在第二个时间点(第二条红线)
- A19/S6-A16/S3:4位有效的信号是地址输出
- A15-A8:地址输出有效
- AD7-AD0:8位有效的信号是地址输出
- ALE:由于地址信号有效,所以地址锁存器信号必须有效,将地址锁存在地址锁存器中
- IO/#M:此时访问内存的话IO/#M为低电平,访问接口的话IO/#M为高电平
- #RD:由于此时传送的是地址,所以读允许信号#RD必须无效(高电平);若有效,则表示把地址读入了CPU。
- DT/#R:数据收发器的传送方向控制。由于此时传送的是地址,不是数据,所以无效
- #DEN:是数据收发器的选通信号。由于此时传送的是地址,不是数据,所以无效
总线
- 是一组导线和相关的控制、驱动电路的集合。是计算机系统各部件之间传输地址、数据和控制信息的通道。
总线分类
- 按传输的数据类型可分为三类:
- 地址总线(AB)
- 数据总线(DB)
- 控制总线(CB)
- 按层次结构分为
- CPU总线:CPU内部寄存器与寄存器之间、寄存器与ALU之间的公共连接线
- 系统总线:计算机系统内各功能部件之间相互连接的总线
- 外部总线:计算机系统之间或计算机系统与其他系统之间信息传送的总线
总线结构
- 单总线结构
- 双总线结构
- 面向CPU的双总线结构
- 面向主存的双总线结构
- 多总线结构
总线功能
- 数据传送
- 仲裁控制
- 出错处理
- 总线驱动
总线性能指标
- 总线带宽(B/S)
- 单位时间内总线上可传送的数据量
- 总线带宽 = 位宽 × 工作频率
- 总线位宽(bit)
- 能同时传送的数据位数
- 总线的工作频率(MHz)
- 总线带宽 = ( 位宽 / 8 ) × ( 工作频率 / 每个存取周期的时钟数 )
有关总线的更多内容可见计算机组成原理——总线系统:传送门