8086CPU的基本性能指标:
( 1) 16位微处理器;
( 2)采用高速运算性能的 HMOS工艺制造,芯片上集成了 2.9
万只晶体管;
( 3)使用单一的 +5V电源,40条引脚双列直插式封装 (DIP);
( 4)时钟频率为 5MHz~10MHz,基本指令执行时间为
0.3ms~0.6ms
( 5) 16根数据线和 20根地址线,可寻址的地址空间达 1MB
( 6) 8086可以和浮点运算器、输入 /输出处理器或其他处理器组成多处理器系统,从而极大地提高了系统的数据吞吐能力和数据处理能力。
第 2章 8086系统结构
8086是 Intel系列的 16位微处理器,采用 HMOS工艺,内部包含 29000个晶体管。同时,Intel还推出了准 16位微处理器 8088
(内部总线 16位,外部总线 8位)。主要用于兼容当时的外围接口芯片。
8086CPU内部结构框图如下页图所示。从图中可以看出,
8086CPU有两部分组成,指令执行部件 EU和总线接口部件 BIU。
2-1 8086CPU的结构外部总线
AH AL
BH BL
CH CL
DH DL
SP
BP
DI
SI
通用寄存器
AX
BX
CX
DX
ALU数据总线( 16位)
运算寄存器
ALU
标志寄存器
EU 控制系统
∑
CS
DS
SS
ES
IP
内部暂存器
1 2 3 4 5 6
数据总线
8088:8位
8086:16位总线 控制逻辑地址总线
20位指令队列
8088
8086
Q总线
( 8位)
指令指针段寄存器执行单元 EU 总线接口单元 BIU
图 2.1.1 8086CPU内部结构框图一,8086CPU的内部结构
8086CPU有两部分组成,指令执行部件 EU和总线接口部件 BIU。
1,总线接口部件 BIU( Bus Interface Unit)
功能,总线接口部件 BIU是 CPU与外部(存储器和 I/O口)的接口,
它提供了 16位双向数据总线和 20位地址总线,完成所有的外部总线操作。具有 地址形成、取指令、指令排队、读 /写操作数、总线控制 等功能。
组成,4个 16位段地址寄存器( CS,DS,ES,SS)
16位指令指针寄存器 IP
20位物理地址加法器
6字节指令队列总线控制器
BIU的特点,8086/8088的 指令队列 分别为 6/4个字节,在执行指令的 同时,可从内存中取出后续的指令代码,放在指令队列中,可以提高 CPU的工作效率。 地址加法器 用来产生 20位物理地址。 8086可用 20位地址寻址 1M字节的内存空间,而 CPU内部的寄存器都是 16 位,因此需要由一个附加的机构来计算出 20位的物理地址,这个机构就是 20位的地址加法器。
例如,CS= 0FE00H,IP= 0400H,则表示要取指令代码的物理地址为 0FE400H。
2,指令执行部件 EU( Execution Unit)
功能,指令执行部件 EU完成指令译码和指令执行的工作。
组成,算术逻辑单元 ALU
标志寄存器 PSW
4个 16位通用寄存器( AX,BX,CX,DX)
4个 16位专用寄存器( BP,SP,SI,DI)
EU控制器
3,BIU与 EU的动作协调原则总线接口部件( BIU)和执行部件( EU)按以下流水线技术原则协调工作,共同完成所要求的信息处理任务:
( 1)每当 8086的指令队列中有 1个空字节时,BIU就会自动把指令从存储器取到指令队列中。其取指的顺序是按指令在程序中出现的前后顺序。
( 2) 每当 EU准备执行一条指令时,它会从 BIU部件的指令队列前部取出指令的代码,然后用几个时钟周期去执行指令 。 在执行指令的过程中,如果必须访问存储器或者 I/ O端口,那么 EU就会请求 BIU,进入总线周期,完成访问内存或者 I/ O端口的操作;
如果此时 BIU正好处于空闲状态,会立即响应 EU的总线请求 。 如
BIU正将某个指令字节取到指令队列中,则 BIU将首先完成这个取指令的总线周期,然后再去响应 EU发出的访问总线的请求 。
( 3) 当指令队列已满,且 EU又没有总线访问请求时,BIU便进入空闲状态 。
( 4) 在执行转移指令,调用指令和返回指令时,由于待执行指令的顺序发生了变化,则指令队列中已经装入的字节被自动消除,
BIU会接着往指令队列装入转向的另一程序段中的指令代码 。
BIU与 EU两者的工作是不同步的,8086可以在执行指令的同时,进行取指令代码的操作,即 BIU与 EU是一种并行工作方式,
改变了以往计算机取指令 → 译码 → 执行指令的串行工作方式,大大提高了工作效率 。
总结:
BIU状态:
( 1)将指令按序取入指令队列(指令队列中只要有两个以上空,
就取指令);
( 2)响应 EU的总线周期,完成访问存储器,I/O口;
( 3)空闲状态(指令队列不空,也无 EU的总线的请求)。
EU状态:
( 1)从 BIU指令队列前部取出指令,经指令译码后,执行指令;
( 2)访问存储器,I/O口,向 BIU提出总线周期申请;
( 3) BIU指令队列空时,EU处于等待状态。
4,80X86CPU的寄存器
8086CPU的寄存器可分为通用寄存器、指针和变址寄存器、
段寄存器指令指针及标志寄存器。
( 1) 通用寄存器(见教材 P25表 2-1)
8086有 4个 16位的通用寄存器( AX,BX,CX,DX),可以存放 16位的操作数,也可分为 8个 8位的寄存器( AL,AH;
BL,BH; CL,CH; DL,DH)来使用。除了作为通用寄存器外,它们还有专门的用途:
AX( Accumulator ):累加器,存放算术运算操作数、结果;
BX( Base ):基址寄存器;
CX( Count ):计数器寄存器;
DX( Data ):数据寄存器。
上面 4个 16位寄存器都具有通用性,从而提高了指令系统的灵活性。但在有些指令中,这些通用寄存器还各自有特定的用法,如下表所示。
表 2- 1 寄存器主要用途寄存器 操作 寄存器 操作
AX 字乘,字除,字 I/O CL 变量移位,循环移位
AL 字节乘,字节除,字节 I/O,查表转换,十进制运算 DX 字乘,字除,间接 I/O
AH 字节乘,字节除 SP 堆栈操作
BX 查表转换 SI 数据串操作指令
CX 数据串操作指令,循环指令 DI 数据串操作指令
( 2)指针和变址寄存器 (见教材 P25表 2-1)
8086有 4个 16位的指针或变址寄存器( SI,DI,SP,
BP )。
SI( Source Index ):源变址寄存器
DI( Destination Index ):目的变址寄存器
SP( Stack Point ):堆栈指针,基址指针
BP( Base Point ):基址指针
指针寄存器系统中有两个 16位的指针寄存器 SP和 BP.
BP 称为基址指针寄存器,用于存放偏移量,通常和 SS段寄存器配合使用,在间接寻址中用于定位堆栈段中的内存单元 。
SP 称为堆栈指针,用于存放偏移量,只能和 SS段寄存器配合使用,且始终指向堆栈的栈顶,在堆栈指令中隐含的使用它来定位栈顶数据。
注,BX称为基址寄存器,可以用于存放偏移量或者是偏移量的一部分 ( 后面介绍指令寻址方式时会详细分析 ),通常和 DS,ES这两个段寄存器配合使用,用于定位数据段或附加段中的内存单元 。
变址寄存器系统中有两个 16位的变址寄存器 SI和 DI,都用于指令的变址寻址方式。
SI 称为源变址寄存器,用于存放偏移量或偏移量的一部分,
通常和 DS,ES这两个段寄存器配合使用,用于定位数据段或附加段中的内存单元。在串操作指令中,用于指明源串偏移量。
DI 称为目的变址寄存器,用于存放偏移量或偏移量的一部分,
通常和 DS,ES这两个段寄存器配合使用,用于定位数据段或附加段中的内存单元。在串操作指令中,用于指明目的串偏移量。
( 3) 指令指针及标志寄存器
8086的指令指针及标志寄存器包括 IP,SP和 PSW 3个 16位寄存器。 IP,PSW是系统中的两个 16位控制寄存器。
指令指针寄存器 IP
IP 用来控制 CPU的指令执行顺序,用于存放偏移量,只能和代码段寄存器 CS配合使用,可以确定当前所要取的指令的内存地址,且始终指向代码段中下一条将要读取到 CPU指令队列的那条指令 。
顺序执行程序时,CPU每取一个指令字节,IP自动加 1,指向下一个要读取的字节; 修改 IP中内容的操作是 CPU在每读取一条指令到指令队列后自动进行的,使它指向要读取的下一条指令 。
跳转指令中可以隐含的修改 IP寄存器中的内容 。
标志寄存器 PSW
标志寄存器 PSW( 处理器状态字 ),用来存放 8086/8088CPU
在工作过程中的状态 。
PSW为 16位寄存器,其中共有 9个标志位,可分成两类:一类为状态标志,一类为控制标志 。
状态标志,表示前一步操作 ( 如加,减等 ) 执行以后,ALU所处的状态,后续操作可以根据这些状态标志进行判断,实现转移;
控制标志,可以通过指令人为设置,用以对某一种特定的功能起控制作用 ( 如中断屏蔽等 ),反映了人们对微机系统工作方式的可控制性 。
PSW中各标志位的安排如下表所示 。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
PSW是按位操作的。可以通过转移指令来判断标志位的变化,
从而实现程序中的分支结构或者循环结构。
PSW中各标志位含义如下:
① 状态标志,6个
CF— 进位标志位,实现加法 ( 或减法 ) 时,当最高位出现进位 ( 或借位 ),CF位自动置 1,反之置 0。
PF— 奇偶标志位,当运算结果的低 8位中 l的个数为 偶数 时,
则 PF位自动置 1,反之为 0( 和单片机相反 )。
AF— 半进位标志位,实现加法 ( 或减法 ) 时,当低四位向高四位有进位 ( 或借位 ),AF位自动置 1。 通常用于对 BCD算术运算结果的调整 。
例如,1101 1000+1010 1110=1 1000 0110其中 AF= 1,CF= 1
ZF— 零标志位,运算结果为 0时,ZF位自动置 1,否则清 0。
SF— 符号标志位,当运算结果的最高位为 1,SF自动位置 1,
否则清 0。 即与运算结果的最高位相同 。
OF— 溢出标志位,OF溢出的判断方法如下:
加法运算:
若两个加数的最高位为 0,而和的最高位为 1,则产生溢出;
若两个加数的最高位为 1,而和的最高位为 0,则产生溢出;
两个加数的最高位不相同时,不可能产生溢出 。
减法运算:
若被减数的最高位为 0,减数的最高位为 1,而差的最高位为 1,
则产生溢出;
若被减数的最高位为 1,减数的最高位为 0,而差的最高位为 0,
则产生溢出;
被减数及减数的最高位相同时,按两数的大小判断溢出 。
如果所进行的运算是带符号数的运算,则溢出标志恰好能够反映运算结果是否超出了 8位或 16位带符号数所能表达的范围,
即字节运算大于十 127或小于- 128时,字运算大于十 32767或小于- 32768时,该位置 1,反之为 0。
例如:
0101 0100 0011 1001
+ 0100 0101 0110 1010
1001 1001 1010 0011
CF= 0,AF= 1,PF= 1,ZF= 0,SF= 1,OF= 1( 两正数相加结果为负 )
一般来讲,不是每次运算后所有的标志都改变,只是在某些操作之后,才对其中某个标志进行检查 。
② 控制标志,3个
TF— 陷阱标志位 (单步标志位,跟踪标志 )。 当 TF位置 1时,将使 8086/8088进入单步工作方式,通常用于程序的调试 。
IF— 中断允许标志位,若 IF位置 1,则处理器可以响应可屏蔽中断,否则就不能响应可屏蔽中断 。
DF— 方向标志位,若 DF位置 1,则串操作指令的地址修改为自动减量方向,反之,为自动增量方向 。
( 1) CF标志位的实用价值:
a,如果用户需要进行多字节无符号数的算术运算,那么 CF标志就是低位字节和高位字节间进位和借位的桥梁。
8086/8088CPU提供的指令,能够直接处理的最大无符号数就是一个字( 16
位),如果超出这个范围,就必须使用多字节来表示要计算的数据。
这个原理不光只在 8086/8088芯片中有,任何芯片,无论它处理的数据范围多么大,它总是一个有限的单位,如果超出这个单位,就必须使用标志位作为运算的中介。
b,在执行移位指令时,CF标志用于存放移出位的值。
例如对 01010011实行逻辑右移,即把这个字节中的每一位向右移动一位,左边空出的那一位置为 0,以前最右边那一位就被移出字节范围外了,那么这一位就是移出位,移出位都是保存在 CF中的。这个例子中,移位完成后,CF应该等于 1。
c,CF标志位还能够为一些条件转移指令提供判别依据。
例如 JC指令,它就是先判别 CF标志位的值,如果 CF=1,就跳转到指令中给出地址继续执行程序,如果 CF=0,就不作跳转,CPU会顺序执行下一条指令。也就是说,在程序中,可以根据 CF标志取值的不同来实现程序的分支或循环结构。
( 2)奇偶标志位 PF( Parity Flag):
如果 CPU所执行的指令要影响 PF标志,并且该指令得到的数据结果低 8位中含有偶数个,1”时,PF=1;含有奇数个,1”,PF=0。
注意无论指令的操作数有多么长,只有低 8位数据中 1的个数能够影响到 PF标志的取值。
PF标志位的实用价值:
这个标志位对于校验操作是很有用的。这里以对 ASCII码的校验来说明它的应用,ASCII码占用一个字节,但是只有低 7位是真正的码值,最高位是校验位。如果使用奇校验,那么必须保证编码字节中始终保持有奇数个,1”,这种编码格式可以通过调整最高位的取值来实现,如果 ASCII码中已经有奇数个,1”,那么第 7
位应取值为 0;如果 ASCII码中仅有偶数个,1”,那么第 7位应取值为 1,使,1”的个数变为奇数。
现在,试设想计算机通过网络接收 ASCII码,如何判断收到的编码是否正确呢?
那就需要判断收到的字节中是否为奇数个,1”,如果为偶数个,1”,那么收到的编码一定是错误的,必须要求重新发送。
在判断,1”的个数时,PF标志的作用就体现出来了。通过 PF标志也可以使用条件转移指令来实现程序中的分支或循环结构。
通过奇偶校验码能够识别大部分经常出现的错码,但是并不能完全避免错码。
关于编码机制可以参见计算机组成原理中的相关内容,这里不作详细的介绍。
( 3)辅助进位标志位 AF:
AF标志,又称半进位标志,在 CPU执行算术运算指令时,如果该指令要影响
AF标志,并且用户把操作数看作无符号数,AF标志才有意义。
如果低字节中的低 4位向高 4位产生进位或借位时(也就是第 3位向第 4位产生进位或借位),AF被置为 1;否则,AF被置为 0。
判别标准:
和 CF一样,使用无符号数的加减运算来作判断,只是判断进位和借位的位置不在操作数的最高位,而是在低字节的第 3位。
实用价值:
AF标志的使用主要针对二 ----十进制调整(用二进制算术运算实现十进制算术运算的功能),单纯的二进制运算中,几乎不使用 AF标志。
使用二进制数表示十进制数 ----BCD码是用 4位二进制数表示 1位十进制数。我们知道,4位连续的二进制数实际上是一位十六进制的数位,在运算中是逢 16进 1
或借 1。如果能够通过某种调整机制把它变为逢 10进 1或借 1,那么就可以使用二进制运算来实现十进制运算。
AF标志位对于实现这种二 ----十进制调整机制是必不可少的,它就是用于表达一个字节中低 4位向高 4位的进位或借位情况的。
( 4)零值标志位 ZF:
如果 CPU执行的指令要影响 ZF标志,并且保证 ZF标志是有意义的,那么当指令得到的结果数据各位全为,0”时,则 ZF置,1”,否则 ZF置,0”。
实用价值:
ZF标志的使用主要是进行比较,并根据比较的结果来进行程序的分支或循环。
例如,对两个整数进行比较,即对两个整数进行相减的操作,如果两个数是相等的,那么结果为 0,ZF=1;如果不等,那么结果非 0,ZF=0。
比较的范围可以很广阔,不仅限于无符号数、补码,还可以对字符或者某些特定的编码进行比较。和 ZF标志相关的条件转移指令也很多,具体的应用示例在以后的课程中会遇到很多。
( 5)符号标志位 SF:
如果 CPU执行的指令要影响 SF标志,并且用户把指令得到的结果数据看作带符号数,那么当结果为负数时,SF置,1”;当结果为正数时,SF置,0”。即 SF
标志位的取值和结果数据的最高位是一致的,因为补码的最高位就是符号位。
实用价值:
主要用于对算术运算结果的符号进行判断,只有针对带符号的运算才是有意义的,可以通过两个带符号数经过减法运算后所得结果符号来判断哪一个数更大或者更小,从而结合条件转移指令来实现程序的分支或循环。
在 8086/8088指令系统中有与 SF标志直接相关的条件转移指令,这就比判断结果数据的最高位要方便得多。
( 6) 溢出标志位 OF:
如果 CPU执行算术运算指令,并且用户把操作数看作带符号数时,OF标志位的取值才有意义。如果运算结果超出了补码的表示范围(对字节来说,是 -128到
127,对字来说,是 -32768到 32767),那么解释为溢出,OF置为 1;如果运算结果没有超出补码的表示范围,OF置为 0。
b,正数 +正数:
若结果为正数,表示符号位没有丢掉,也就是没溢出,OF=0;
若结果为负数,表示符号位已经丢失,结果已经溢出,OF=1;
(等价运算:正数 -负数)
因为出现溢出时,参加运算的两个原始补码都没有超过表示范围,如果运算中超出了表示范围,只会是符号位超出了表示范围一位(只能是一位,不会多于一位),所以符号位丢没丢掉的问题和溢出问题是等价的,硬件逻辑也就是通过判断符号位有没有丢失来判断运算有没有溢出。
a,正数 +负数,OF=0 (等价运算:正数 -正数; 负数 -负数)
这种情况一定没有溢出,负数和正数是相互抵消的,得到的结果会比两个原始数据中较大的一个更靠近数轴的原点,所以一定不会超出定义的补码表示范围。
OF标志位的取值逻辑如下:
带符号数的加减运算可能出现的各种组合都可以等价替换为上面三种情况。
因为出现溢出时,参加运算的两个原始补码都没有超过表示范围,如果运算中超出了表示范围,只会是符号位超出了表示范围一位(只能是一位,不会多于一位),所以符号位丢没丢掉的问题和溢出问题是等价的,硬件逻辑也就是通过判断符号位有没有丢失来判断运算有没有溢出。
c,负数 +负数:
若结果为负数,表示符号位没有丢掉,也就是没溢出,OF=0;
若结果为正数,表示符号位已经丢失,结果已经溢出,OF=1;
(等价运算:负数 -正数)
实用价值:
主要用于实现程序分支或循环,8086/8088指令系统中有单独使用 OF标志位的条件转移指令,可以实现对溢出现象的判断和分支处理;也有结合使用
OF标志和 SF标志的条件转移指令,使用这些转移指令可以根据两个带符号数比较大小的结果来实现分支处理。这些细节将在介绍条件转移指令时详细介绍。
TF标志为用户单步调试自己的程序提供了相应的硬件基础。如果使用指令将 TF标志清 0,那么将会使 CPU退出单步运行模式,回到连续执行机器指令的状态。
( 7)单步(或跟踪)标志位 TF:
前面讲到的标志位都属于状态标志位,是指令根据自己的执行情况而为后续指令留下的一些可供参考的状态信息。 TF标志位是一个控制标志位,和前面所讲的标志位功能不同,它是用于触发单步中断的。
如果使用指令将 TF标志位置为 1,那么 CPU将进入单步执行指令的工作方式,每执行完一条指令就会触发单步中断,执行单步中断服务程序,一般会在屏幕上显示 CPU内部各寄存器和标志位的状态,以便用户观察该指令产生的影响。进入中断时,TF标志会自动被清 0,所以中断服务程序的执行并不会出现单步执行的情况,中断服务程序结束后 TF标志会恢复中断以前的设置。
实用价值:
使用户能够单步跟踪和调试机器指令组成的程序。
作为一个用户可设置的开关,可以控制 CPU是否处理可屏蔽中断,在程序执行不允许被打断的情况下,可以采用这个开关来屏蔽可屏蔽中断。
( 8)中断标志位 IF:
这也是一个控制标志位,用于控制 CPU是否处理可屏蔽中断。
如果使用指令将 IF标志置为 1,那么 CPU将会处理任何可屏蔽中断,如果使用指令将 IF标志置为 0,那么 CPU将不会处理 可屏蔽中断 。
实用价值:
例如,某些对执行时间要求非常严格的程序段,执行这种程序段时就不允许被中断打断,因为中断处理会添加额外的处理时间。
注意,IF标志只能屏蔽可屏蔽中断,对于一些由严重错误或故障引起的不可屏蔽中断则是无法屏蔽的。
对于标志寄存器 PSW中的标志位,一些标志位直接有条件转移指令与之对应,能够方便的通过这些标志位实现程序的分支或循环结构。一些标志位没有直接可用的条件转移指令与之对应,但是仍然可以用其他方法来进行判断,
从而实现分支或循环结构。关于哪些指令具体会对哪些标志位产生何种影响,
以及如何在程序设计中正确的使用标志位,将会在后面的课程中逐步熟悉起来。
( 9)方向标志位 DF:
这也是一个控制标志位,用于控制串操作指令存取数据的方向。如果使用指令将 DF标志置为 0,每执行完一次串操作以后,源串地址指针 SI和目的串地址指针 DI中的内容会自动递增;如果使用指令将 DF标志置为 1,那么每执行完一次串操作以后,SI和 DI中的内容会自动递减。
实用价值:
使用该控制标志,可以由用户来选择串操作指令存取数据的方向。串操作指令是一种特殊的指令,它能对一串相同类型的数据作相同的一次处理,
比使用循环结构的程序效率更高,因为串操作指令的循环是在指令内部完成的,而循环结构的程序要完成循环需要执行多条指令。
功能,段寄存器的内容与有效的地址偏移量一起,可确定内存的物理地址 。 通常 CS划定并控制程序区,DS和 ES控制数据区,
SS控制堆栈区 。
( 4)段寄存器段,内存中一段连续的空间,在程序中具有特定的用途。
段基址,段在内存中的起始地址 = 段基值 × 16 (左移 4位 )
8086CPU系统中共有 4个 16位段寄存器,用于存放程序所要使用的 4个存储段的 段基值,分别对应于内存中的四块存储区域,代码段 CS、堆栈段 SS、数据段 DS、附加段 ES。
代码段,用于存放程序的机器指令序列;
堆栈段,用于存放程序使用堆栈指令所保存的数据,自动保存的断点等信息;
数据段,存放程序直接使用的数据;
附加段,其中的内容不确定,可以由程序开发人员根据实际需要自己决定。
每个程序都可能会使用这样四个段,其中代码段是必须的,实用的程序通常至少包含代码段、堆栈段、数据段。
代码段寄存器 CS ( Code Segment)
数据段寄存器 DS ( Data Segment)
堆栈段寄存器 SS ( Stack Segment)
附加段寄存器 ES ( Extra Segment)
2-2 8086的引脚信号和功能如下页图所示,是 8088/8086CPU的外部结构,即引脚信号图。
8088/8086CPU芯片都是 40引脚双列直插式( DIP)封装的集成电路芯片,其中 32个引脚在两种工作模式下的名称和功能是相同的,还有 8个引脚( 24----37) 在不同的工作模式下,具有不同的名称和功能。
8086和 8088的外部引脚信号
1,两种模式下,名称和功能相同的 32个引脚
( 1) VCC,GND,电源、接地引脚,8088/8086CPU采用单一的 +5V电源,但有两个接地引脚。
( 3) A19/S6— A15/S3( Address Status Bus) (输出、三态),
高 4位地址 /状态复用信号输出引脚 (4条 ),分时输出地址的高 4位及状态信息。
S6 保持,0” 用以指示 8086/8088CPU当前与总线连通;
S5 为状态寄存器中断允许标志的状态,它在每个时钟周期开始时修改,若当前允许可屏蔽中断,则 S5置 1,若 S5 =0,则禁止一切可屏蔽中断;
( 2) AD15— AD0( Address Data Bus) (双向、三态),地址 /
数据复用信号输入 /输出引脚 (16条 ),分时输出低 16位地址信号及输入 /输出数据信号。通过时间上区分,T1状态输出低 16位地址信号,然后外部地址锁存,T3状态输入 /输出数据信号。
S4 S3 含 义
0 0 当前正在使用 ES
0 1 当前正在使用 SS
1 0 当前正在使用 CS,或者未用任何段寄存器
1 1 当前正在使用 DS
S4,S3共有四个组态,用以指明当前使用的段寄存器,如下表所示 。
( 4) NMI(Non-Maskable Interrupt),INTR( Interrupt Request)
NMI为 非屏蔽中断 请求信号 输入 引脚,高电平有效,上升沿触发,CPU
必须在当前指令结束后响应该中断,不受可屏蔽中断允许标志 IF的限制,不能用软件屏蔽 。
INTR为 可屏蔽中断 请求信号 输入 引脚,电平触发,CPU在指令的最后一个周期采样 INTR,在当前指令结束后响应该中断,可用软件通过复位内部中断允许标志 IF来屏蔽 INTR信号的中断请求 。
( 6) CLK( Clock) ( 输入 ),系统时钟信号 输入 引脚,时钟信号的方波信号,占空比约为 33%,即 1/3周期为高电平,2/3周期为低电平,8088/8086的时钟频率 ( 又称为主频 ) 为 4.77MHz,
即从该引脚输入的时钟信号的频率为 4.77MHz。 8086-1时钟频率为 10MHz,8086-2时钟频率为 8MHz。
( 5) RD( Read),读控制 输出 信号引脚,低电平有效,用以指明要执行一个对内存单元或 I/O端口的读操作,具体是读内存单元,还是读 I/O端口,取决于控制信号。
( 7) RESET( Reset ) (输入),复位信号 输入 引脚,高电平有效。 8088/8086CPU要求复位信号至少维持 4个时钟周期才能起到复位的效果,复位信号输入之后,CPU结束当前操作,进行复位操作,并对微处理器的标志寄存器 PSW,IP,DS,SS,ES寄存器及指令队列进行清零操作,而将 CS设置为 0FFFFH。
( 8) READY( Ready),,准备好,状态信号 输入 引脚,高电平有效,,Ready”输入引脚接收来自于内存单元或 I/O端口向 CPU发来的,准备好,状态信号,表明内存单元或 I/O端口已经准备好进行读 /写操作 。 该信号是协调 CPU与内存单元或
I/O端口之间进行信息传送的联络信号 。
CPU在 T3( 或 TW ) 状态采样 Ready信号,当 Ready=0
( 无效 ),则在 T3( 或 TW ) 状态结束后插入 TW状态 ( 等待周期 ),当 Ready=1( 有效 ),进入 T4状态,完成数据传送 。
( 9) TEST ( Test ),测试信号 输入 引脚,低电平有效,TEST
信号与 WAIT指令结合起来使用,CPU执行 WAIT指令后,处于等待状态,只有当 TEST引脚输入低电平时,系统才脱离等待状态,继续执行被暂停执行的指令。否则 CPU继续等待。
( 10) MN/MX( Minimum/Maximum Model Control),最小
/最大模式设置信号 输入 引脚,该输入引脚电平的高,低决定了 CPU工作在最小模式还是最大模式,当该引脚接 +5V时,
CPU工作于最小模式下,当该引脚接地时,CPU工作于最大模式下 。
( 11) BHE/S7( Bus High Enable/Status)(输出、三态),高
8位数据总线允许 /状态复用信号复用 输出 引脚。分时输出 BHE有效信号(表示高 8为数据线 D15— D8上的数据有效)和 S7 状态信号,但 S7未定义任何实际意义。
BHE信号与 A0信号配合,控制数据传送时的字,字节方式 。
具体规定如下表所示 。
BHE A0 操作 所用 DB总线引脚
0 0 从偶地址开始传送 1个字 ( 低字节在偶地址 ) AD15----AD0
0 1 从奇地址开始传送 1个字节 ( 高位字节 ) AD15----AD8
1 0 从偶地址开始传送 1个字节 ( 低位字节 ) AD7----AD0
1 1 无效表 BHE和 A0的代码组合和对应的操作
2,最小模式下的 24--31引脚当 8088/8086CPU的 MN/MX 引脚固定接 +5V时,CPU处于最小模式下,这时候剩余的 24— 31共 8个引脚的名称及功能如下:
( 1) M/IO ( Memory/Input and Output),存储器 I/O端口控制输出 信号,是 CPU区分进行存储器访问还是 I/O访问的输出控制信号。
M/IO=1,选择访问存储器(表示 CPU与存储器之间进行传送数据);
M/IO=0,选择访问 I/O端口(表示 CPU与之间 I/O端口进行传送数据)。
( 2) INTA( Interrupt Acknowledge) ( 输出 ),中断响应信号输出引脚,低电平有效,该引脚是 CPU响应中断请求后,向中断源发出的认可信号,
用以通知中断源,以便提供中断类型码 。 该信号为两个连续的负脉冲,在每个总线周期的 T2,T3( TW) 状态 INTA有效 。
第一个负脉冲,通知外部 I/O接口,它发出的中断请求已得到允许 。
第二个负脉冲,外部 I/O接口收到第二个负脉冲后,往数据总线上送自己的中断类型码,从而 CPU得到了有关此中断源的详细信息 。
( 3) ALE( Address Lock Enable) ( 输出 ),地址锁存允许输出信号引脚,高电平有效,在任何一个总线周期的 T1状态,ALE有效 。 CPU通过该引脚向地址锁存器 8282发出地址锁存允许信号,把当前地址 /数据复用总线上输出的地址信息锁存到地址锁存器 8282中去 。 注意,ALE信号不能被浮空 。
( 4) DEN( Data Enable) ( 输出,三态 ),数据允许输出信号引脚,
低电平有效,当 AD15----AD0作为数据总线使用时,DEN作为外部数据发送器
8286的选通信号,表示 CPU当前准备发送或接收一个数据 。 在访问存储器,I/O
端口或中断响应周期时 DEN有效 。
( 5) DT/R( Data Transmit/Receive) ( 输出,三态 ),数据收发控制信号输出引脚,CPU通过该引脚发出控制数据传送方向的控制信号,在使用
8286/8287作为数据总线收发器时,DT/R信号用以控制数据传送的方向,DT/R=1,
表示发送 ( 数据由 CPU经总线收发器 8286/8287输出 ) ; DT/R=0,表示接收 ( 数据由外设经总线收发器 8286/8287输入到 CPU) 。
( 6) WR( Write ) ( 输出,三态 ),写控制信号输出引脚,低电平有效,与 M/IO配合实现对存储单元,I/O端口进行写操作的控制 。 P34 表 2-6
注,读 RD,写 WR信号不能同时有效 。
( 7) HOLD( Hold Request) ( 输入 ),总线保持请求信号 输入 引脚,
高电平有效 。 当系统中的其它总线部件要求占用总线时,向 CPU发出总线请求信号,使 HOLD=1,有效 。
( 8) HLDA( Hold Acknowledge) (输出),总线保持响应信号 输出 引脚,高电平有效。当 CPU监测到 HOLD有效时,就在当前总线周期 T4状态从
HLDA引脚向外设发出应答信号( HLDA=1),同时使 CPU与 AB,DB,CB总线浮空,总线请求部件收到 HLDA信号后,获得总线控制权( HOLD=1,HLDA=1 )。
在总线占有部件用完总线后,置 HOLD=0无效,CPU检测到
HOLD=0后,使 HLDA=0,CPU又重新获得 AB,DB,CB总线控制权。
3,最大模式下的 24--31引脚当 8088/8086CPU的引脚 MN/MX接地时,CPU处于最大模式下,这时候剩余的 24— 31共 8个引脚的名称及功能如下:
( 1) QS1,QS0( Instruction Queue Status) ( 输出 ),指令队列状态信号输出引脚,这两个信号的组合给出了前一个 T状态中指令队列的状态,以便于外部对 8086CPU内部指令队列的动作跟踪,如下表所示:
QS1 QS0 含 义无操作0 0
0 1
1 0
1 1
从指令队列的第一个字节取走代码指令队列为空除第一个字节外,还取走了后续字节中的代码
( 2) S2,S1,S0( Bus cycle status) ( 输出 ),总线周期状态信号输出引脚,低电平有效,这些信号组合起来,可以指出当前总线周期中,所进行数据传输过程的类型,总线控制器 8288利用这些信号来产生对存储单元,I/O端口的控制信号 。 S2,S1,S0与具体物理过程之间的对应关系,如下表所示 。
S2 S1 S0 8086总线周期 8288命令
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
中断响应
I/O端口读
I/O端口写暂停取指 令码存储器读存储器写无作用
INTA
IORC
IOWC AIOWC
无
MRDC
MRDC
MWTC AMWC
无效有源状态,对于 S2,S1,S0的组合来说,在前一个总线周期的 T4状态和本总线周期的 T1和 T2状态中,至少有一个信号为 0( 低电平 ),每种组合都对应一个具体的总线操作,称为有源状态 。
无源状态,在总线周期的 T3和 TW状态且 READY= 1时,S2S1S0=111( 全为高电平 ),此时一个总线操作即将结束,另一个总线周期还未开始,称为无源状态 。
在无源状态时,若 S2,S1,S0其中任一信号的改变,都意味着一个新的总线周期的开始 。
( 3) LOCK ( Lock) ( 输出,三态 ),总线封锁输出信号引脚,低电平有效 。 当该引脚输出低电平时,系统中其它总线部件不能占用系统总线 。
LOCK信号是由指令前缀 LOCK产生的,在 LOCK前缀后面的一条指令执行完毕之后,便撤消 LOCK信号 。 此外,在 8086的 2个中断响应脉冲之间
LOCK信号也自动变为有效的低电平,以防止其它总线部件在中断响应过程中,
占有总线而使一个完整的中断响应过程被中断 。
( 4) RQ/GT0,RQ/GT1( Request/Grant)(双向),总线请求信号输入 /总线允许信号输出引脚。这两个信号端可供 CPU以外的两个处理器,用来发出使用总线的请求信号和接收 CPU对总线请求信号的应答。这两个引脚都是双向的,请求与应答信号在同一引脚上分时传输,方向相反。其中 RQ/GT1比 RQ/GT0
的优先级低。
4,8086/8088CPU的引脚分类
( 1)数据 /地址复用线、地址线、地址 /状态复用线,AD0~AD7,AD8~AD15、
A16~A19/S3~S6
( 2)电源、地,VCC,GND( 2个)
( 3)最小模式下与地址总线有关的信号,ALE
( 4)最小模式下与数据总线有关的信号,DEN,DT/R,BHE/S7
( 5)最小模式下与 CPU有关的控制信号,RESET,CLK,TEST,READY、
HOLD/HLDA
( 6)最小模式下与存储器,I/O操作有关的信号,M/IO,RD,WR
( 7)最小模式下与中断有关的信号,NMI,INTR,INTA
( 8)最小 /最大模式选择信号,MN/MX
( 9)最大模式下总线周期状态信号,S2,S1,S0
( 10)最大模式下指令队列状态信号,QS1,QS0
( 11)最大模式下总线请求信号 /总线请求允许信号,RQ/GT1,RQ/GT0
( 12)总线封锁信号,LOCK
2-3 8086存储器组织一、存储器地址的分段
1.存储器地址的分段由于 CPU内部的寄存器都是 16位的,为了能够提供 20位的物理地址,
8086系统中采用了存储器分段的方法。规定存储器的一个段为 64KB,由段寄存器来确定存储单元的段地址,由指令提供该单元相对于相应段起始地址的
16位偏移量。这样,系统的整个存储空间可分为 16个互不重叠的逻辑段,如左下图所示。
存储器的每个段的容量为 64KB,并允许在整个存储空间内浮动,即段与段之间可以部分重叠、完全重叠、连续排列,非常灵活,如右下图所示。
2,存储容量
8086系统有 20根地址总线,因此,它可以直接寻址的存储器单元数为 220=1MB,这 1MB的存储器单元按照 00000~
FFFFFH来编址。
3,逻辑地址( LA)和物理地址( PA)
逻辑地址,是在程序中使用的地址,它由段地址和偏移地 址两部分组成( 16位)。
逻辑地址的表示形式为“段地址:偏移地址”。
例如,2000H,0100H。
物理地址,8086可直接寻址 1MB的存储空间,其地址区域为
00000H~ FFFFFH,与存储单元一一对应的 20位地址,我们称之为存储单元的物理地址。就是存储器的实际地址,它是指 CPU
和存储器进行数据交换时所使用的地址( 20位)。
物理地址是由段地址与偏移地址共同决定的,段地址来自于段寄存器( CS,DS,ES,SS),是十六位地址,由段地址及偏移地址计算物理地址的表达式为:
物理地址 = 段地址 × 16 + 偏移地址例如,系统启动后,指令的物理地址由 CS的内容与 IP的内容共同决定,由于系统启动的 CS=0FFFFH,IP=0000H,所以初始指令的物理地址为 0FFFF0H,我们可以在 0FFFF0H单元开始的几个单元中,固化一条无条件转移指令的代码,即转移到系统初始化程序部分所在存储器的地址位置处。
5,存储器分段组织带来存储器管理的新特点偏移地址是某存储单元相对其所在段起始位置的偏移字节数,
或简称偏移量。它是一个 16位的地址,根据指令的不同,它可以来自于 CPU中不同的 16位寄存器( IP,SP,BP,SI,DI、
BX等)。
在程序代码量、数据量不是太大的情况下,可使它们处于同一段内,即使它们在 64KB的范围内,这样可以减少指令的长度,提高指令运行的速度。
内存分段为程序的浮动分配创造了条件。
物理地址与逻辑地址并不是一一对应的,举例,6832H:
1280H,物理地址为 695A0H。
各个分段之间可以重叠 。
4,偏移地址
8088/8086系统中,有些内存区域的作用是固定的,用户不能随便使用,如:
( 3)启动区,FFFF0H— FFFFFH共 16个单元,用以存放一条无条件转移指令的代码,转移到系统的初始化部分。
( 2)显示缓冲区,B0000H— B0F9FH约 4000( 25× 80× 2)字节,是单色显示器的显示缓冲区,在存放文本方式下,用于显示字符的 ASCII码及属性码; B8000H— BBF3FH约 16K字节,
是彩色显示器的显示缓冲区,在存放图形方式下,用于屏幕显示像素的代码。
( 1)中断矢量区,00000H— 003FFH共 1K字节,用以存放 256
种中断类型的中断矢量,每个中断矢量占用 4个字节,共
256× 4=1024=1K
6,特殊的内存区域二,8086存储器的分体结构在组成与 8086CPU连接的存储器时,1M字节的存储空间实际上被分成两 512K字节的存储体,分别叫 高位库 和 低位库 。低位库固定与 8086CPU的低位字节数据线 D7~D0相连,因此又可称它为 低字节存储体,该存储体中的每个地址均为偶地址。高位库与 8086CPU的高位字节数据线 D15~D8相连,因此又称它为 高字节存储体,该存储体中的每个地址均为奇地址,如下页图所示。
存储器是按字节进行组织的,两个相邻的字节被称为一个
“字” 。存放的信息若是以字节( 8位)为单位的,将在存储器中按顺序排列存放;若存放的数据为一个字( 16位)时,则将每一个字的低字节(低 8位)存放在低地址中,高字节(高 8位)
存放在高地址中,并以低地址作为该字的地址。
00001H 00000H
00003H 00002H
00005H 00004H
512K× 8( 位 ) 512K× 8( 位 )
奇地址存储体 偶地址存储体
( A0=1) ( A0=0)
FFFFDH FFFFCH
FFFFFH FFFFEH
1MB的存储器单元的地址分为奇地址和偶地址,由 BHE和 A0
控制器读写顺序 。 BHE=0( 有效 ),从奇地址传送高 8位数据;
A0=0,从偶地址传送低 8位数据 。 BHE与 A0的组合及对应的操作如下表所示,见教材 P37表 2-8。
BHE A0 操作 所用 DB总线引脚
0 0 从偶地址开始传送 1个字 ( 低字节在偶地址 ) AD15----AD0
0 1 从奇地址开始传送 1个字节 ( 高位字节 ) AD15----AD8
1 0 从偶地址开始传送 1个字节 ( 低位字节 ) AD7----AD0
1 1 无效如果一个 16位数据,高 8位数据存储在存储器的奇地址单元中,低 8位数据存储在存储器的偶地址单元中,则读写该数据需要 一个 总线周期。
如果一个 16位数据,高 8位数据存储在存储器的偶地址单元中,低 8位数据存储在存储器的奇地址单元中,则读写该数据需要 两个 总线周期。 第一个总线周期用于在奇地址中完成低
8位数据的传送,然后 IP自动加 1;第二个总线周期用于在偶地址中完成高 8位数据的传送; 这些是 8086自动完成的。所以,
这种情况下,除增加一个总线周期外,其余与从偶地址开始的
16位数据的操作是一样的。
三、堆栈的概念堆栈,在存储器中开辟一段区域,用于存储一些暂时需要保护而以后还要用到数据(如中断现场的保护与恢复、子程序现场的保护与恢复等),这个区域称为堆栈。
功能,主要用于保护中间数据、子程序的现场、中断程序的现场等。
堆栈的特点:
堆栈存储数据的原则为 后进先出 。
堆栈在存储器中的位置由 SS:SP确定。 SP指令可由 MOV指令设置。
堆栈指针 SP在 8086系统中始终指向栈的顶部,即:始终指向最后压入栈中的数据的地址。
8086系统中栈的操作是以字为单位的。执行一次入栈操作,
SP-2,直至 SP=0( SS )栈满为止。执行一次出栈操作,SP+2。
见教材 P39 图 2-13
1.统一编址又称“存储器映射方式”。在这种编址方式下,I/O端口地址置于 1MB的存储器空间中,在整个存储空间中划出一部分空间给外设端口,端口和存储单元统一编址。如,6502,6800.
优点,端口所需的地址线较少,地址译码器较简单,采用专用的 I/O指令,
端口操作指令执行时间少,指令长度短 。
缺点,输入输出指令类别少,一般只能进行传送操作。
2.独立编址又称,I/O映射方式”。这种方式的端口单独编址构成一个 I/O空间,
不占用存储器地址空间。如,8086
优点,无需专门的 I/O指令,对端口操作的指令类型多,从而简化了指令系统的设计。
缺点,端口占用存储器的地址空间,使存储器容量更加紧张,同时端口指令的长度增加,执行时间较长,端口地址译码器较复杂。
四,8086的 I/O编址
8086系统采用独立编址方式。有专用的 I/O指令( IN,OUT)。
8086允许有 64K( 65536个) 8位的 I/O端口,两个编号相邻的 8位端口可以组成一个 16位端口。指令系统中既有访问 8位端口的 I/O
指令,又有访问 16位端口的 I/O指令。
8086CPU执行访问 I/O端口指令时,硬件上产生 M/IO=0、
RD( 或 WR ) =0有效。端口地址不占用存储空间,端口地址独立编址构成 I/O空间。其特点是,I/O指令类型少,只能进行传送操作; M/IO,RD( 或 WR )两组信号,信号线根数多。
8086系统和外设之间都是通过 I/O接口芯片联系的,每个 I/O
接口芯片都有一个或几个端口,一个端口往往对应芯片内部的一个或一组寄存器,微机系统要为每个端口分配一个地址,此地址也称为端口号。各个端口号不能重复。
3,8086的 I/O编址
2-4 8086系统配置为了适应各种使用场合,在设计 8088/8086CPU芯片时,就考虑了其应能够使它工作在两种模式下,即最小模式与最大模式。
当把 8086的 33脚 MN/MX接地时,这时的系统处于最大模式。最大模式是相对最小模式而言的,它主要用在中等或大规模的 8086系统中。在最大模式系统中,总是包含有两个或多个微处理器,是多微处理器系统。其中必有一个主处理器 8086CPU,其他的处理器称为协处理器它们是协助主处理器工作的。
所谓最小模式,就是系统中只有一个 8086微处理器,是一个单微处理器系统。在这种系统中,所有的总线控制信号,都是直接由 8086CPU产生的,
系统中的总线控制逻辑电路被减到最少,该模式适用于规模较小的微机应用系统。
当把 8086的 33脚 MN/MX接 +5V时,8086 CPU就处于最小工作方式。
最小模式(最小工作方式 )
最大模式(最大工作方式 )
( 2)输入 /输出协处理器 8089,在原理上有点象带有两个 DMA
通道的处理器,它有一套专门用于输入 /输出操作的指令系统,
但是 8089又和 DMA控制器不同,它可以直接为输入 /输出设备服务,使主处理器不再承担这类工作。所以,在系统中增加 8089协处理器之后,会明显提高主处理器的效率,尤其是在输入 /输出操作比较频繁的系统中。
与 8088/8086CPU配合工作的协处理器有两类:
( 1)数值协处理器 8087,它能实现多种类型的数值运算,如高精度的整型和浮点型数值运算,超越函数(三角函数、对数函数)
的计算等,这些运算若用软件的方法来实现,将耗费大量的机器时间。换句话说,引入了 8087协处理器,就是把软件功能硬件化,
可以大大提高主处理器的运行速度。
一,8086/8088最小系统中的外围芯片简介
1,锁存器 Intel 8282(或 74LA373) P42 图 2-15
8282是典型的 8位锁存器,8位输入( DI0----DI7),8位输出
( DO0----DO7),选通输入信号(锁存输入信号) STB,输出数据允许信号 OE(低电平有效)。 74LS373作为锁存器,其用法与 8282完全一样。
8282与 8086连接时,作为 8086外部地址锁存器,8086有 20条地址线,加上高 8位数据允许引脚 BHE,共 21条线,需要 3片 8282。
8282的输入与 8086的地址线 A19----A16,AD15----AD0和 BHE相连,输出即为 8086系统的地址线和 BHE; 8282的 STB接 8086的 ALE,8282
的 OE接地,直接数据输出允许。 P41 图 2-14
2,总线收发器 Intel 8286/8287 P43 图 2-16
8286是 Intel系列典型的 8位总线收发器,8位输入( A0----A7),
8位输出( B0----B7)。
T为控制数据传送方向信号,T=1时,A0----A7为输入,B0----
B7为输出; T=0时,B0----B7为输入,A0----A7 为输出。输出数据允许信号 OE(低电平有效)。
8286与 8086连接时,作为 8086外部总线收发器,8086有 16条数据线,需要 2片 8286。 8286的输入与 8086的地址线 AD15----AD0
相连,输出即为 8086系统的数据总线; 8286的 T接 8086(或 8288)
的 DT/R,8286的 OE接 8086 (或 8288)的 DEN。 P41 图 2-14
3,时钟发生器 8284
3,时钟发生器 8284
( 1)输入,晶振与复位晶振接 8284的 X1,X2引脚( F/C接低电平,选择外界晶振产生时钟),外部复位接 RES引脚。
( 2)输出,CLK(时钟),RESET(复位),READY(准备好)
8284输出的时钟频率 CLK为外界晶振频率的 1/3。
CLK,RESET,READY分别为 8086系统提供时钟、复位、准备好信号。
( 3)外部复位的接法 (上电复位,按键复位),如下图所示。
上电复位 按键复位
4,总线控制器 Intel 8288 P47 2-21
8288是 Intel系列典型的 8位总线控制器,输入信号有,S2、
S1,S0,CLK,AEN(地址允许,由总线裁决器 8289输入,用于多总线之间的同步控制。单总线系统中; AEN 接地)、
CEN(命令允许信号,在多个 8288系统中,相当于 8288的片选;
单总线系统中; CEN 接高电平),IOB(总线工作方式控制,
当 IOB接高电平时,8288处于局部总线工作方式;当 IOB接低电平时,8288处于系统总线工作方式。单总线系统中,8288为系统总线工作方式,IOB接地)。
输出信号有,MRDC (存储器读),MWTC(存储器写),AMWC(存储器超前写,比 MWTC提前一个时钟出现,使一些较慢的存储器可得到一个额外的时钟执行周期执行写操作),IORC( I/O读),IOWC( I/O写),AIOWC( I/O超前写),INTA(中断相应),DT/R(数据收发方向控制),DEN(数据传送允许),ALE(地址锁存),MCE/PDEN(主控级联允许 /外设数据允许。当 IOB接地,8288工作在系统总线方式时,此引脚作 MCE用;它在中断响应周期用于控制主 8259向从 8259输出级联地址 CAS2----CAS0的锁存。当 IOB接高电平,8288工作在局部总线方式时,此引脚作 PDEN用,用于控制外设通过局部总线传送数据)。
1,MN/MX端接 +5V,决定了 CPU的工作模式;
2,需要一片 8284A,作为时钟信号发生器;
3,需要三片 8282或 74LS273,用来作为地址信号的锁存器;
4,当系统中所连的存储器和外设端口较多时,需要增加数据总线的驱动能力,这时,需用 2片 8286/8287作为总线收发器。
8286输入与输出同相,8287输入与输出反相,其余功能相同。
8086最小模式系统配置电路图如下页图所示。
二,8086最小模式下的典型配置
8086最小模式系统配置 P41 2-14
在最大模式的系统中,一般还有中断优先级管理部件。
8259A用以对多个中断源进行中断优先级的管理,但如果含有的设备不多,也可以不用中断优先级管理部件。 但在最小模式的系统中,如果含有的设备比较多,就必须外扩中断优先级管理部件。
三,8086最大模式下的典型配置
8086最大模式和最小模式在配置上的主要差别在于在最大模式下,要用 8288总线控制器来对 CPU发出的控制信号进行变换和组合,以得到对存储器或 I/O 端口的读 /写信号和对锁存器 8282及总线收发器 8286的控制信号。其余相同。
最大模式系统中,需要用总线控制器来变换与组合控制信号的原因在于:在最大模式的系统中,一般包含 2个或多个处理器,
这样就要解决主处理器和协处理器之间的协调工作,和对系统总线的共享控制问题,8288总线控制器就起了这个作用。
最大模式下需要使用 8288总线控制器,可构成多处理器系统,
所以 8288提供两种工作方式,由引脚 IOB进行选择。
I/O总线方式,IOB引脚接高电平,8288处于局部总线工作方式。
此方式下所有的 I/O命令线处于“允许状态”,即处理器进行
I/O操作不需要总线仲裁器发出 AEN信号,8288立即会发出相应的 IORC,INTA或 IOWC,AIOWC信号,并通过 PDEN和
DT/R启动命令线,去控制总线收发器工作。
系统总线工作方式,IOB引脚接地,8288处于系统总线方式。
此时总线仲裁电路向 8288的 AEN端发送一个低电平,表示总线可供使用 (CEN高电平 )。在多处理器系统中,如果 I/O设备和存储器均被多个处理器共享。系统中必须使用总线裁决,所以
8288必须工作在系统总线方式下。
最大模式下的系统典型配置 P46 2-20
2-4 8086CPU时序时序,时序是计算机操作运行的时间顺序。
可以深入了解指令的执行过程。
可以使我们在程序设计时,选择合适的指令或指令序列,以尽量缩短程序代码的长度及程序的运行时间。因为对于实现相同的功能,可以采用不同的指令或指令序列,而这些指令或指令序列的字节数及执行时间有可能不相同的。
对于学习各功能部件与系统总线的连接及硬件系统的调试,都十分有意义,因为 CPU与存储器,I/O端口协调工作时,存在一个时序上的配合问题。
能更好地处理微机用于过程控制及解决实时控制的问题。
可以进一步了解在微机系统的工作过程中,CPU各引脚上信号之间的相对时间关系。由于微处理器内部电路、部件的工作情况,用户是看不到的,通过检测 CPU引脚信号线上各信号之间的相对时间关系,是判断系统工作是否正常的一种重要途径。
为什么要研究时序?
取指令进入指令队列和访问存储器,I/O端口时均需 BIU执行一个总线周期。
一,8086的总线周期
T3,高 4位总线仍然输出状态信息,低 16位总线上出现的是数据信号。
读 ----存储器或 I/O端口的数据送到总线上,写 ----CPU的数据送到总线上。
T2,低 16位地址信号从总线上撤销,呈高阻。高 4位地址总线输出状态信息(指出可屏蔽中断是否允许,当前正在使用的段寄存器)。
T1,CPU向多路复用总线发出地址信息,指出要寻址的存储单元或 I/O端口。
( 4)一个基本的总线周期的 4个 T状态:
( 3)指令周期,执行一条指令所需要的时间称为指令周期,不同指令的指令周期的长短是不同的。一个指令周期是由几个总线周期组成的。
( 2)总线周期,BIU完成一次访问存储器或 I/O端口操作所需要的时间称为总线周期。一个基本的总线周期是由 4个 (或 4个以上)时钟周期组成的。
( 1)时钟周期,CPU时钟频率的倒数称为时钟周期,也称 T状态。
( 5)空闲周期,一个总线周期后,不立即执行下一个总线周期,系统总线处于空闲状态,执行空闲周期(可为一个或多个时钟周期)。处于空闲周期时,总线高 4位上 CPU仍然驱动前一个总线周期的状态信息;若前一个总线周期是写周期,总线低 16位上仍然驱动前一个总线周期的数据信息,若前一个总线周期是读周期,总线低 16位呈高阻。
CLK
T1
总线周期 总线周期地址 缓冲 数据 地址 缓冲 数据地址 /数据总线
T2 T3 T4 T1 T2 T3 T4
典型的总线周期波形图注,当被写入(或读出)数据的存储器或 I/O端口不能及时配合 CPU传送数据的情况下,存储器或 I/O端口向 CPU发出数据未准备好信号( READY),
则 CPU会在 T3之后插入一个或多个附加的时钟周期 T3(等待转态),直至存储器或 I/O端口准备好传送数据为止。
T4,总线周期结束。
典型的总线周期波形如下图所示。
8086/8088的复位和启动操作,是通过 RESET引脚上的触发信号来执行的,当 RESET引脚上维持有 4个时钟高电平 时 ( 如果是初次上电复位,则要求 RESET引脚上维持有 50μs的高电平 ),
CPU就结束当前操作,进入初始化 ( 复位 ) 过程 。 包括把各内部寄存器 ( 除 CS) 清 0,标志寄存器清 0,指令队列清 0,将
FFFFH送 CS。 重新启动后,系统从 FFFF0H开始执行指令 。 重新启动的动作是当 RESET从高到低跳变时触发 CPU内部的一个复位逻辑电路,经过 7个 T状态,CPU即自动启动 。
二,8086微机系统的主要操作
8086/8088微机系统,能够完成的操作有下列几种主要类型:
系统的复位与启动操作;暂停操作; 总线操作( I/O读,I/O
写、存贮器读、存贮器写) ;中断操作;最小模式下的总线保持;最大模式下的总线请求 /允许。 共 6个。
三,系统的复位和启动操作(对最大小模式都一样)
注意,由于在复位操作时,标志寄存器被清 0,因此其中的中断标志 IF也被清 0,这样就阻止了所有的可屏蔽中断请求,都不能响应,即复位以后,若需要必需用开中断指令来重新设置 IF标志 。 复位时各内部寄存器的值如 P26表 2.6所示 。 复位时总线信号状态如 P49表 2-13所示 。 复位操作的时序图如下图所示 。
按数据传输的方向来分,总线操作可分为总线读和总线写操作;按照读 /写的不同对象,总线操作又可分为存储器读 /写与
I/O读 /写操作。 注意,这里所说的读 /写总是站在 CPU的角度。
总线读操作 是指 CPU从存储器或 I/O端口读取数据,总线写操作是指 CPU向存储器或 I/O端口写入数据。
四,总线操作总线操作,执行总线周期即为总线操作。
下面仅以最小模式下的总线读操作为例说明总线操作时序,其余需要大家自学 P52-55。
一个最基本的读周期包含有 4个状态,即 T1,T2,T3,T4,
必要时可插入 1个或几个 TW状态。
( 1) 为了要从存储器或 I/O端口读出数据,必须设置 M/IO信号 ( 1----存储器读,0---- I/O读 ) 有效,此信号一直保持到整个总线周期结束 ( 即 T4状态 ) 。 ( T1 ---- T4 )
( 5)当系统中配有总线驱动器时,T1状态使 DT/R变低,用来表示本周期为读周期,并通知总线收发器 8286(连接 8286的 T引脚)接收数据。 ( T1----
T4)
( 4) BHE(对 8088无用)有效,用来表示高 8位数据总线上的信息有效,现在通过 A15 ---- A8传送的是有效地址信息。 BHE常作为奇地址存储体的选通信号,因为奇地址存储体中的信息总是通过高 8位数据线来传输,而偶地址体的选通则用 A0。 ( T1 ---- T2的一半)
( 3)地址锁存 ALE有效,在最小模式的系统配置中我们讲过,地址信号通过地址锁存器 8282锁存,ALE即为 8282的锁存信号,下降沿有效。 ( T1 )
( 2)地址线信号(存储器或 I/O端口)有效,高 4位通过地址 /状态线 A19/S6---
-A16/S3送出,低 16位通过地址 /数据线 AD15----AD0送出,用来指出操作对象
(存储器或 I/O端口)的地址。 20位地址,A19/S6----A16/S3,AD15----AD0。
( T1 ---- T2的一半)
1,T1状态
( 1) A19 ---- A0在 T2中间消失 。 高四位地址 /状态线送出状态信息
S6----S3;低 16位地址 /数据线 AD15----AD0浮空,为下面传送数据准备 。
( 2) BHE/S7引脚成为 S7( 8086中无定义 ) 。
( 3) RD有效,表示要对存储器或 I/O端口进行读 。 ( T2---- T3)
( 4) DEN有效,使得总线收发器 8286 ( 连接 8286的 OE引脚 ) 可以传输数据 。 ( T2----T3)
只有被地址信号选中的存储器单元或 I/O端口才会被 RD信号从中读出数据,并将数据送到系统的数据总线上 。
被地址信号选中的存储器单元或 I/O端口将数据送到系统的数据总线 AD15----AD0上。 CPU通过 AD15----AD0接收数据。在 AD15-
---AD0在 ( T3---- T4一半) 有效。
3,T3状态
2,T2状态
4,TW状态若系统外扩的存储器或外设速度较慢,不能满足 8086的基本时序要求
(即不能及时送出数据),则通过 READY线通知 CPU,CPU在 T3的前沿
(即 T2结束末的下降沿)检测 READY,若发现 READY= 0,则在 T3结束后自动插入 1个或几个 TW,并在每个 T3的前沿处检测 READY,等到 READY变高后,则自动脱离 TW进入 T4状态。
最后一个 TW状态,数据肯定已出现在数据总线 AD15----AD0上;最后一个
TW状态的总线操作同 T3状态;其他 TW状态的所有控制信号的电平状态和 T3
状态一样,只是数据尚未出现在数据总线 AD15----AD0上。
5,T4状态在 T4与 T3(或 TW)状态的交界处(即 T4的前沿 ----下降沿),CPU对数据总线 AD15----AD0采样 ----采集数据,从而获得数据。使各控制及状态线进入无效。总线读操作时序图如下页图所示。
总线读操作时序图
P55
1,4,5,10 a) d),15,16,18,21
画出 8086系统最小模式与最大模式系统配置电路图作业:
( 1) 16位微处理器;
( 2)采用高速运算性能的 HMOS工艺制造,芯片上集成了 2.9
万只晶体管;
( 3)使用单一的 +5V电源,40条引脚双列直插式封装 (DIP);
( 4)时钟频率为 5MHz~10MHz,基本指令执行时间为
0.3ms~0.6ms
( 5) 16根数据线和 20根地址线,可寻址的地址空间达 1MB
( 6) 8086可以和浮点运算器、输入 /输出处理器或其他处理器组成多处理器系统,从而极大地提高了系统的数据吞吐能力和数据处理能力。
第 2章 8086系统结构
8086是 Intel系列的 16位微处理器,采用 HMOS工艺,内部包含 29000个晶体管。同时,Intel还推出了准 16位微处理器 8088
(内部总线 16位,外部总线 8位)。主要用于兼容当时的外围接口芯片。
8086CPU内部结构框图如下页图所示。从图中可以看出,
8086CPU有两部分组成,指令执行部件 EU和总线接口部件 BIU。
2-1 8086CPU的结构外部总线
AH AL
BH BL
CH CL
DH DL
SP
BP
DI
SI
通用寄存器
AX
BX
CX
DX
ALU数据总线( 16位)
运算寄存器
ALU
标志寄存器
EU 控制系统
∑
CS
DS
SS
ES
IP
内部暂存器
1 2 3 4 5 6
数据总线
8088:8位
8086:16位总线 控制逻辑地址总线
20位指令队列
8088
8086
Q总线
( 8位)
指令指针段寄存器执行单元 EU 总线接口单元 BIU
图 2.1.1 8086CPU内部结构框图一,8086CPU的内部结构
8086CPU有两部分组成,指令执行部件 EU和总线接口部件 BIU。
1,总线接口部件 BIU( Bus Interface Unit)
功能,总线接口部件 BIU是 CPU与外部(存储器和 I/O口)的接口,
它提供了 16位双向数据总线和 20位地址总线,完成所有的外部总线操作。具有 地址形成、取指令、指令排队、读 /写操作数、总线控制 等功能。
组成,4个 16位段地址寄存器( CS,DS,ES,SS)
16位指令指针寄存器 IP
20位物理地址加法器
6字节指令队列总线控制器
BIU的特点,8086/8088的 指令队列 分别为 6/4个字节,在执行指令的 同时,可从内存中取出后续的指令代码,放在指令队列中,可以提高 CPU的工作效率。 地址加法器 用来产生 20位物理地址。 8086可用 20位地址寻址 1M字节的内存空间,而 CPU内部的寄存器都是 16 位,因此需要由一个附加的机构来计算出 20位的物理地址,这个机构就是 20位的地址加法器。
例如,CS= 0FE00H,IP= 0400H,则表示要取指令代码的物理地址为 0FE400H。
2,指令执行部件 EU( Execution Unit)
功能,指令执行部件 EU完成指令译码和指令执行的工作。
组成,算术逻辑单元 ALU
标志寄存器 PSW
4个 16位通用寄存器( AX,BX,CX,DX)
4个 16位专用寄存器( BP,SP,SI,DI)
EU控制器
3,BIU与 EU的动作协调原则总线接口部件( BIU)和执行部件( EU)按以下流水线技术原则协调工作,共同完成所要求的信息处理任务:
( 1)每当 8086的指令队列中有 1个空字节时,BIU就会自动把指令从存储器取到指令队列中。其取指的顺序是按指令在程序中出现的前后顺序。
( 2) 每当 EU准备执行一条指令时,它会从 BIU部件的指令队列前部取出指令的代码,然后用几个时钟周期去执行指令 。 在执行指令的过程中,如果必须访问存储器或者 I/ O端口,那么 EU就会请求 BIU,进入总线周期,完成访问内存或者 I/ O端口的操作;
如果此时 BIU正好处于空闲状态,会立即响应 EU的总线请求 。 如
BIU正将某个指令字节取到指令队列中,则 BIU将首先完成这个取指令的总线周期,然后再去响应 EU发出的访问总线的请求 。
( 3) 当指令队列已满,且 EU又没有总线访问请求时,BIU便进入空闲状态 。
( 4) 在执行转移指令,调用指令和返回指令时,由于待执行指令的顺序发生了变化,则指令队列中已经装入的字节被自动消除,
BIU会接着往指令队列装入转向的另一程序段中的指令代码 。
BIU与 EU两者的工作是不同步的,8086可以在执行指令的同时,进行取指令代码的操作,即 BIU与 EU是一种并行工作方式,
改变了以往计算机取指令 → 译码 → 执行指令的串行工作方式,大大提高了工作效率 。
总结:
BIU状态:
( 1)将指令按序取入指令队列(指令队列中只要有两个以上空,
就取指令);
( 2)响应 EU的总线周期,完成访问存储器,I/O口;
( 3)空闲状态(指令队列不空,也无 EU的总线的请求)。
EU状态:
( 1)从 BIU指令队列前部取出指令,经指令译码后,执行指令;
( 2)访问存储器,I/O口,向 BIU提出总线周期申请;
( 3) BIU指令队列空时,EU处于等待状态。
4,80X86CPU的寄存器
8086CPU的寄存器可分为通用寄存器、指针和变址寄存器、
段寄存器指令指针及标志寄存器。
( 1) 通用寄存器(见教材 P25表 2-1)
8086有 4个 16位的通用寄存器( AX,BX,CX,DX),可以存放 16位的操作数,也可分为 8个 8位的寄存器( AL,AH;
BL,BH; CL,CH; DL,DH)来使用。除了作为通用寄存器外,它们还有专门的用途:
AX( Accumulator ):累加器,存放算术运算操作数、结果;
BX( Base ):基址寄存器;
CX( Count ):计数器寄存器;
DX( Data ):数据寄存器。
上面 4个 16位寄存器都具有通用性,从而提高了指令系统的灵活性。但在有些指令中,这些通用寄存器还各自有特定的用法,如下表所示。
表 2- 1 寄存器主要用途寄存器 操作 寄存器 操作
AX 字乘,字除,字 I/O CL 变量移位,循环移位
AL 字节乘,字节除,字节 I/O,查表转换,十进制运算 DX 字乘,字除,间接 I/O
AH 字节乘,字节除 SP 堆栈操作
BX 查表转换 SI 数据串操作指令
CX 数据串操作指令,循环指令 DI 数据串操作指令
( 2)指针和变址寄存器 (见教材 P25表 2-1)
8086有 4个 16位的指针或变址寄存器( SI,DI,SP,
BP )。
SI( Source Index ):源变址寄存器
DI( Destination Index ):目的变址寄存器
SP( Stack Point ):堆栈指针,基址指针
BP( Base Point ):基址指针
指针寄存器系统中有两个 16位的指针寄存器 SP和 BP.
BP 称为基址指针寄存器,用于存放偏移量,通常和 SS段寄存器配合使用,在间接寻址中用于定位堆栈段中的内存单元 。
SP 称为堆栈指针,用于存放偏移量,只能和 SS段寄存器配合使用,且始终指向堆栈的栈顶,在堆栈指令中隐含的使用它来定位栈顶数据。
注,BX称为基址寄存器,可以用于存放偏移量或者是偏移量的一部分 ( 后面介绍指令寻址方式时会详细分析 ),通常和 DS,ES这两个段寄存器配合使用,用于定位数据段或附加段中的内存单元 。
变址寄存器系统中有两个 16位的变址寄存器 SI和 DI,都用于指令的变址寻址方式。
SI 称为源变址寄存器,用于存放偏移量或偏移量的一部分,
通常和 DS,ES这两个段寄存器配合使用,用于定位数据段或附加段中的内存单元。在串操作指令中,用于指明源串偏移量。
DI 称为目的变址寄存器,用于存放偏移量或偏移量的一部分,
通常和 DS,ES这两个段寄存器配合使用,用于定位数据段或附加段中的内存单元。在串操作指令中,用于指明目的串偏移量。
( 3) 指令指针及标志寄存器
8086的指令指针及标志寄存器包括 IP,SP和 PSW 3个 16位寄存器。 IP,PSW是系统中的两个 16位控制寄存器。
指令指针寄存器 IP
IP 用来控制 CPU的指令执行顺序,用于存放偏移量,只能和代码段寄存器 CS配合使用,可以确定当前所要取的指令的内存地址,且始终指向代码段中下一条将要读取到 CPU指令队列的那条指令 。
顺序执行程序时,CPU每取一个指令字节,IP自动加 1,指向下一个要读取的字节; 修改 IP中内容的操作是 CPU在每读取一条指令到指令队列后自动进行的,使它指向要读取的下一条指令 。
跳转指令中可以隐含的修改 IP寄存器中的内容 。
标志寄存器 PSW
标志寄存器 PSW( 处理器状态字 ),用来存放 8086/8088CPU
在工作过程中的状态 。
PSW为 16位寄存器,其中共有 9个标志位,可分成两类:一类为状态标志,一类为控制标志 。
状态标志,表示前一步操作 ( 如加,减等 ) 执行以后,ALU所处的状态,后续操作可以根据这些状态标志进行判断,实现转移;
控制标志,可以通过指令人为设置,用以对某一种特定的功能起控制作用 ( 如中断屏蔽等 ),反映了人们对微机系统工作方式的可控制性 。
PSW中各标志位的安排如下表所示 。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
PSW是按位操作的。可以通过转移指令来判断标志位的变化,
从而实现程序中的分支结构或者循环结构。
PSW中各标志位含义如下:
① 状态标志,6个
CF— 进位标志位,实现加法 ( 或减法 ) 时,当最高位出现进位 ( 或借位 ),CF位自动置 1,反之置 0。
PF— 奇偶标志位,当运算结果的低 8位中 l的个数为 偶数 时,
则 PF位自动置 1,反之为 0( 和单片机相反 )。
AF— 半进位标志位,实现加法 ( 或减法 ) 时,当低四位向高四位有进位 ( 或借位 ),AF位自动置 1。 通常用于对 BCD算术运算结果的调整 。
例如,1101 1000+1010 1110=1 1000 0110其中 AF= 1,CF= 1
ZF— 零标志位,运算结果为 0时,ZF位自动置 1,否则清 0。
SF— 符号标志位,当运算结果的最高位为 1,SF自动位置 1,
否则清 0。 即与运算结果的最高位相同 。
OF— 溢出标志位,OF溢出的判断方法如下:
加法运算:
若两个加数的最高位为 0,而和的最高位为 1,则产生溢出;
若两个加数的最高位为 1,而和的最高位为 0,则产生溢出;
两个加数的最高位不相同时,不可能产生溢出 。
减法运算:
若被减数的最高位为 0,减数的最高位为 1,而差的最高位为 1,
则产生溢出;
若被减数的最高位为 1,减数的最高位为 0,而差的最高位为 0,
则产生溢出;
被减数及减数的最高位相同时,按两数的大小判断溢出 。
如果所进行的运算是带符号数的运算,则溢出标志恰好能够反映运算结果是否超出了 8位或 16位带符号数所能表达的范围,
即字节运算大于十 127或小于- 128时,字运算大于十 32767或小于- 32768时,该位置 1,反之为 0。
例如:
0101 0100 0011 1001
+ 0100 0101 0110 1010
1001 1001 1010 0011
CF= 0,AF= 1,PF= 1,ZF= 0,SF= 1,OF= 1( 两正数相加结果为负 )
一般来讲,不是每次运算后所有的标志都改变,只是在某些操作之后,才对其中某个标志进行检查 。
② 控制标志,3个
TF— 陷阱标志位 (单步标志位,跟踪标志 )。 当 TF位置 1时,将使 8086/8088进入单步工作方式,通常用于程序的调试 。
IF— 中断允许标志位,若 IF位置 1,则处理器可以响应可屏蔽中断,否则就不能响应可屏蔽中断 。
DF— 方向标志位,若 DF位置 1,则串操作指令的地址修改为自动减量方向,反之,为自动增量方向 。
( 1) CF标志位的实用价值:
a,如果用户需要进行多字节无符号数的算术运算,那么 CF标志就是低位字节和高位字节间进位和借位的桥梁。
8086/8088CPU提供的指令,能够直接处理的最大无符号数就是一个字( 16
位),如果超出这个范围,就必须使用多字节来表示要计算的数据。
这个原理不光只在 8086/8088芯片中有,任何芯片,无论它处理的数据范围多么大,它总是一个有限的单位,如果超出这个单位,就必须使用标志位作为运算的中介。
b,在执行移位指令时,CF标志用于存放移出位的值。
例如对 01010011实行逻辑右移,即把这个字节中的每一位向右移动一位,左边空出的那一位置为 0,以前最右边那一位就被移出字节范围外了,那么这一位就是移出位,移出位都是保存在 CF中的。这个例子中,移位完成后,CF应该等于 1。
c,CF标志位还能够为一些条件转移指令提供判别依据。
例如 JC指令,它就是先判别 CF标志位的值,如果 CF=1,就跳转到指令中给出地址继续执行程序,如果 CF=0,就不作跳转,CPU会顺序执行下一条指令。也就是说,在程序中,可以根据 CF标志取值的不同来实现程序的分支或循环结构。
( 2)奇偶标志位 PF( Parity Flag):
如果 CPU所执行的指令要影响 PF标志,并且该指令得到的数据结果低 8位中含有偶数个,1”时,PF=1;含有奇数个,1”,PF=0。
注意无论指令的操作数有多么长,只有低 8位数据中 1的个数能够影响到 PF标志的取值。
PF标志位的实用价值:
这个标志位对于校验操作是很有用的。这里以对 ASCII码的校验来说明它的应用,ASCII码占用一个字节,但是只有低 7位是真正的码值,最高位是校验位。如果使用奇校验,那么必须保证编码字节中始终保持有奇数个,1”,这种编码格式可以通过调整最高位的取值来实现,如果 ASCII码中已经有奇数个,1”,那么第 7
位应取值为 0;如果 ASCII码中仅有偶数个,1”,那么第 7位应取值为 1,使,1”的个数变为奇数。
现在,试设想计算机通过网络接收 ASCII码,如何判断收到的编码是否正确呢?
那就需要判断收到的字节中是否为奇数个,1”,如果为偶数个,1”,那么收到的编码一定是错误的,必须要求重新发送。
在判断,1”的个数时,PF标志的作用就体现出来了。通过 PF标志也可以使用条件转移指令来实现程序中的分支或循环结构。
通过奇偶校验码能够识别大部分经常出现的错码,但是并不能完全避免错码。
关于编码机制可以参见计算机组成原理中的相关内容,这里不作详细的介绍。
( 3)辅助进位标志位 AF:
AF标志,又称半进位标志,在 CPU执行算术运算指令时,如果该指令要影响
AF标志,并且用户把操作数看作无符号数,AF标志才有意义。
如果低字节中的低 4位向高 4位产生进位或借位时(也就是第 3位向第 4位产生进位或借位),AF被置为 1;否则,AF被置为 0。
判别标准:
和 CF一样,使用无符号数的加减运算来作判断,只是判断进位和借位的位置不在操作数的最高位,而是在低字节的第 3位。
实用价值:
AF标志的使用主要针对二 ----十进制调整(用二进制算术运算实现十进制算术运算的功能),单纯的二进制运算中,几乎不使用 AF标志。
使用二进制数表示十进制数 ----BCD码是用 4位二进制数表示 1位十进制数。我们知道,4位连续的二进制数实际上是一位十六进制的数位,在运算中是逢 16进 1
或借 1。如果能够通过某种调整机制把它变为逢 10进 1或借 1,那么就可以使用二进制运算来实现十进制运算。
AF标志位对于实现这种二 ----十进制调整机制是必不可少的,它就是用于表达一个字节中低 4位向高 4位的进位或借位情况的。
( 4)零值标志位 ZF:
如果 CPU执行的指令要影响 ZF标志,并且保证 ZF标志是有意义的,那么当指令得到的结果数据各位全为,0”时,则 ZF置,1”,否则 ZF置,0”。
实用价值:
ZF标志的使用主要是进行比较,并根据比较的结果来进行程序的分支或循环。
例如,对两个整数进行比较,即对两个整数进行相减的操作,如果两个数是相等的,那么结果为 0,ZF=1;如果不等,那么结果非 0,ZF=0。
比较的范围可以很广阔,不仅限于无符号数、补码,还可以对字符或者某些特定的编码进行比较。和 ZF标志相关的条件转移指令也很多,具体的应用示例在以后的课程中会遇到很多。
( 5)符号标志位 SF:
如果 CPU执行的指令要影响 SF标志,并且用户把指令得到的结果数据看作带符号数,那么当结果为负数时,SF置,1”;当结果为正数时,SF置,0”。即 SF
标志位的取值和结果数据的最高位是一致的,因为补码的最高位就是符号位。
实用价值:
主要用于对算术运算结果的符号进行判断,只有针对带符号的运算才是有意义的,可以通过两个带符号数经过减法运算后所得结果符号来判断哪一个数更大或者更小,从而结合条件转移指令来实现程序的分支或循环。
在 8086/8088指令系统中有与 SF标志直接相关的条件转移指令,这就比判断结果数据的最高位要方便得多。
( 6) 溢出标志位 OF:
如果 CPU执行算术运算指令,并且用户把操作数看作带符号数时,OF标志位的取值才有意义。如果运算结果超出了补码的表示范围(对字节来说,是 -128到
127,对字来说,是 -32768到 32767),那么解释为溢出,OF置为 1;如果运算结果没有超出补码的表示范围,OF置为 0。
b,正数 +正数:
若结果为正数,表示符号位没有丢掉,也就是没溢出,OF=0;
若结果为负数,表示符号位已经丢失,结果已经溢出,OF=1;
(等价运算:正数 -负数)
因为出现溢出时,参加运算的两个原始补码都没有超过表示范围,如果运算中超出了表示范围,只会是符号位超出了表示范围一位(只能是一位,不会多于一位),所以符号位丢没丢掉的问题和溢出问题是等价的,硬件逻辑也就是通过判断符号位有没有丢失来判断运算有没有溢出。
a,正数 +负数,OF=0 (等价运算:正数 -正数; 负数 -负数)
这种情况一定没有溢出,负数和正数是相互抵消的,得到的结果会比两个原始数据中较大的一个更靠近数轴的原点,所以一定不会超出定义的补码表示范围。
OF标志位的取值逻辑如下:
带符号数的加减运算可能出现的各种组合都可以等价替换为上面三种情况。
因为出现溢出时,参加运算的两个原始补码都没有超过表示范围,如果运算中超出了表示范围,只会是符号位超出了表示范围一位(只能是一位,不会多于一位),所以符号位丢没丢掉的问题和溢出问题是等价的,硬件逻辑也就是通过判断符号位有没有丢失来判断运算有没有溢出。
c,负数 +负数:
若结果为负数,表示符号位没有丢掉,也就是没溢出,OF=0;
若结果为正数,表示符号位已经丢失,结果已经溢出,OF=1;
(等价运算:负数 -正数)
实用价值:
主要用于实现程序分支或循环,8086/8088指令系统中有单独使用 OF标志位的条件转移指令,可以实现对溢出现象的判断和分支处理;也有结合使用
OF标志和 SF标志的条件转移指令,使用这些转移指令可以根据两个带符号数比较大小的结果来实现分支处理。这些细节将在介绍条件转移指令时详细介绍。
TF标志为用户单步调试自己的程序提供了相应的硬件基础。如果使用指令将 TF标志清 0,那么将会使 CPU退出单步运行模式,回到连续执行机器指令的状态。
( 7)单步(或跟踪)标志位 TF:
前面讲到的标志位都属于状态标志位,是指令根据自己的执行情况而为后续指令留下的一些可供参考的状态信息。 TF标志位是一个控制标志位,和前面所讲的标志位功能不同,它是用于触发单步中断的。
如果使用指令将 TF标志位置为 1,那么 CPU将进入单步执行指令的工作方式,每执行完一条指令就会触发单步中断,执行单步中断服务程序,一般会在屏幕上显示 CPU内部各寄存器和标志位的状态,以便用户观察该指令产生的影响。进入中断时,TF标志会自动被清 0,所以中断服务程序的执行并不会出现单步执行的情况,中断服务程序结束后 TF标志会恢复中断以前的设置。
实用价值:
使用户能够单步跟踪和调试机器指令组成的程序。
作为一个用户可设置的开关,可以控制 CPU是否处理可屏蔽中断,在程序执行不允许被打断的情况下,可以采用这个开关来屏蔽可屏蔽中断。
( 8)中断标志位 IF:
这也是一个控制标志位,用于控制 CPU是否处理可屏蔽中断。
如果使用指令将 IF标志置为 1,那么 CPU将会处理任何可屏蔽中断,如果使用指令将 IF标志置为 0,那么 CPU将不会处理 可屏蔽中断 。
实用价值:
例如,某些对执行时间要求非常严格的程序段,执行这种程序段时就不允许被中断打断,因为中断处理会添加额外的处理时间。
注意,IF标志只能屏蔽可屏蔽中断,对于一些由严重错误或故障引起的不可屏蔽中断则是无法屏蔽的。
对于标志寄存器 PSW中的标志位,一些标志位直接有条件转移指令与之对应,能够方便的通过这些标志位实现程序的分支或循环结构。一些标志位没有直接可用的条件转移指令与之对应,但是仍然可以用其他方法来进行判断,
从而实现分支或循环结构。关于哪些指令具体会对哪些标志位产生何种影响,
以及如何在程序设计中正确的使用标志位,将会在后面的课程中逐步熟悉起来。
( 9)方向标志位 DF:
这也是一个控制标志位,用于控制串操作指令存取数据的方向。如果使用指令将 DF标志置为 0,每执行完一次串操作以后,源串地址指针 SI和目的串地址指针 DI中的内容会自动递增;如果使用指令将 DF标志置为 1,那么每执行完一次串操作以后,SI和 DI中的内容会自动递减。
实用价值:
使用该控制标志,可以由用户来选择串操作指令存取数据的方向。串操作指令是一种特殊的指令,它能对一串相同类型的数据作相同的一次处理,
比使用循环结构的程序效率更高,因为串操作指令的循环是在指令内部完成的,而循环结构的程序要完成循环需要执行多条指令。
功能,段寄存器的内容与有效的地址偏移量一起,可确定内存的物理地址 。 通常 CS划定并控制程序区,DS和 ES控制数据区,
SS控制堆栈区 。
( 4)段寄存器段,内存中一段连续的空间,在程序中具有特定的用途。
段基址,段在内存中的起始地址 = 段基值 × 16 (左移 4位 )
8086CPU系统中共有 4个 16位段寄存器,用于存放程序所要使用的 4个存储段的 段基值,分别对应于内存中的四块存储区域,代码段 CS、堆栈段 SS、数据段 DS、附加段 ES。
代码段,用于存放程序的机器指令序列;
堆栈段,用于存放程序使用堆栈指令所保存的数据,自动保存的断点等信息;
数据段,存放程序直接使用的数据;
附加段,其中的内容不确定,可以由程序开发人员根据实际需要自己决定。
每个程序都可能会使用这样四个段,其中代码段是必须的,实用的程序通常至少包含代码段、堆栈段、数据段。
代码段寄存器 CS ( Code Segment)
数据段寄存器 DS ( Data Segment)
堆栈段寄存器 SS ( Stack Segment)
附加段寄存器 ES ( Extra Segment)
2-2 8086的引脚信号和功能如下页图所示,是 8088/8086CPU的外部结构,即引脚信号图。
8088/8086CPU芯片都是 40引脚双列直插式( DIP)封装的集成电路芯片,其中 32个引脚在两种工作模式下的名称和功能是相同的,还有 8个引脚( 24----37) 在不同的工作模式下,具有不同的名称和功能。
8086和 8088的外部引脚信号
1,两种模式下,名称和功能相同的 32个引脚
( 1) VCC,GND,电源、接地引脚,8088/8086CPU采用单一的 +5V电源,但有两个接地引脚。
( 3) A19/S6— A15/S3( Address Status Bus) (输出、三态),
高 4位地址 /状态复用信号输出引脚 (4条 ),分时输出地址的高 4位及状态信息。
S6 保持,0” 用以指示 8086/8088CPU当前与总线连通;
S5 为状态寄存器中断允许标志的状态,它在每个时钟周期开始时修改,若当前允许可屏蔽中断,则 S5置 1,若 S5 =0,则禁止一切可屏蔽中断;
( 2) AD15— AD0( Address Data Bus) (双向、三态),地址 /
数据复用信号输入 /输出引脚 (16条 ),分时输出低 16位地址信号及输入 /输出数据信号。通过时间上区分,T1状态输出低 16位地址信号,然后外部地址锁存,T3状态输入 /输出数据信号。
S4 S3 含 义
0 0 当前正在使用 ES
0 1 当前正在使用 SS
1 0 当前正在使用 CS,或者未用任何段寄存器
1 1 当前正在使用 DS
S4,S3共有四个组态,用以指明当前使用的段寄存器,如下表所示 。
( 4) NMI(Non-Maskable Interrupt),INTR( Interrupt Request)
NMI为 非屏蔽中断 请求信号 输入 引脚,高电平有效,上升沿触发,CPU
必须在当前指令结束后响应该中断,不受可屏蔽中断允许标志 IF的限制,不能用软件屏蔽 。
INTR为 可屏蔽中断 请求信号 输入 引脚,电平触发,CPU在指令的最后一个周期采样 INTR,在当前指令结束后响应该中断,可用软件通过复位内部中断允许标志 IF来屏蔽 INTR信号的中断请求 。
( 6) CLK( Clock) ( 输入 ),系统时钟信号 输入 引脚,时钟信号的方波信号,占空比约为 33%,即 1/3周期为高电平,2/3周期为低电平,8088/8086的时钟频率 ( 又称为主频 ) 为 4.77MHz,
即从该引脚输入的时钟信号的频率为 4.77MHz。 8086-1时钟频率为 10MHz,8086-2时钟频率为 8MHz。
( 5) RD( Read),读控制 输出 信号引脚,低电平有效,用以指明要执行一个对内存单元或 I/O端口的读操作,具体是读内存单元,还是读 I/O端口,取决于控制信号。
( 7) RESET( Reset ) (输入),复位信号 输入 引脚,高电平有效。 8088/8086CPU要求复位信号至少维持 4个时钟周期才能起到复位的效果,复位信号输入之后,CPU结束当前操作,进行复位操作,并对微处理器的标志寄存器 PSW,IP,DS,SS,ES寄存器及指令队列进行清零操作,而将 CS设置为 0FFFFH。
( 8) READY( Ready),,准备好,状态信号 输入 引脚,高电平有效,,Ready”输入引脚接收来自于内存单元或 I/O端口向 CPU发来的,准备好,状态信号,表明内存单元或 I/O端口已经准备好进行读 /写操作 。 该信号是协调 CPU与内存单元或
I/O端口之间进行信息传送的联络信号 。
CPU在 T3( 或 TW ) 状态采样 Ready信号,当 Ready=0
( 无效 ),则在 T3( 或 TW ) 状态结束后插入 TW状态 ( 等待周期 ),当 Ready=1( 有效 ),进入 T4状态,完成数据传送 。
( 9) TEST ( Test ),测试信号 输入 引脚,低电平有效,TEST
信号与 WAIT指令结合起来使用,CPU执行 WAIT指令后,处于等待状态,只有当 TEST引脚输入低电平时,系统才脱离等待状态,继续执行被暂停执行的指令。否则 CPU继续等待。
( 10) MN/MX( Minimum/Maximum Model Control),最小
/最大模式设置信号 输入 引脚,该输入引脚电平的高,低决定了 CPU工作在最小模式还是最大模式,当该引脚接 +5V时,
CPU工作于最小模式下,当该引脚接地时,CPU工作于最大模式下 。
( 11) BHE/S7( Bus High Enable/Status)(输出、三态),高
8位数据总线允许 /状态复用信号复用 输出 引脚。分时输出 BHE有效信号(表示高 8为数据线 D15— D8上的数据有效)和 S7 状态信号,但 S7未定义任何实际意义。
BHE信号与 A0信号配合,控制数据传送时的字,字节方式 。
具体规定如下表所示 。
BHE A0 操作 所用 DB总线引脚
0 0 从偶地址开始传送 1个字 ( 低字节在偶地址 ) AD15----AD0
0 1 从奇地址开始传送 1个字节 ( 高位字节 ) AD15----AD8
1 0 从偶地址开始传送 1个字节 ( 低位字节 ) AD7----AD0
1 1 无效表 BHE和 A0的代码组合和对应的操作
2,最小模式下的 24--31引脚当 8088/8086CPU的 MN/MX 引脚固定接 +5V时,CPU处于最小模式下,这时候剩余的 24— 31共 8个引脚的名称及功能如下:
( 1) M/IO ( Memory/Input and Output),存储器 I/O端口控制输出 信号,是 CPU区分进行存储器访问还是 I/O访问的输出控制信号。
M/IO=1,选择访问存储器(表示 CPU与存储器之间进行传送数据);
M/IO=0,选择访问 I/O端口(表示 CPU与之间 I/O端口进行传送数据)。
( 2) INTA( Interrupt Acknowledge) ( 输出 ),中断响应信号输出引脚,低电平有效,该引脚是 CPU响应中断请求后,向中断源发出的认可信号,
用以通知中断源,以便提供中断类型码 。 该信号为两个连续的负脉冲,在每个总线周期的 T2,T3( TW) 状态 INTA有效 。
第一个负脉冲,通知外部 I/O接口,它发出的中断请求已得到允许 。
第二个负脉冲,外部 I/O接口收到第二个负脉冲后,往数据总线上送自己的中断类型码,从而 CPU得到了有关此中断源的详细信息 。
( 3) ALE( Address Lock Enable) ( 输出 ),地址锁存允许输出信号引脚,高电平有效,在任何一个总线周期的 T1状态,ALE有效 。 CPU通过该引脚向地址锁存器 8282发出地址锁存允许信号,把当前地址 /数据复用总线上输出的地址信息锁存到地址锁存器 8282中去 。 注意,ALE信号不能被浮空 。
( 4) DEN( Data Enable) ( 输出,三态 ),数据允许输出信号引脚,
低电平有效,当 AD15----AD0作为数据总线使用时,DEN作为外部数据发送器
8286的选通信号,表示 CPU当前准备发送或接收一个数据 。 在访问存储器,I/O
端口或中断响应周期时 DEN有效 。
( 5) DT/R( Data Transmit/Receive) ( 输出,三态 ),数据收发控制信号输出引脚,CPU通过该引脚发出控制数据传送方向的控制信号,在使用
8286/8287作为数据总线收发器时,DT/R信号用以控制数据传送的方向,DT/R=1,
表示发送 ( 数据由 CPU经总线收发器 8286/8287输出 ) ; DT/R=0,表示接收 ( 数据由外设经总线收发器 8286/8287输入到 CPU) 。
( 6) WR( Write ) ( 输出,三态 ),写控制信号输出引脚,低电平有效,与 M/IO配合实现对存储单元,I/O端口进行写操作的控制 。 P34 表 2-6
注,读 RD,写 WR信号不能同时有效 。
( 7) HOLD( Hold Request) ( 输入 ),总线保持请求信号 输入 引脚,
高电平有效 。 当系统中的其它总线部件要求占用总线时,向 CPU发出总线请求信号,使 HOLD=1,有效 。
( 8) HLDA( Hold Acknowledge) (输出),总线保持响应信号 输出 引脚,高电平有效。当 CPU监测到 HOLD有效时,就在当前总线周期 T4状态从
HLDA引脚向外设发出应答信号( HLDA=1),同时使 CPU与 AB,DB,CB总线浮空,总线请求部件收到 HLDA信号后,获得总线控制权( HOLD=1,HLDA=1 )。
在总线占有部件用完总线后,置 HOLD=0无效,CPU检测到
HOLD=0后,使 HLDA=0,CPU又重新获得 AB,DB,CB总线控制权。
3,最大模式下的 24--31引脚当 8088/8086CPU的引脚 MN/MX接地时,CPU处于最大模式下,这时候剩余的 24— 31共 8个引脚的名称及功能如下:
( 1) QS1,QS0( Instruction Queue Status) ( 输出 ),指令队列状态信号输出引脚,这两个信号的组合给出了前一个 T状态中指令队列的状态,以便于外部对 8086CPU内部指令队列的动作跟踪,如下表所示:
QS1 QS0 含 义无操作0 0
0 1
1 0
1 1
从指令队列的第一个字节取走代码指令队列为空除第一个字节外,还取走了后续字节中的代码
( 2) S2,S1,S0( Bus cycle status) ( 输出 ),总线周期状态信号输出引脚,低电平有效,这些信号组合起来,可以指出当前总线周期中,所进行数据传输过程的类型,总线控制器 8288利用这些信号来产生对存储单元,I/O端口的控制信号 。 S2,S1,S0与具体物理过程之间的对应关系,如下表所示 。
S2 S1 S0 8086总线周期 8288命令
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
中断响应
I/O端口读
I/O端口写暂停取指 令码存储器读存储器写无作用
INTA
IORC
IOWC AIOWC
无
MRDC
MRDC
MWTC AMWC
无效有源状态,对于 S2,S1,S0的组合来说,在前一个总线周期的 T4状态和本总线周期的 T1和 T2状态中,至少有一个信号为 0( 低电平 ),每种组合都对应一个具体的总线操作,称为有源状态 。
无源状态,在总线周期的 T3和 TW状态且 READY= 1时,S2S1S0=111( 全为高电平 ),此时一个总线操作即将结束,另一个总线周期还未开始,称为无源状态 。
在无源状态时,若 S2,S1,S0其中任一信号的改变,都意味着一个新的总线周期的开始 。
( 3) LOCK ( Lock) ( 输出,三态 ),总线封锁输出信号引脚,低电平有效 。 当该引脚输出低电平时,系统中其它总线部件不能占用系统总线 。
LOCK信号是由指令前缀 LOCK产生的,在 LOCK前缀后面的一条指令执行完毕之后,便撤消 LOCK信号 。 此外,在 8086的 2个中断响应脉冲之间
LOCK信号也自动变为有效的低电平,以防止其它总线部件在中断响应过程中,
占有总线而使一个完整的中断响应过程被中断 。
( 4) RQ/GT0,RQ/GT1( Request/Grant)(双向),总线请求信号输入 /总线允许信号输出引脚。这两个信号端可供 CPU以外的两个处理器,用来发出使用总线的请求信号和接收 CPU对总线请求信号的应答。这两个引脚都是双向的,请求与应答信号在同一引脚上分时传输,方向相反。其中 RQ/GT1比 RQ/GT0
的优先级低。
4,8086/8088CPU的引脚分类
( 1)数据 /地址复用线、地址线、地址 /状态复用线,AD0~AD7,AD8~AD15、
A16~A19/S3~S6
( 2)电源、地,VCC,GND( 2个)
( 3)最小模式下与地址总线有关的信号,ALE
( 4)最小模式下与数据总线有关的信号,DEN,DT/R,BHE/S7
( 5)最小模式下与 CPU有关的控制信号,RESET,CLK,TEST,READY、
HOLD/HLDA
( 6)最小模式下与存储器,I/O操作有关的信号,M/IO,RD,WR
( 7)最小模式下与中断有关的信号,NMI,INTR,INTA
( 8)最小 /最大模式选择信号,MN/MX
( 9)最大模式下总线周期状态信号,S2,S1,S0
( 10)最大模式下指令队列状态信号,QS1,QS0
( 11)最大模式下总线请求信号 /总线请求允许信号,RQ/GT1,RQ/GT0
( 12)总线封锁信号,LOCK
2-3 8086存储器组织一、存储器地址的分段
1.存储器地址的分段由于 CPU内部的寄存器都是 16位的,为了能够提供 20位的物理地址,
8086系统中采用了存储器分段的方法。规定存储器的一个段为 64KB,由段寄存器来确定存储单元的段地址,由指令提供该单元相对于相应段起始地址的
16位偏移量。这样,系统的整个存储空间可分为 16个互不重叠的逻辑段,如左下图所示。
存储器的每个段的容量为 64KB,并允许在整个存储空间内浮动,即段与段之间可以部分重叠、完全重叠、连续排列,非常灵活,如右下图所示。
2,存储容量
8086系统有 20根地址总线,因此,它可以直接寻址的存储器单元数为 220=1MB,这 1MB的存储器单元按照 00000~
FFFFFH来编址。
3,逻辑地址( LA)和物理地址( PA)
逻辑地址,是在程序中使用的地址,它由段地址和偏移地 址两部分组成( 16位)。
逻辑地址的表示形式为“段地址:偏移地址”。
例如,2000H,0100H。
物理地址,8086可直接寻址 1MB的存储空间,其地址区域为
00000H~ FFFFFH,与存储单元一一对应的 20位地址,我们称之为存储单元的物理地址。就是存储器的实际地址,它是指 CPU
和存储器进行数据交换时所使用的地址( 20位)。
物理地址是由段地址与偏移地址共同决定的,段地址来自于段寄存器( CS,DS,ES,SS),是十六位地址,由段地址及偏移地址计算物理地址的表达式为:
物理地址 = 段地址 × 16 + 偏移地址例如,系统启动后,指令的物理地址由 CS的内容与 IP的内容共同决定,由于系统启动的 CS=0FFFFH,IP=0000H,所以初始指令的物理地址为 0FFFF0H,我们可以在 0FFFF0H单元开始的几个单元中,固化一条无条件转移指令的代码,即转移到系统初始化程序部分所在存储器的地址位置处。
5,存储器分段组织带来存储器管理的新特点偏移地址是某存储单元相对其所在段起始位置的偏移字节数,
或简称偏移量。它是一个 16位的地址,根据指令的不同,它可以来自于 CPU中不同的 16位寄存器( IP,SP,BP,SI,DI、
BX等)。
在程序代码量、数据量不是太大的情况下,可使它们处于同一段内,即使它们在 64KB的范围内,这样可以减少指令的长度,提高指令运行的速度。
内存分段为程序的浮动分配创造了条件。
物理地址与逻辑地址并不是一一对应的,举例,6832H:
1280H,物理地址为 695A0H。
各个分段之间可以重叠 。
4,偏移地址
8088/8086系统中,有些内存区域的作用是固定的,用户不能随便使用,如:
( 3)启动区,FFFF0H— FFFFFH共 16个单元,用以存放一条无条件转移指令的代码,转移到系统的初始化部分。
( 2)显示缓冲区,B0000H— B0F9FH约 4000( 25× 80× 2)字节,是单色显示器的显示缓冲区,在存放文本方式下,用于显示字符的 ASCII码及属性码; B8000H— BBF3FH约 16K字节,
是彩色显示器的显示缓冲区,在存放图形方式下,用于屏幕显示像素的代码。
( 1)中断矢量区,00000H— 003FFH共 1K字节,用以存放 256
种中断类型的中断矢量,每个中断矢量占用 4个字节,共
256× 4=1024=1K
6,特殊的内存区域二,8086存储器的分体结构在组成与 8086CPU连接的存储器时,1M字节的存储空间实际上被分成两 512K字节的存储体,分别叫 高位库 和 低位库 。低位库固定与 8086CPU的低位字节数据线 D7~D0相连,因此又可称它为 低字节存储体,该存储体中的每个地址均为偶地址。高位库与 8086CPU的高位字节数据线 D15~D8相连,因此又称它为 高字节存储体,该存储体中的每个地址均为奇地址,如下页图所示。
存储器是按字节进行组织的,两个相邻的字节被称为一个
“字” 。存放的信息若是以字节( 8位)为单位的,将在存储器中按顺序排列存放;若存放的数据为一个字( 16位)时,则将每一个字的低字节(低 8位)存放在低地址中,高字节(高 8位)
存放在高地址中,并以低地址作为该字的地址。
00001H 00000H
00003H 00002H
00005H 00004H
512K× 8( 位 ) 512K× 8( 位 )
奇地址存储体 偶地址存储体
( A0=1) ( A0=0)
FFFFDH FFFFCH
FFFFFH FFFFEH
1MB的存储器单元的地址分为奇地址和偶地址,由 BHE和 A0
控制器读写顺序 。 BHE=0( 有效 ),从奇地址传送高 8位数据;
A0=0,从偶地址传送低 8位数据 。 BHE与 A0的组合及对应的操作如下表所示,见教材 P37表 2-8。
BHE A0 操作 所用 DB总线引脚
0 0 从偶地址开始传送 1个字 ( 低字节在偶地址 ) AD15----AD0
0 1 从奇地址开始传送 1个字节 ( 高位字节 ) AD15----AD8
1 0 从偶地址开始传送 1个字节 ( 低位字节 ) AD7----AD0
1 1 无效如果一个 16位数据,高 8位数据存储在存储器的奇地址单元中,低 8位数据存储在存储器的偶地址单元中,则读写该数据需要 一个 总线周期。
如果一个 16位数据,高 8位数据存储在存储器的偶地址单元中,低 8位数据存储在存储器的奇地址单元中,则读写该数据需要 两个 总线周期。 第一个总线周期用于在奇地址中完成低
8位数据的传送,然后 IP自动加 1;第二个总线周期用于在偶地址中完成高 8位数据的传送; 这些是 8086自动完成的。所以,
这种情况下,除增加一个总线周期外,其余与从偶地址开始的
16位数据的操作是一样的。
三、堆栈的概念堆栈,在存储器中开辟一段区域,用于存储一些暂时需要保护而以后还要用到数据(如中断现场的保护与恢复、子程序现场的保护与恢复等),这个区域称为堆栈。
功能,主要用于保护中间数据、子程序的现场、中断程序的现场等。
堆栈的特点:
堆栈存储数据的原则为 后进先出 。
堆栈在存储器中的位置由 SS:SP确定。 SP指令可由 MOV指令设置。
堆栈指针 SP在 8086系统中始终指向栈的顶部,即:始终指向最后压入栈中的数据的地址。
8086系统中栈的操作是以字为单位的。执行一次入栈操作,
SP-2,直至 SP=0( SS )栈满为止。执行一次出栈操作,SP+2。
见教材 P39 图 2-13
1.统一编址又称“存储器映射方式”。在这种编址方式下,I/O端口地址置于 1MB的存储器空间中,在整个存储空间中划出一部分空间给外设端口,端口和存储单元统一编址。如,6502,6800.
优点,端口所需的地址线较少,地址译码器较简单,采用专用的 I/O指令,
端口操作指令执行时间少,指令长度短 。
缺点,输入输出指令类别少,一般只能进行传送操作。
2.独立编址又称,I/O映射方式”。这种方式的端口单独编址构成一个 I/O空间,
不占用存储器地址空间。如,8086
优点,无需专门的 I/O指令,对端口操作的指令类型多,从而简化了指令系统的设计。
缺点,端口占用存储器的地址空间,使存储器容量更加紧张,同时端口指令的长度增加,执行时间较长,端口地址译码器较复杂。
四,8086的 I/O编址
8086系统采用独立编址方式。有专用的 I/O指令( IN,OUT)。
8086允许有 64K( 65536个) 8位的 I/O端口,两个编号相邻的 8位端口可以组成一个 16位端口。指令系统中既有访问 8位端口的 I/O
指令,又有访问 16位端口的 I/O指令。
8086CPU执行访问 I/O端口指令时,硬件上产生 M/IO=0、
RD( 或 WR ) =0有效。端口地址不占用存储空间,端口地址独立编址构成 I/O空间。其特点是,I/O指令类型少,只能进行传送操作; M/IO,RD( 或 WR )两组信号,信号线根数多。
8086系统和外设之间都是通过 I/O接口芯片联系的,每个 I/O
接口芯片都有一个或几个端口,一个端口往往对应芯片内部的一个或一组寄存器,微机系统要为每个端口分配一个地址,此地址也称为端口号。各个端口号不能重复。
3,8086的 I/O编址
2-4 8086系统配置为了适应各种使用场合,在设计 8088/8086CPU芯片时,就考虑了其应能够使它工作在两种模式下,即最小模式与最大模式。
当把 8086的 33脚 MN/MX接地时,这时的系统处于最大模式。最大模式是相对最小模式而言的,它主要用在中等或大规模的 8086系统中。在最大模式系统中,总是包含有两个或多个微处理器,是多微处理器系统。其中必有一个主处理器 8086CPU,其他的处理器称为协处理器它们是协助主处理器工作的。
所谓最小模式,就是系统中只有一个 8086微处理器,是一个单微处理器系统。在这种系统中,所有的总线控制信号,都是直接由 8086CPU产生的,
系统中的总线控制逻辑电路被减到最少,该模式适用于规模较小的微机应用系统。
当把 8086的 33脚 MN/MX接 +5V时,8086 CPU就处于最小工作方式。
最小模式(最小工作方式 )
最大模式(最大工作方式 )
( 2)输入 /输出协处理器 8089,在原理上有点象带有两个 DMA
通道的处理器,它有一套专门用于输入 /输出操作的指令系统,
但是 8089又和 DMA控制器不同,它可以直接为输入 /输出设备服务,使主处理器不再承担这类工作。所以,在系统中增加 8089协处理器之后,会明显提高主处理器的效率,尤其是在输入 /输出操作比较频繁的系统中。
与 8088/8086CPU配合工作的协处理器有两类:
( 1)数值协处理器 8087,它能实现多种类型的数值运算,如高精度的整型和浮点型数值运算,超越函数(三角函数、对数函数)
的计算等,这些运算若用软件的方法来实现,将耗费大量的机器时间。换句话说,引入了 8087协处理器,就是把软件功能硬件化,
可以大大提高主处理器的运行速度。
一,8086/8088最小系统中的外围芯片简介
1,锁存器 Intel 8282(或 74LA373) P42 图 2-15
8282是典型的 8位锁存器,8位输入( DI0----DI7),8位输出
( DO0----DO7),选通输入信号(锁存输入信号) STB,输出数据允许信号 OE(低电平有效)。 74LS373作为锁存器,其用法与 8282完全一样。
8282与 8086连接时,作为 8086外部地址锁存器,8086有 20条地址线,加上高 8位数据允许引脚 BHE,共 21条线,需要 3片 8282。
8282的输入与 8086的地址线 A19----A16,AD15----AD0和 BHE相连,输出即为 8086系统的地址线和 BHE; 8282的 STB接 8086的 ALE,8282
的 OE接地,直接数据输出允许。 P41 图 2-14
2,总线收发器 Intel 8286/8287 P43 图 2-16
8286是 Intel系列典型的 8位总线收发器,8位输入( A0----A7),
8位输出( B0----B7)。
T为控制数据传送方向信号,T=1时,A0----A7为输入,B0----
B7为输出; T=0时,B0----B7为输入,A0----A7 为输出。输出数据允许信号 OE(低电平有效)。
8286与 8086连接时,作为 8086外部总线收发器,8086有 16条数据线,需要 2片 8286。 8286的输入与 8086的地址线 AD15----AD0
相连,输出即为 8086系统的数据总线; 8286的 T接 8086(或 8288)
的 DT/R,8286的 OE接 8086 (或 8288)的 DEN。 P41 图 2-14
3,时钟发生器 8284
3,时钟发生器 8284
( 1)输入,晶振与复位晶振接 8284的 X1,X2引脚( F/C接低电平,选择外界晶振产生时钟),外部复位接 RES引脚。
( 2)输出,CLK(时钟),RESET(复位),READY(准备好)
8284输出的时钟频率 CLK为外界晶振频率的 1/3。
CLK,RESET,READY分别为 8086系统提供时钟、复位、准备好信号。
( 3)外部复位的接法 (上电复位,按键复位),如下图所示。
上电复位 按键复位
4,总线控制器 Intel 8288 P47 2-21
8288是 Intel系列典型的 8位总线控制器,输入信号有,S2、
S1,S0,CLK,AEN(地址允许,由总线裁决器 8289输入,用于多总线之间的同步控制。单总线系统中; AEN 接地)、
CEN(命令允许信号,在多个 8288系统中,相当于 8288的片选;
单总线系统中; CEN 接高电平),IOB(总线工作方式控制,
当 IOB接高电平时,8288处于局部总线工作方式;当 IOB接低电平时,8288处于系统总线工作方式。单总线系统中,8288为系统总线工作方式,IOB接地)。
输出信号有,MRDC (存储器读),MWTC(存储器写),AMWC(存储器超前写,比 MWTC提前一个时钟出现,使一些较慢的存储器可得到一个额外的时钟执行周期执行写操作),IORC( I/O读),IOWC( I/O写),AIOWC( I/O超前写),INTA(中断相应),DT/R(数据收发方向控制),DEN(数据传送允许),ALE(地址锁存),MCE/PDEN(主控级联允许 /外设数据允许。当 IOB接地,8288工作在系统总线方式时,此引脚作 MCE用;它在中断响应周期用于控制主 8259向从 8259输出级联地址 CAS2----CAS0的锁存。当 IOB接高电平,8288工作在局部总线方式时,此引脚作 PDEN用,用于控制外设通过局部总线传送数据)。
1,MN/MX端接 +5V,决定了 CPU的工作模式;
2,需要一片 8284A,作为时钟信号发生器;
3,需要三片 8282或 74LS273,用来作为地址信号的锁存器;
4,当系统中所连的存储器和外设端口较多时,需要增加数据总线的驱动能力,这时,需用 2片 8286/8287作为总线收发器。
8286输入与输出同相,8287输入与输出反相,其余功能相同。
8086最小模式系统配置电路图如下页图所示。
二,8086最小模式下的典型配置
8086最小模式系统配置 P41 2-14
在最大模式的系统中,一般还有中断优先级管理部件。
8259A用以对多个中断源进行中断优先级的管理,但如果含有的设备不多,也可以不用中断优先级管理部件。 但在最小模式的系统中,如果含有的设备比较多,就必须外扩中断优先级管理部件。
三,8086最大模式下的典型配置
8086最大模式和最小模式在配置上的主要差别在于在最大模式下,要用 8288总线控制器来对 CPU发出的控制信号进行变换和组合,以得到对存储器或 I/O 端口的读 /写信号和对锁存器 8282及总线收发器 8286的控制信号。其余相同。
最大模式系统中,需要用总线控制器来变换与组合控制信号的原因在于:在最大模式的系统中,一般包含 2个或多个处理器,
这样就要解决主处理器和协处理器之间的协调工作,和对系统总线的共享控制问题,8288总线控制器就起了这个作用。
最大模式下需要使用 8288总线控制器,可构成多处理器系统,
所以 8288提供两种工作方式,由引脚 IOB进行选择。
I/O总线方式,IOB引脚接高电平,8288处于局部总线工作方式。
此方式下所有的 I/O命令线处于“允许状态”,即处理器进行
I/O操作不需要总线仲裁器发出 AEN信号,8288立即会发出相应的 IORC,INTA或 IOWC,AIOWC信号,并通过 PDEN和
DT/R启动命令线,去控制总线收发器工作。
系统总线工作方式,IOB引脚接地,8288处于系统总线方式。
此时总线仲裁电路向 8288的 AEN端发送一个低电平,表示总线可供使用 (CEN高电平 )。在多处理器系统中,如果 I/O设备和存储器均被多个处理器共享。系统中必须使用总线裁决,所以
8288必须工作在系统总线方式下。
最大模式下的系统典型配置 P46 2-20
2-4 8086CPU时序时序,时序是计算机操作运行的时间顺序。
可以深入了解指令的执行过程。
可以使我们在程序设计时,选择合适的指令或指令序列,以尽量缩短程序代码的长度及程序的运行时间。因为对于实现相同的功能,可以采用不同的指令或指令序列,而这些指令或指令序列的字节数及执行时间有可能不相同的。
对于学习各功能部件与系统总线的连接及硬件系统的调试,都十分有意义,因为 CPU与存储器,I/O端口协调工作时,存在一个时序上的配合问题。
能更好地处理微机用于过程控制及解决实时控制的问题。
可以进一步了解在微机系统的工作过程中,CPU各引脚上信号之间的相对时间关系。由于微处理器内部电路、部件的工作情况,用户是看不到的,通过检测 CPU引脚信号线上各信号之间的相对时间关系,是判断系统工作是否正常的一种重要途径。
为什么要研究时序?
取指令进入指令队列和访问存储器,I/O端口时均需 BIU执行一个总线周期。
一,8086的总线周期
T3,高 4位总线仍然输出状态信息,低 16位总线上出现的是数据信号。
读 ----存储器或 I/O端口的数据送到总线上,写 ----CPU的数据送到总线上。
T2,低 16位地址信号从总线上撤销,呈高阻。高 4位地址总线输出状态信息(指出可屏蔽中断是否允许,当前正在使用的段寄存器)。
T1,CPU向多路复用总线发出地址信息,指出要寻址的存储单元或 I/O端口。
( 4)一个基本的总线周期的 4个 T状态:
( 3)指令周期,执行一条指令所需要的时间称为指令周期,不同指令的指令周期的长短是不同的。一个指令周期是由几个总线周期组成的。
( 2)总线周期,BIU完成一次访问存储器或 I/O端口操作所需要的时间称为总线周期。一个基本的总线周期是由 4个 (或 4个以上)时钟周期组成的。
( 1)时钟周期,CPU时钟频率的倒数称为时钟周期,也称 T状态。
( 5)空闲周期,一个总线周期后,不立即执行下一个总线周期,系统总线处于空闲状态,执行空闲周期(可为一个或多个时钟周期)。处于空闲周期时,总线高 4位上 CPU仍然驱动前一个总线周期的状态信息;若前一个总线周期是写周期,总线低 16位上仍然驱动前一个总线周期的数据信息,若前一个总线周期是读周期,总线低 16位呈高阻。
CLK
T1
总线周期 总线周期地址 缓冲 数据 地址 缓冲 数据地址 /数据总线
T2 T3 T4 T1 T2 T3 T4
典型的总线周期波形图注,当被写入(或读出)数据的存储器或 I/O端口不能及时配合 CPU传送数据的情况下,存储器或 I/O端口向 CPU发出数据未准备好信号( READY),
则 CPU会在 T3之后插入一个或多个附加的时钟周期 T3(等待转态),直至存储器或 I/O端口准备好传送数据为止。
T4,总线周期结束。
典型的总线周期波形如下图所示。
8086/8088的复位和启动操作,是通过 RESET引脚上的触发信号来执行的,当 RESET引脚上维持有 4个时钟高电平 时 ( 如果是初次上电复位,则要求 RESET引脚上维持有 50μs的高电平 ),
CPU就结束当前操作,进入初始化 ( 复位 ) 过程 。 包括把各内部寄存器 ( 除 CS) 清 0,标志寄存器清 0,指令队列清 0,将
FFFFH送 CS。 重新启动后,系统从 FFFF0H开始执行指令 。 重新启动的动作是当 RESET从高到低跳变时触发 CPU内部的一个复位逻辑电路,经过 7个 T状态,CPU即自动启动 。
二,8086微机系统的主要操作
8086/8088微机系统,能够完成的操作有下列几种主要类型:
系统的复位与启动操作;暂停操作; 总线操作( I/O读,I/O
写、存贮器读、存贮器写) ;中断操作;最小模式下的总线保持;最大模式下的总线请求 /允许。 共 6个。
三,系统的复位和启动操作(对最大小模式都一样)
注意,由于在复位操作时,标志寄存器被清 0,因此其中的中断标志 IF也被清 0,这样就阻止了所有的可屏蔽中断请求,都不能响应,即复位以后,若需要必需用开中断指令来重新设置 IF标志 。 复位时各内部寄存器的值如 P26表 2.6所示 。 复位时总线信号状态如 P49表 2-13所示 。 复位操作的时序图如下图所示 。
按数据传输的方向来分,总线操作可分为总线读和总线写操作;按照读 /写的不同对象,总线操作又可分为存储器读 /写与
I/O读 /写操作。 注意,这里所说的读 /写总是站在 CPU的角度。
总线读操作 是指 CPU从存储器或 I/O端口读取数据,总线写操作是指 CPU向存储器或 I/O端口写入数据。
四,总线操作总线操作,执行总线周期即为总线操作。
下面仅以最小模式下的总线读操作为例说明总线操作时序,其余需要大家自学 P52-55。
一个最基本的读周期包含有 4个状态,即 T1,T2,T3,T4,
必要时可插入 1个或几个 TW状态。
( 1) 为了要从存储器或 I/O端口读出数据,必须设置 M/IO信号 ( 1----存储器读,0---- I/O读 ) 有效,此信号一直保持到整个总线周期结束 ( 即 T4状态 ) 。 ( T1 ---- T4 )
( 5)当系统中配有总线驱动器时,T1状态使 DT/R变低,用来表示本周期为读周期,并通知总线收发器 8286(连接 8286的 T引脚)接收数据。 ( T1----
T4)
( 4) BHE(对 8088无用)有效,用来表示高 8位数据总线上的信息有效,现在通过 A15 ---- A8传送的是有效地址信息。 BHE常作为奇地址存储体的选通信号,因为奇地址存储体中的信息总是通过高 8位数据线来传输,而偶地址体的选通则用 A0。 ( T1 ---- T2的一半)
( 3)地址锁存 ALE有效,在最小模式的系统配置中我们讲过,地址信号通过地址锁存器 8282锁存,ALE即为 8282的锁存信号,下降沿有效。 ( T1 )
( 2)地址线信号(存储器或 I/O端口)有效,高 4位通过地址 /状态线 A19/S6---
-A16/S3送出,低 16位通过地址 /数据线 AD15----AD0送出,用来指出操作对象
(存储器或 I/O端口)的地址。 20位地址,A19/S6----A16/S3,AD15----AD0。
( T1 ---- T2的一半)
1,T1状态
( 1) A19 ---- A0在 T2中间消失 。 高四位地址 /状态线送出状态信息
S6----S3;低 16位地址 /数据线 AD15----AD0浮空,为下面传送数据准备 。
( 2) BHE/S7引脚成为 S7( 8086中无定义 ) 。
( 3) RD有效,表示要对存储器或 I/O端口进行读 。 ( T2---- T3)
( 4) DEN有效,使得总线收发器 8286 ( 连接 8286的 OE引脚 ) 可以传输数据 。 ( T2----T3)
只有被地址信号选中的存储器单元或 I/O端口才会被 RD信号从中读出数据,并将数据送到系统的数据总线上 。
被地址信号选中的存储器单元或 I/O端口将数据送到系统的数据总线 AD15----AD0上。 CPU通过 AD15----AD0接收数据。在 AD15-
---AD0在 ( T3---- T4一半) 有效。
3,T3状态
2,T2状态
4,TW状态若系统外扩的存储器或外设速度较慢,不能满足 8086的基本时序要求
(即不能及时送出数据),则通过 READY线通知 CPU,CPU在 T3的前沿
(即 T2结束末的下降沿)检测 READY,若发现 READY= 0,则在 T3结束后自动插入 1个或几个 TW,并在每个 T3的前沿处检测 READY,等到 READY变高后,则自动脱离 TW进入 T4状态。
最后一个 TW状态,数据肯定已出现在数据总线 AD15----AD0上;最后一个
TW状态的总线操作同 T3状态;其他 TW状态的所有控制信号的电平状态和 T3
状态一样,只是数据尚未出现在数据总线 AD15----AD0上。
5,T4状态在 T4与 T3(或 TW)状态的交界处(即 T4的前沿 ----下降沿),CPU对数据总线 AD15----AD0采样 ----采集数据,从而获得数据。使各控制及状态线进入无效。总线读操作时序图如下页图所示。
总线读操作时序图
P55
1,4,5,10 a) d),15,16,18,21
画出 8086系统最小模式与最大模式系统配置电路图作业: