第2章 16位和32位微处理器 16位微处理器8086/8088 2.1 32位微处理器80386 2.2 虽然 从 8位机、16位机 到64位机 经过了那么多年的发展,但无论从 基本概念、结构 指令系统等方面 都是8086、8088的延续和提高,所以这里讲的时候仍然是以8086为住来介绍
2.1.0 简介 8086:16位微处理器 采用单一的+5V电源和40条引脚的双列直插式封装;时钟频率为5MHz~10MHz,最快的指令执行时间为0.4µs。 8086有16根数据线和20根地址线,可以处理8位或16位数据,可寻址220即1MB的存储单元和64KB的I/O端口。 8088:准16位微处理器 设计的主要目的是为了与Intel原有的8位外围接口芯片直接兼容。 8088的内部寄存器、运算器以及内部数据总线都是按16位设计的,但外部数据总线只有8条,因此执行相同的程序,8088要比8086有较多的外部存取操作而执行得较慢。 1、时钟频率 也就是主频,一般时钟频率越高,理论上运算速度应该越快,但是不绝对。 2、可以寻址的单元数要讲 2
2.1.1 8086/8088 CPU的内部结构 图2.1 总线接口部件BIU 1 执行部件EU 2 BIU和EU的流水线管理 3
图2.1 8086微处理器内部结构图
1.总线接口部件BIU 图2.1 功能 负责CPU与内存或I/O端口传送指令或数据。 访问存储器时,需要生成20位的物理地址 要不断从内存中取指令并送到指令队列 CPU执行指令时,要配合执行部件EU从指定的内存单元或者外设端口中取数据,并将数据传送给EU;或把执行部件EU的操作结果传送给指定的存储器或者IO设备 组成:段寄存器、指令指针寄存器、地址加法器、指令预取队列及总线控制逻辑。
1)段寄存器 图2.1 所有寄存器都是16位的,因此,能够提供的最大地址空间只能为64 KB。 地址总线是20位,可以寻址1MB存储器空间,所以将存储器的空间分成若干段,每段最大为64KB。 段寄存器:用来存放段的起始地址(16位)的寄存器,设有四个段寄存器: CS 代码段寄存器(Code Segment register) DS 数据段寄存器(Data Segment register) SS 堆栈段寄存器(Stack Segment register) ES 附加数据段寄存器(Extra Segment register)
2)地址加法器 图2.1 作用:根据提供的16位信息产生20位地址。 已知:代码段寄存器CS存放当前代码段基地址,IP指令指针寄存器存放了下一条要执行指令的段内偏移地址,其中CS=2000H,IP=003AH。通过组合形成的20位存储单元寻址地址为多少?
3)指令预取队列 图2.1 8086:指令预取队列为6字节 8088:指令预取队列为4字节 指令预取队列采用“先进先出”原则。 要执行的指令预先由BIU从内存取出放在队列中,然后EU再从队列中取出指令并执行。 一般情况下,EU每执行完一条指令,就可以立即从指令队列中取指令执行,从而提高了CPU的效率。
4)总线控制逻辑 8086分配20条引脚线传送20位地址、16位数据和4位状态信息,这就必须要分时传送。 总线控制逻辑的功能,就是以逻辑控制方法实现上述信息的分时传送。是处理器和外界总线联系的转接电路。
2.执行部件EU 图2.1 功能 负责指令的译码和执行。 负责向总线接口部件BIU提供偏移地址。 对通用寄存器和标志寄存器FR进行管理。 组成:算术逻辑单元(ALU) 、1个标志寄存器、8个通用寄存器、1个数据暂存寄存器和EU控制电路。
执行部件EU 图2.1 算术逻辑单元ALU(Arithmetic and Logic Unit) 进行所有的算术和逻辑运算 EU控制器 标志寄存器FR:存放ALU运算结果的状态和控制标志。 通用寄存器: 4个16位数据寄存器AX、BX、CX、DX 4个16位指针与变址寄存器:SI、DI、SP、BP
3.BIU和EU的流水线管理 (1)每当8086的指令队列中有2个空字节或8088的指令队列有1个空字节,BIU就会自动把后面的指令从存储器取到指令队列中,从而提高了CPU执行指令的速度。 (2)每当EU准备执行一条指令时,它会从指令队列前部取出指令,进行译码,然后去执行。 (3)当指令队列已满,且EU对BIU又没有总线访问请求时,BIU进入空闲状态。 (4)在执行转移指令、调用指令和返回指令时,如果要执行的指令不在指令队列中,则指令队列中原有内容被自动清除,BIU会重新取指令,把将要转入的程序段的指令装入到指令队列中。 在执行指令时,如果必须访问存储器或I/O端口,EU就会请求BIU去完成访问外部的操作,如果此时BIU正好处于空闲状态,那么会立即响应EU的请求。若EU向BIU发出请求访问时,BIU正在将某条指令取到指令队列中,此时BIU首先完成取指令操作,然后再去响应EU发出的访问外界的请求。
小结 1、8086/8088微处理器内部包括哪两部分?每一部分的功能是什么? 2、BIU、EU两部分各自的组成。 3、8086微处理器的基本指标:几位机?多少引脚?地址线、数据线各有多少条?供电电压是多少?主频是多少?能够访问的存储器空间有多大?能够访问的IO端口有多少?
2.1.2 8086/8088 CPU的寄存器结构 数据寄存器AX、BX、CX、DX 1 指令指针寄存器BP、SP、SI、DI 2 图2.2 数据寄存器AX、BX、CX、DX 1 指令指针寄存器BP、SP、SI、DI 2 标志寄存器FR 3 段寄存器CS、DS、SS、ES 4
图2.2 8086/8088的寄存器结构
1)数据寄存器 数据寄存器 可分为两个8位,主要用于数据操作 16位 8 8 AL AH AX AX BL BH BX BX CL CH 累加器(Accumulator) 数据寄存器 可分为两个8位,主要用于数据操作 BL BH BX BX 基址寄存器(Base) CL CH CX CX 计数寄存器(Count) DL DH DX DX 数据寄存器(Data) EU中有4个16位的数据寄存器AX、BX、CX、DX 每个数据寄存器又可分为高字节H和低字节L寄存器,即AH、BH、CH、DH和AL、BL、CL、DL两组。 每个寄存器 又有特殊用途,名字是因此而取 16位数据寄存器主要用于存放数据,也可存放地址,而8位寄存器只能用于存放数据,它们均可以用寄存器名来独立寻址、独立使用。 16
2)地址指针寄存器和变址寄存器 表2.1 SP BP SI DI 地址指针主要用于地址操作 堆栈指针(Stack Pointer) 基址指针(Base Pointer) 表2.1 SI 源变址指针(Source Index) DI 目的变址指针(Destination Index) 都是16位,一般用来存放偏移地址。 指针寄存器SP和BP用来存取位于当前堆栈段中的数据,但SP和BP使用上有区别。 堆栈指针寄存器SP给出栈顶的偏移地址。 基址指针寄存器BP用来存放位于堆栈段中的一个数据区基址的偏移地址。 源变址寄存器SI和目的变址寄存器DI用来存放当前数据段的偏移地址。
2.指令指针寄存器IP 16位,存放着BIU要取的下一条指令的偏移地址。 指令代码存放在存储器的代码段,CPU利用CS和IP取得要执行的指令。 修改IP中的内容,就可以改变指令的执行流向。
3.标志寄存器(16位) 16位标志寄存器FR用于反映指令执行结果或控制指令执行的形式。 只用了其中的9位,分为:状态标志位和控制标志位。
标志寄存器 OF(Overflow Flag):溢出标志(指补码) OF=1:在运算过程中,如操作数超过了机器表示的范围称为溢出。 求解方法:最高位进位次高位进位 字节允许范围:-128—+127 字允许范围:-32768—+32767 PF(Parity Flag):奇偶标志 PF=1: 运算结果中低8位有偶数个1。 PF=0: 运算结果中低8位有奇数个1。 21
标志寄存器 CF(Carry Flag):进位/借位标志 CF=1:最高位需要向前产生进位/借位。 CF=0:最高位不会向前产生进位/借位。 AF(Auxiliary Carry Flag):辅助进位标志 AF=1:数据的第3位(半个字节)需要向前产生进位/借位。 AF=0:数据的第3位(半个字节)不会向前产生进位/借位。 22
标志寄存器 SF(Sign Flag):符号标志 SF=1:运算结果的最高位为1,如果为带符号数,则为负数。 带符号数的最高位为符号位;而无符号数的 最高位为数值位。 ZF(Zero Flag):全零标志 ZF=1:运算结果为全0。不包括进位的情况 ZF=0:运算结果不为0。 23
标志寄存器 —控制标志 控制标志位的值不由数据运算的结果决定,而由专用指令直接赋值 控制标志决定了后续指令的执行情况 DF(Direction Flag):方向控制标志位 用于串处理指令,控制从前往后、还是从后往前对字符串进行操作处理 DF=1,每次串处理操作后使变址寄存器SI和DI的值递减,使串处理从高地址向低地址方向处理。 DF=0,每次串处理操作后使变址寄存器SI和DI的值递增,使串处理从低地址向高地址方向处理。 24
标志寄存器 —控制标志 IF(Interupt Flag):中断允许/禁止标志位。STI\CLI IF=1, 允许外部可屏蔽中断。CPU可以响应可屏蔽中断请求。 IF=0, 关闭中断。CPU禁止响应可屏蔽中断请求。 IF的状态对不可屏蔽中断和内部软中断没有影响。 TF(Trap Flag):跟踪(陷阱)标志位。系统调试用。 TF=1,每执行一条指令后,自动产生一次内部中断,使CPU处于单步执行指令工作方式,便于进行程序调试,用户能检查程序。 TF=0, CPU正常工作,不产生陷阱。 25
例:2个数相加后,分析各标志位的值 + 运算结果最高位为1 ∴SF=1; 运算结果本身≠0 ∴ZF=0; + 1 运算结果最高位为1 ∴SF=1; 运算结果本身≠0 ∴ZF=0; 结果中1的个数为偶数个 ∴PF=1; 最高位没有进位 ∴CF=0; 第三位向第四位有进位 ∴AF=1; 次高位向最高位有进位 ,最高位向前没有进位,∴OF=10=1 26 注意:带符号数的运算结果是否正确看OF,无符号数看CF
4.段寄存器 图2.1 存储器分段的概念 ★ 逻辑地址和物理地址 ★ 堆栈 ★ 段寄存器的使用 ★
1)存储器分段的概念 为什么要分段? 如何分段: 所谓分段技术就是把1MB的存储空间分成若干逻辑段,每个逻辑段最大具有64 KB的存储空间,并要求逻辑段的起始单元地址能被16整除。 段内地址是连续的,段与段之间是相互独立的。逻辑段可以在整个存储空间浮动,即段的排列可以连续、分开、部分重叠或完全重叠,非常灵活。 8086/8088有20位地址线,能够寻址1 MB的内存空间; CPU内部存放地址信息的IP、SP、SI、DI或BX等寄存器却只有16位,只能寻址64KB存储空间。 28
图2.4 逻辑分段的示意图 某一个存储单元可以属于不同的逻辑段。每个段区的大小允许根据实际需要来分配,不一定要达到64KB 图2.4 逻辑分段的示意图 只要修改段寄存器的内容,就可以将相应的存放区设置在内存存储空间的任何位置上。这些区域可以相互独立,也可以部分或完全重叠。 某一个存储单元可以属于不同的逻辑段。每个段区的大小允许根据实际需要来分配,不一定要达到64KB 29
2)逻辑地址和物理地址 段首址:段的第一个单元的地址(20位),最低4位是全0(即段首址是16的整数倍)。 段基址:段首址的高16位。段基址存放在段寄存器中。 偏移地址:段内存储单元距离段首地址的偏移量(以字节数计算,16位),也称有效地址EA。偏移地址存放在IP、BP、SI、DI或BX中,或者是通过计算得到。 逻辑地址:通常用段基址:偏移地址的形式来描述,在程序中使用。
物理地址的形成 物理地址:指CPU和存储器进行数据交换时实际寻址所使用的地址,是用20位二进制数或5位十六进制数表示的地址。 任何一个单元的20位物理地址都是由它的逻辑地址变换得到的: 物理地址=段基址×16+偏移地址
注意 一个存储单元的物理地址是唯一的,而逻辑地址是可以不唯一的。 存储单元 物理地址 11230H 11231H 11232H …… 存储单元 物理地址 11230H 11231H 11232H …… 1123FH 11240H 11241H 11242H 11243H 段基址 1123H 偏移量 13H 段基址1124H 偏移量 03H
3)堆栈 堆栈是以“先进后出”或“后进先出”原则管理的存储区域。采用段定义语句在存储器中定义,最大为64KB。可在1MB的存储空间内浮动。 堆栈段所在存储区中的位置由堆栈段寄存器SS和堆栈指针SP来指示。 SS给出堆栈段的段基址 SP存放栈顶地址,指出从栈顶到段首址的偏移量。 堆栈操作有入栈(PUSH)和出栈(POP)两种。 堆栈段也采用段定义语句在存储器中定义,最大为64KB。可在1MB的存储空间内浮动。 栈顶与栈底之间单元中的内容是堆栈段中的有效数据。
4)段寄存器的使用 图2.7 表2.2 四个段寄存器分别指明四个现行可寻址的逻辑段: (1)代码段(Code Segment):用来存放当前正在运行的程序。系统在取指令时将寻址代码段,其段基址和偏移地址分别由段寄存器CS和指令指针IP给出。 (2)数据段(Data Segment):存放当前运行程序所用的数据。用户在寻址该段内的数据时,可以缺省段的说明,其偏移地址可通过多种寻址方式形成。 (3)堆栈段(Stack Segment):系统在执行栈操作指令时将寻址堆栈段,段基址和偏移地址分别由段寄存器SS和堆栈指针SP提供。 (4)附加数据段(Extra Segment):该段是一个辅助的数据区,也用于数据的保存。用户在访问段内的数据时,其偏移地址同样可以通过多种寻址方式来形成,但在偏移地址前要加上段的说明(即段跨越前缀ES)。
图2.7 段寄存器的使用情况 段基地址可以由默认的段寄存器提供,也可以由指定的段寄存器提供,这叫段超越。 36
小结 1、8086CPU内部有哪些寄存器?各自的名字。 2、由逻辑地址如何得到物理地址。 3、存储器访问的时候为什么要分段?分段要求每个段大小不超过64K,每个段都要从末位为0的地址开始。
最小模式: 时:系统只有8086或8088一个微处理器。所有控制信号直接由CPU提供 8086工作有2种工作模式:最小模式、最大模式。由第33引脚 控制 最小模式: 时:系统只有8086或8088一个微处理器。所有控制信号直接由CPU提供 最大模式: 时,两个或多个微处理器(主处理器和协处理器)组成中(大)规模系统,最大模式下,许多总线控制信号不是由8086直接产生的,而由S0S1S2通过Intel 8288总线控制器提供 不同的工作模式下,CPU有一部分引脚具有不同的功能 学引脚的时候 注意 38 38
引脚信号 引脚的功能 用英文单词或英文缩写表示引脚名称 信号的流向 微处理器输出到外部,从外部输入到微处理器内部 信号的逻辑状态 低电平有效,高电平有效,上升沿或下降沿有效 高电平和低电平都有效 三态能力 高阻状态放弃对引脚的控制 高电平和低电平都有效 用于信号线 可以输入输出高电平或者低电平。 课件中星号* 表示低有效
图2.8 8086/8088CPU的引脚信号
补充:8086总线周期的概念2.1.5节 8086CPU通过总线对存储器或者IO端口进行一次信息的输入/输出过程,称为总线操作,执行该操作需要的时间叫做总线周期。 一个最基本的总线周期由4个时钟周期组成。时钟周期和主频有关系,是最基本的计量单位。 习惯上将4个时钟周期分别称为4个状态,即T1状态、T2状态、T3状态和T4状态。
AD15~AD0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 地址/数据复用引脚。 在总线周期的T1状态用来输出要访问的存储器或I/O端口地址,在T2~T4状态,作为数据传输线。 在8088中,只有AD7~AD08条地址/数据线,AD15~AD8只用来输出地址。
A19/S6~A16/S3 8086 地址/状态复用引脚,三态,分时输出。 在T1状态:输出高4位地址。 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 地址/状态复用引脚,三态,分时输出。 在T1状态:输出高4位地址。 访问存储器时:A19~A16与AD15 ~AD0组 成20位地址; 访问I/O端口时:不使用这4条引线。 在T2~T4状态:输出状态信息。 S6=0,表示当前8086/8088与总线相 连(S6始终保持低电平)。 S5 用来指示状态寄存器中的中断允 许标志IF的状态 (S5为1允许中断,S5为 0禁止中断) 。 S4和S3指示正在使用的段寄存器。
8086 高8位数据总线允许/状态复用引脚,三态,输出。 在T1状态: 输出,若 =0,表示高8位数据线D15~D8上的数据有效。 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 高8位数据总线允许/状态复用引脚,三态,输出。 在T1状态: 输出,若 =0,表示高8位数据线D15~D8上的数据有效。 在T2~T4状态:输出S7(无意义)。
ALE 8086 地址锁存允许信号,输出,正脉冲。 提供给地址锁存器8282的控制信号。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 地址锁存允许信号,输出,正脉冲。 提供给地址锁存器8282的控制信号。 在任何一个总线周期的T1状态,ALE输出有效电平,以表示当前总线上输出的是地址信息,要求进行地址锁存。
RESET 复位信号,输入,高电平有效。 复位信号至少维持4个时钟周期的高电平,接通电源上电时,复位信号不能小于50μs。
READY 8086 “准备好”信号,输入,高电平有效 由所寻址的存储器或I/O端口发来的响应信号,表明存储器或I/O端口的状态。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 “准备好”信号,输入,高电平有效 由所寻址的存储器或I/O端口发来的响应信号,表明存储器或I/O端口的状态。 CPU在T3采样READY,若READY=0,则在T3后插入一个或多个TW,直至READY=1,进入T4,完成数据传送,从而结束当前总线周期。
8086 读信号,三态、输出。 =0时,表示将要执行一个对存储器或I/O端口的读操作。 在读操作的总线周期的T2、T3和TW为低电平。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 读信号,三态、输出。 =0时,表示将要执行一个对存储器或I/O端口的读操作。 在读操作的总线周期的T2、T3和TW为低电平。 写信号,三态、输出。 =0时,表示将要执行一个对 存储器或I/O端口的写操作。 在写操作的总线周期的T2、T3和T4为 低电平。
NMI 8086 存储器/外设控制信号,输出 =1:访问存储器 =0:访问I/O端口 非屏蔽中断请求信号,输入,上升沿有效。 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK VCC AD15 A16/S3 A17/S4 A18/S5 A19/S6 BHE MN/MX RD HOLD* HLDA* WR* M/IO* DT/R* DEN* ALE* INTA* TEST READY RESET 8086 存储器/外设控制信号,输出 =1:访问存储器 =0:访问I/O端口 NMI 非屏蔽中断请求信号,输入,上升沿有效。 此请求不受IF的影响。只要此信号一出现,CPU就在现行指令结束后响应中断。 一般被用于存储芯片或I/O接口芯片的片选( /cs )译码电路中。 49
INTR 可屏蔽中断请求信号,输入,高电平有效。 当INTR=1时,表示外设提出了中断请求,8086/8088 在每个指令周期的最后一个T状态去采样此信号。 若IF=1,则CPU响应中断,转去执行中断服务程序。 可屏蔽中断响应信号,输出,低电平有效。 用于对外设的中断请求作出响应。连续周期中的两个负脉冲。第1个脉冲是通知外设接口,它的中断请求已获允许;外设接口收到第2个负脉冲后,往数据总线上放中断类型码。
HOLD、 HLDA HOLD:总线保持请求信号,输入,高电平有效 HLDA:总线保持响应信号,输出,高电平有效 HOLD信号是系统中的其它总线主控部件向CPU发出的请求占用总线的控制信号。当CPU从HOLD线上收到一个高电平请求信号时,如果CPU允许让出总线,就在当前总线周期完成时,于T4状态从HLDA线上发出一个应答信号,对HOLD请求作出响应。同时,CPU使地址/数据总线和控制总线处于浮空状态,从而让出了总线。 当请求部件完成对总线占用后,CPU就立即使HLDA变低,同时恢复对总线的控制。
数据收发控制信号,输出,三态。 用来控制数据总线驱动器8286的数据传送方向。 =1:发送数据 =0:接收数据 数据允许信号,输出,低电平有效,三态。 提供给数据总线收发器8286,表示CPU准备发送或接收一个数据。 它常作为数据总线驱动器的三态控制信号。
等待测试信号,输入,低电平有效。 用于多处理器系统中且只有在执行WAIT指令时才使用。 当CPU执行WAIT指令时,每隔5个时钟周期对该引脚进行一次测试:若 =1时,CPU将停止取下条指令而进入等待状态,重复执行WAIT指令,直至该信号为0,CPU才继续往下执行被暂停的指令。 等待期间允许外部中断。 WAIT指令可使CPU与外部硬件同步, 相当于外部硬件的同步信号。
CLK 系统时钟,输入 通常与8284A时钟发生器的时钟输出端CLK相连。该时钟信号的低/高之比常采用2:1。 8086 CPU的标准时钟频率为5 MHz。
3. 8088的引脚特性 8088和8086之间引脚上的不同主要表现在: (1)由于8088 CPU外部一次只传送8位数据,因此其引脚A15~A8仅用于输出地址信号,而8086则将此8条线变为双向分时复用的AD15~AD8。 (2)8086 CPU上的 信号在8088上变为 (HIGH)信号。这是一条状态输出线,它与 和 信号一起,决定了8088 CPU在最小模式下现行总线周期的状态。 (3)8088的存储器/外设控制引脚是 。
2.1.4 8086系统的工作模式 8086系统可有最小模式和最大模式。区别在于: 一、最小模式系统 2.1.4 8086系统的工作模式 8086系统可有最小模式和最大模式。区别在于: 最小模式 最大模式 MN/MX引脚接+5V MN/MX引脚接地 构成单处理器系统 构成多处理器/协处理器系统 系统控制信号由CPU提供 系统控制信号由总线控制器8288提供 一、最小模式系统 最小模式系统中,要有CPU、存储器、IO接口芯片外,还需 1片8284A时钟发生器 3片8282/8283或74LS373做地址锁存器 2片8286/8287或者74LS245作为双向数据总线收发器 当 =1时,8086 CPU工作在最小模式,即单处理器系统方式。 此时,构成的微型机中只包括一个8086或8088 CPU,且系统总线的所有控制信号都由CPU直接给出,系统中的总线控制逻辑电路被减到最少,适合于较小规模的应用。 56 56
图2.9 8086最小模式下的典型配置 Intel 8282是具有三态缓冲的单向8位锁存器。锁存20位地址+/BHE, 所以需要3片。 8284A时钟发生器,能提供恒定的时钟信号(5MHZ),还能对外界输入的准备就绪信号RDY和复位信号进行同步操作。 时钟发生器8284A 地址锁存器8282 数据收发器8286 Intel 8282是具有三态缓冲的单向8位锁存器。锁存20位地址+/BHE, 所以需要3片。 8086/8088CPU所需的时钟信号由外部的时钟发生器提供。8284A是Intel公司专为8086设计的时钟信号发生器,能产生8086所需的5MHz系统时钟信号,即系统主频。 Intel 8286是8位双向三态缓冲器。能增强驱动能力,又叫总线驱动器。数据总线是16位,所以需要2片。 57
1、地址锁存器8282 8282 DI 1 2 3 4 5 6 7 DO D Q CLK STB OE 为什么要使用地址锁存器?P32 CPU与存储器进行数据交换时,CPU要先送出地址信号,然后发出控制信号并传送数据,由于8086引脚限制,数据线和地址线分时复用一组总线,所以要加入地址锁存器,先锁存地址,使在读写总线周期内地址稳定。 由于8086/8088的部分地址线和数据线采用分时复用的技术,在一个总线周期内总线首先传送地址,然后传送数据。 在每个总线周期的T1状态利用地址锁存允许信号ALE的后沿,将地址信息锁存到地址锁存器内,经锁存后的地址信号可以在整个总线周期保持不变,从而为外部提供稳定的地址信息。 使用时,将8282的选通信号输入端STB与ALE相连。 当ALE有效时,8086的地址信号被锁存并以同相方式传至输出端,供存储器芯片和I/O接口芯片使用。 地址锁存器8282内部结构 58 58
OE为有效电平(低电平)时,正常输出;为无效电平(高电平)时,输出高阻 地址锁存功能总结 STB为高电平期间,输出等于输入(跟随);为下降沿时,输出锁存,与输入无关(输出保持) OE为有效电平(低电平)时,正常输出;为无效电平(高电平)时,输出高阻 ALE为8088/8086地址锁存允许, 高电平有效, 输出,复用线上出现地址时为高电平 锁存器的DI0-DI7与CPU的地址/数据复用线相连,STB与ALE相连。ALE为正脉冲时,输出地址;为低电平时,输出锁存,与数据无关 59
图2.11 8282锁存器与8086的连接
2、双向数据收发器8286内部结构 为什么要用数据收发器? 8286 OE T A 1 2 3 5 4 6 7 B A B 功能表 OE T B 为什么要用数据收发器? 功能表 OE T 传送方向 1 Ai→Bi Bi→Ai 高阻状态 8086驱动数据的负载能力有限,当挂在数据总线上的部件增加时,可以利用数据收发器增加驱动能力。 61 61
双向数据收发器8286引脚信号 8286 B A 1 2 3 4 5 6 7 OE GND T V CC 8 9 10 20 19 18 /OE是输出允许信号,当/OE=0时允许数据通过 8086的/DEN脚是数据允许信号 /DEN脚 和/OE相连,当CPU有数据输出时, /DEN脚的低电平使得/OE为低电平,数据总线上的数据可以通过8286和存储器或IO端口交换数据 T信号控制数据传送方向 8086的DT/R是数据发送/接收控制信号。 T与DT/R相连。当DT/R=1(CPU 发送数据),使得T=1,8286 A端的数据传送到B端。 B A 1 2 3 4 5 6 7 OE GND T V CC 8286 8 9 10 20 19 18 17 16 15 14 13 12 11 当系统中所连接的存储器及I/O设备较多时,为了使系统能稳定工作,可以采用发送器和接收器来增加驱动能力。发送器和接收器简称为收发器,也常称为总线驱动器。 8286的数据线有两组,A7~A0、B7~B0,引脚T用来控制数据传输的方向,当T=1时,方向为A→B;当T=0时,方向为B→A。 是输出允许信号,当它为0时,允许数据传送。 8086的数据总线是16位,如果要选用8286做总线驱动器,则需要2片。 如果是较小规模的最小模式系统,不需要总线驱动器,那么就用CPU的 M/IO 、RD 、WR组合起来决定系统中数据传输的方式。 62 62
图2.12 8286收发器和8088CPU的连接
最小模式总线连接 64
2.1.5 8086/8088的操作和时序 指令周期与总线周期 1 几种基本时序 2
1.指令周期与总线周期 指令周期:执行一条指令所需要的时间。不同指令的指令周期在时间上是不相等的。 总线周期:CPU访问一次存储器或I/O接口所需要的时间。一个指令周期由一个或几个总线周期组成。 时钟周期:执行指令的所有操作都是在时钟脉冲的控制下一步一步进行的。时钟周期是CPU的基本时间计量单位。时钟周期由主频决定。
图2.15 典型的8086总线周期序列 (1)Tw 等待周期:当存储器或者外设没有准备就绪时,CPU就要插入Tw周期,等待外设或者存储器准备好。 (2)Ti 空闲周期:CPU不使用总线、没有操作的时候。 Tw:当被写入数据或被读取数据的存储器或外设在速度上跟不上CPU的要求时,就会由存储器或外设通过READY信号线在T3状态启动之前向CPU发一个READY无效信息,表示数据未就绪,于是CPU将在T3之后插入1个或多个附加的时钟周期TW(等待状态)。当存储器或外设完成数据的读/写时,便在READY线上发出有效信号,CPU接到此信号,会自动脱离TW而进入T4状态。 Ti:总线周期只用于CPU和存储器或I/O端口之间传送数据和供填充指令队列,如果在1个总线周期之后,不立即执行下1个总线周期,那么,系统总线就处于空闲状态,即执行空闲周期TI。在空闲周期中,可以包含1个时钟周期或多个时钟周期。 67
2.几种基本时序 系统的复位和启动操作 ★ 总线读/写操作 ★ 中断响应操作 ★
1)系统的复位和启动操作 RESET引脚至少维持4个时钟周期的高电平信号时,8086/8088复位。如果是初次加电引起的复位,则要求维持不小于50μs的高电平。 8086/8088复位后将从内存的FFFF0H处开始执行指令。因此,一般在该处放一条无条件转移指令,转移到系统程序的入口处。这样系统一旦被启动,便自动进入系统程序。 FR 寄存器清零,所以IF=0,默认是关中断的。
图2.16 8086的复位操作时序 复位的过程会把所有具有三态的输出引脚置成浮空状态,例如AD0-15、M/IO等引脚;不具有三态的引脚都置为无效状态。
最小模式下的总线读操作总线读操作 (CPU从存储器或I/O端口读取数据)
最小模式下的总线写操作 CPU将数据写入存储器或I/O端口
3)中断响应操作 当8086/8088CPU收到外界从INTR引脚上送来的中断请求信号,并且满足IF=1时,CPU在执行完当前指令后,便执行一个中断响应时序。
2.1.6 8086/8088的存储器组织 8086存储器组织 1 8088存储器组织 2
8086共有16根数据线,一次数据传送是2个字节,那么要送入哪两个存储单元呢? 奇区和偶区 在存储器中以字节为单位存储。每个存储单元有唯一的地址确定(即存储地址空间为00000H-FFFFFH)。 8086的1MB存储空间实际上分为两个512KB的存储体,分别叫奇存储体(奇区)和偶存储体(偶区) 。 8086共有16根数据线,一次数据传送是2个字节,那么要送入哪两个存储单元呢? 地址 内容 00000H 00001H 00002H 00003H FFFFEH 偶地址存储体 512K*8 bit A0=0 奇地址存储体 BHE=0 FFFFFH 低字节低地址 高字节高地址 a)存储器地址空间分配
8086存储器的分体结构 CPU和存储器的硬件连接 D7 ~D0 D15 ~D8 BHE A0 A19 ~A1 b)存储体与总线的连接 DB 奇地址存储体 SEL A18 ~ A0 D7 ~D0 偶地址存储体 SEL A18 ~ A0 A19 ~A1 BHE A0 CPU和存储器的硬件连接: 1、先分析两个存储体的地址线、数据线、控制线 2、分析使用CPU的A1-A19和两个存储体的地址线相连。 3、数据线:两个存储体分别接收8位数据,CPU一次输出16位数据,该怎么连接呢?按照高字节高地址,低字节低地址的顺序,从偶地址开始访问,所以低字节在偶地址(偶存储体),高字节在奇地址(奇存储体) 4、分别的选通线:A0=0 偶地址 BHE有效时数据高8位有效。 偶存储体与数据总线D7~D0相连,该存储体中每个地址均为偶数地址; 奇存储体与数据总线D15~D8相连,该存储体中每个地址均为奇数地址 b)存储体与总线的连接 /BHE A0 读/写的字节 从偶地址读写高低两个字节 1 从奇数地址读写一个字节 从偶数地址读写一个字节 无效
数据在存储器的存储方式(地址为20位的,这里省略了) 数据在存储器中怎样存放呢?怎样确定数据的地址? 低地址放低字节,高地址放高字节,字单元地址以低位地址表示 00H 01H 02H 03H 04H 05H 06H 07H 08H 31H CBH 74H 0BH 23H A4H 1FH 31H(字节) 字节地址 表示方法:(01H)=31H 字地址 74CBH(字) 1FA4230BH(双字) 双字地址 数据在存储器的存储方式(地址为20位的,这里省略了)
结论:为了加快程序运行速度,编程时注意从存储器偶地址开始存放字数据,这种存放方式也称为“对准存放” 存储器中字的存放 一个字可以从偶地址开始存放,也可以从奇地址开始存放,但是8086CPU访问存储器的时候,都是以字为单位进行的,并从偶地址开始 当CPU读写一个字时的不同情况: 结论:为了加快程序运行速度,编程时注意从存储器偶地址开始存放字数据,这种存放方式也称为“对准存放” 00 11 22 33 10000 从偶地址读一个字节 00 11 22 33 10000 从奇地址读一个字节 10001 00 00 11 22 33 10000 从偶地址读一个字 10002 10000 11 22 11 10001 22 10002 33 10003 从奇地址读一个字
2.8088存储器组织 由于每次传送的是8位数据,不存在奇偶存储体的概念。 存储器的20位地址线A19~A0和8根数据线分别和8088CPU的对应地址线与数据线相连。 8088CPU每访问一次存储器只读/写一个字节信息,而读/写一个字需要两次访问存储器才能完成。故在8088系统中,程序运行速度比在8086系统中要慢些。
结 束