第3 章8086/8088微处理器及其 系统 在微处理器领域,Intel系列CPU 产品一直占据着主导地位。尽管8086/8088后续的 80286、80386、80486以及Pentium 系列CPU 结构与功能已经发生很大的变化,但从基本概 念与基本结构以及指令格式上来讲,它们仍然是经典的8086/8088CPU 的延续与提升。 并且,其他系列流行的CPU(如AMD 公司的6x86 MX/MⅡ 等)也可以与80x86CPU 兼容。 本章着重介绍Intel8086/8088微处理器及其指令系统。以此为基础,将在第8章中简 要介绍80286、80386、80486与Pentium 系列微处理器的结构特点及其技术精髓。 3.1 8086/8088微处理器 8086是Intel系列的16位微处理器。在推出8086之后不久,Intel公司还推出了准16 位微处理器8088。8088的内部寄存器、运算器以及内部数据总线与8086一样都是按16位 设计的,但其外部数据总线只有8条。这样设计的目的主要是为了与Intel原有的8位外围 接口芯片直接兼容。 3.1.1 8086/8088CPU 的内部结构 8086/8088CPU 的内部结构基本上是相似的,为了简化,在图3.1中只绘制了8086 CPU 的内部功能结构框图。由图3.1可知,8086/8088CPU 内部可分为两个独立的功能单 元,即总线接口单元(BusInterfaceUnit,BIU)和执行单元(ExecutionUnit,EU)。 1.总线接口单元 BIU 是与总线连接的接口部件,其基本功能是根据执行单元的请求负责CPU 与存储 器或I/O 端口之间的数据传送。在CPU 取指令时,它从内存中取出指令送到指令队列缓 冲器;而在执行指令时,它要与指定的内存单元或者I/O 端口交换数据。 BIU 内有4个16位段寄存器,即CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段 寄存器)和ES(附加段寄存器),16位指令指针IP,6B指令队列缓冲器,20位地址加法器和 总线控制电路。 图3. 1 8086/8088CPU 的内部功能结构框图 1)指令队列缓冲器 8086 的指令队列由6字节的寄存器组成,最多可存入6B 的指令代码,而8088 的指令 队列只有4B 。在8086/8088 执行指令时,将从内存中取出1条或几条指令,依次放在指令 队列中。它们采用“先进先出”的原则,按顺序存放,并按顺序取到EU 中去执行。其操作将 遵循下列原则。 (1)取指令时,每当指令队列中存满1条指令后,EU 就立即开始执行。 (2)当指令队列中空出2个(对8086)或1个(对8088)指令字节时,BIU 便自动执行取 指操作,直到填满为止。 (3)EU 在执行指令的过程中,若CPU 需要访问存储器或I/O端口,则EU 自动请求 BIU 去完成访问操作。此时若BIU 空闲,则会立即完成EU 的请求;否则,BIU 首先将指令 取至指令队列,再响应EU 的请求。 (4)当EU 执行完转移、调用和返回指令时,则要清除指令队列缓冲器,并要求BIU 从 新的地址重新开始取指令,新取的第1条指令将直接经指令队列送到EU 去执行,随后取来 的指令将填入指令队列缓冲器。 2)地址加法器和段寄存器 8086 有20 根地址线,但内部寄存器只有16 位,不能直接提供对20 位地址的寻址信 息。如何实现对20 位地址的寻址呢? 这里采用了一种称为“段加偏移”的重要技术,即采用 将可移位的16 位段寄存器与16 位偏移地址相加的办法,从而巧妙地解决了这一矛盾。具 体地说,就是利用各段寄存器分别来存放确定各段的20 位起始地址的高16 位段地址信息, 而由IP 提供或由EU 按寻址方式计算出寻址单元的16 位偏移地址(又称逻辑地址或偏移 量), 然后,将它与左移4位后的段寄存器的内容同时送到地址加法器进行相加,最后形成一 个20 位的实际地址(又称物理地址), 2所示为实际地址的产生过 以对存储单元寻址。图3. 第 3 章8086/8088 微处理器及其系统 程。例如,要形成某指令码的实际地址,就要将IP 的值与代码段寄存器(CodeSegment,CS)左移4位 后的内容相加。 【例3.假设CS=4000H,= 1】IP0300H,则指令 的物理地址PA=4000H×16+0300H=40300H 。 3)16 位指令指针 IP(ntrutiooner)的功能与8位CPU 中 IscnPit 2 实际地址) 的PC 类似。正常运行时 , IP 中含有BIU 要取的下 图3.物理地址( 的产生过程 一条指令(字节)的偏移地址。IP 在程序运行中能 自动加1修正,使之指向要执行的下一条指令(字节)。有些指令(如转移、调用、中断和返回 指令)能使IP 值改变,或将IP 值压进堆栈保存,或由堆栈弹出恢复原值。 2. 执行单元 EU 的功能是负责执行指令,执行的指令从BIU 的指令队列中取得,执行指令的结果或 执行指令所需要的数据,都由EU 向BIU 发出请求,再由BIU 经总线控制电路对存储器或 I/O端口存取。EU 由下列5部分组成。 (1)16 位算术逻辑单元(ALU):可以用于进行算术、逻辑运算,也可以按指令的寻址 方式计算出寻址单元的16 位偏移量。 (2)16 位标志寄存器F:用来反映CPU 运算的状态特征或存放控制标志。 (3)数据暂存寄存器:协助ALU 完成运算,暂存参加运算的数据。 (4)通用寄存器组:包括4个16 位数据寄存器,即AX 、BX 、CX 、DX,以及4个16 位指 针与变址寄存器,即SP 、BP 与SI 、DI 。 (5)EU 控制电路:是控制、定时与状态逻辑电路,接收从BIU 中指令队列取来的指令, 经过指令译码形成各种定时控制信号,对EU 的各个部件实现特定的定时操作。 EU 中所有的寄存器和数据通道(除队列总线为8位外)都是16 位的宽度,可实现数据 的快速传送。 注意:由于BIU 与EU 分开独立设计,因此,在一般情况下,CPU 执行完一条指令后就 可以立即执行下一条指令。16 位CPU 这种并行重叠操作的特点,提高了总线的信息传输 效率和整个系统的执行速度。 8088CPU 的内部结构与8086 的基本相似,只是8088 的BIU 中指令队列长度为 4字节;8088 的BIU 通过总线控制电路与外部交换数据的总线宽度是8位,总线控制电路 与专用寄存器组之间的数据总线宽度也是8位。 3.2 8086/8088 的寄存器结构 1. 对于微机应用系统的开发者来说,最重要的是掌握CPU 的编程结构或程序设计模型。 8086/8088 的内部寄存器编程结构如图3. 3所示。它共有13 个16 位寄存器和1个只用了 9位的标志寄存器。其中,阴影部分与8080/8085CPU 相同。 下面将根据寄存器的功能分别加以简要说明。 44 新编16/32 位微型计算机原理及应用(第 6 版 ) 图3. 3 8086/8088 的编程结构 1. 通用寄存器 通用寄存器分为两组,一组是数据寄存器;另一组是指针寄存器和变址寄存器。 (1)数据寄存器:执行单元(EU)中有4个16 位数据寄存器,即AX 、BX 、CX 和DX 。 每个数据寄存器分为高字节H和低字节L,它们均可作为8位数据寄存器独立寻址,独立 使用。 多数情况下,这些数据寄存器用在算术运算或逻辑运算指令中,用来进行算术逻辑运 算。在有些指令中,它们则有特定的用途。这些寄存器在指令中的特定功能是被系统隐含 使用的(如表3. 1所示)。 表3.数据寄存器的隐含使用 1 寄存器操作寄存器操作 AX AL AH BX CX 字乘,字除,字I/O 字节乘,字节除,字节I/O,转换,十进制运算 字节乘,字节除 转换 数据串操作,循环 CL DX SP SI DI 多位移位和旋转 字乘,字除,间接I/O 堆栈操作 数据串操作 数据串操作 (2)指针寄存器和变址寄存器:指针寄存器是指堆栈指针寄存器(SP)和堆栈基址指针 寄存器(BP), 简称P组。变址寄存器是指源变址寄存器(SI)和目的变址寄存器(DI), 简称I 组。它们都是16 位寄存器,一般用来存放偏移地址。 SP 和BP 都用来指示存取位于当前堆栈段中的数据所在的地址,但SP 和BP 在使用上 有区别。入栈(PUSH)和出栈(POP)指令是由SP 给出栈顶的偏移地址,故称为堆栈指针寄 存器。而BP 则是存放位于堆栈段中的一个数据区基地址的偏移地址,故称为堆栈基址指 针寄存器。显然,由SP 所指定的堆栈存储区的栈顶和由BP 所指定的堆栈段中某一块数据 区的首地址是两个不同的意思,不可混淆。 SI 和DI 是存放当前数据段的偏移地址的。源操作数的偏移地址存放于SI 中,所以SI 第 3 章8086/8088 微处理器及其系统 称为源变址寄存器;目的操作数偏移地址存放于DI中,故DI称为目的变址寄存器。例如, 在数据串操作指令中,被处理的数据串的偏移地址由SI给出,处理后的结果数据串的偏移 地址则由DI给出。 2.段寄存器 8086/8088CPU内部设计了4个16位的段寄存器,用这些段寄存器的内容作为段地 址,再由段寄存器左移4位形成20位的段起始地址,它们通常被称为段基地址或段基址。 再利用“段加偏移”技术,8086/8088就有可能寻址1MB存储空间并将其分成为若干逻辑 段,使每个逻辑段的长度为64KB(它由16位的偏移地址限定)。 注意:这些逻辑段可以通过修改段寄存器的内容被任意设置在整个1MB存储空间上 下浮动。换句话说,逻辑段在存储器中定位以前,还不是微处理器可以真正寻址的实际内存 地址,也正因为这样,通常人们就将未定位之前在程序中存在的地址称为逻辑地址。这个概 念对于后面将要讨论的程序“重定位”十分有用。 4个16位段寄存器都可以被指令直接访问。其中,CS用来存放程序当前使用的代码 段的段地址,CPU执行的指令将从代码段取得;SS用来存放程序当前所使用的堆栈段的段 地址,堆栈操作的数据就在堆栈段中;DS用来存放程序当前使用的数据段的段地址,一般来 说,程序所用的数据就存放在数据段中;ES用来存放程序当前使用的附加段的段地址,也用 来存放数据,但其典型用法是存放处理后的数据。 3.标志寄存器 8086/8088的16位标志寄存器F只用了其中的9位作为标志位,即6个状态标志位,3 个控制标志位。 如图3.低8位FL的5个标志与8080/8085的标志相同。 4所示, ← 15 FH → 8 7 FL → 0 OF DF IF TF SF ZF AF PF CF 图3. 4 8086/8088的标志寄存器 状态标志位用来反映算术或逻辑运算后结果的状态,以记录CPU的状态特征。下面 介绍这6个标志位。 (1)CF(CaryFlag):进位标志。当执行一个加法或减法运算使最高位产生进位或借 位时,则CF为1;否则为0。此外,循环指令也会影响它。 (2)PF(ParityFlag):奇偶性标志。当指令执行结果的低8位中含有偶数个“1”时,则 PF为1;否则为0。此标志位用于微机中传送信息时,对产生的代码出错情况提供检测条 件。此标志在现代程序设计中很少使用;现在,奇偶校验常常由数据通信设备完成,而不是 由微处理器完成。 (3)AF(AuxiliaryCaryFlag):辅助进位标志。当执行一个加法或减法运算使结果的 低字节的低4位向高4位(即D3 位向D4 位)进位或借位时,则AF为1;否则为0。DAA和 DAS指令测试这个特殊标志位,该标志一般用在BCD码运算中作为是否需要对AL寄存 器进行十进制调整的依据。 (4)ZF(ZeroFlag):零标志。用来表示一个算术或逻辑操作的结果是否为0。若当前 新编16/32 位微型计算机原理及应用(第 6 版 ) 的运算结果为0,则ZF为1;否则为0。 (5)SF(SignFlag):符号标志。它是保持算术或逻辑运算指令执行后结果的算术符 号。它和运算结果的最高位相同。当数据用补码表示时,负数的最高位为1,正数的最高位 为0。 (6)OF(OverflowFlag):溢出标志。用于判断在有符号数进行加法或减法运算时是 否可能出现溢出。溢出将指示运算结果已超出机器能够表示的数值范围。当补码运算有溢 出时,例如,用8位加法将7FH(+127)加上01H,结果为80H(-128 )。由于此结果已超出 8位二进制补码所能表示的最大整数范围(+127),故此时OF标志为1;否则为0。 注意:对于无符号数的操作,将不考虑溢出标志。 控制标志位有3个,用来控制CPU的操作,由程序设置或清除。 (1)DF(DirectionFlag):方向标志。它用来控制数据串操作指令的步进方向。若用 STD指令将DF置1,则数据串操作过程中地址会自动递减;若用CLD指令将DF清零,则 数据串操作过程中地址会自动递增。地址的递增或递减由DI或SI变址寄存器来实现。 (2)IF(neptEalag):中断允许标志。它是控制可屏蔽中断的标志。若用 ItrunbeFlSTI指令将IF置1,则表示允许8086/8088CPU接收外部从其INTR引脚上发来的可屏蔽 中断请求信号;若用CLI指令将IF清零,则禁止CPU接收外来的可屏蔽中断请求信号。 IF的状态不影响非屏蔽中断(NMI)请求,也不影响CPU响应内部的中断请求。 (3)TF(TrapFlag):跟踪(陷阱)标志。它是为调试程序方便而设置的。若将TF标志 置为1,则CPU处于单步工作方式;否则,将正常执行程序。 注意:在高型号微处理器中,跟踪(陷阱)标志能够激活芯片上的调试特性(调试程序, 以便找到错误或故障)。当TF标志为1时,则微处理器将根据调试寄存器和控制寄存器的 指示中断程序流。 最后需要指出的是,8086/8088所有上述标志位对Intel系列后续高型号微处理器的标 志寄存器都是兼容的,只不过后者有些增强功能或者新增加了一些新的标志位而已。 3.3 总线周期 1. 总线周期是微处理器操作时所依据的一个基准时间段,通常,它是指微处理器完成一次 访问存储器或I/O端口操作所需的时间。 T2 对于8086/8088CPU来说,总线周期由4个时钟周期组成,这4个时钟周期也称为T1、 、T3 与T4 四个状态;在每一个状态中,CPU在操作时,总线所处的状态都不同。一般在 T1 状态,CPU往多路复用总线上发送寻址的地址信息,以选中某个被寻址的存储器单元或 端口地址;在T2 状态,CPU从总线上撤销地址,为传送数据做准备;在T3 状态,多路总线的 高4位继续提供状态信息,而其低16位(对8086CPU)或低8位(对8088CPU)上将出现由 CPU读入或写出的数据;在T4 状态,CPU采样数据总线,完成本次读或写操作,最后结束 总线周期。 注意:不同的CPU,其在一个总线周期内所处的总线状态是不同的;而即使同一个 CPU,其读操作或写操作的具体状态也不相同。一般,在T2~T4,若是写操作,则CPU在 此期间是先把输出数据送到总线上;若是读操作,则CPU在T3~T4 期间将从总线上输入 第 3 章8086/8088 微处理器及其系统 数据。T2 时复用地址数据总线处于悬空状态,以便使CPU 有一个缓冲时间把输出地址的 写操作转换为输入数据的读操作。 此外,如果存储器或外设的速度较慢,不能及时地跟上CPU 的速度时,存储器或外设 就会通过READY 信号线在T3 状态启动之前向CPU 发一个“数据未准备好”信号,并且, CPU 会在T3 之后自动插入一个或多个等待状态TW,以等待存储器或外设准备好传送数据。 只有在存储器或外设准备就绪时,它们才又通过READY 的信号线向CPU 发出一个有效的 “准备好”信号,CPU 接收到这一信号后,才会自动脱离TW 状态而进入T4 状态。 总线周期只用于CPU 取指和它同存储器或I/O端口交换数据;否则,总线接口单元 BIU 将不和总线“打交道”,即系统总线处于空闲状态,即执行空闲周期,这时,虽然CPU 对 总线进行空操作,但CPU 内部的执行单元EU 仍在进行操作,例如,逻辑运算单元ALU 仍 在进行运算,内部寄存器之间也在传送数据。 图3. 5所示为一个典型的总线周期序列。 图3.一个典型的总线周期序列 5 3.4 8086/8088 的引脚信号和功能 1. 图3. 6所示为8086 和8088 的引脚信号图。它们的40 条引线按功能可分为以下5类。 1. 地址/数据总线 AD15~AD0 是分时复用的存储器或端口的地址和数据总线。传送地址时为单向的三 态输出,而传送数据时可为双向三态输入/输出。8086/8088CPU 正是利用分时复用的方 法才能使其用40 条引脚实现20 位地址、16 位数据及众多控制信号和状态信号的传输。在 8088 中,由于只能传输8位数据,因此,只有AD7~AD08条地址/数据线,A15~A8 只用来 输出地址。 作为复用引脚,在总线周期的T1 状态用来输出要寻址的存储器或I/O端口地址;在T2 状态浮置成高阻状态,为传输数据作准备;在T3 状态,用于传输数据;T4 状态结束总线周 期。当CPU 响应中断以及与系统总线“保持响应”时,复用线都被浮置为高阻状态。 2. 地址/状态总线 地址/状态总线A19/S6~A16/S3 为输出、三态总线,采用分时输出,即T1 状态输出地址 的最高4位,T2~T4 状态输出状态信息。当访问存储器时,T1 状态时输出的A19~A16 送到 锁存器(8282)锁存,与AD15~AD0 组成20 位的地址信号;而访问I/O端口时,不使用这4 条引线,即A19~A16=0。状态信息中的S6 为0用来指示8086/8088 当前与总线相连,所 新编16/32 位微型计算机原理及应用(第 6 版 ) 图3.括号中为最大方式时的引脚名称) 6 8086/8088 的引脚信号( 以,在T2~T4 状态,S6 总等于0,以表示8086/8088 当前连在总线上。S5 表明中断允许标志位 IF 的当前设置。S4 和S如表3. 3 用来指示当前正在使用哪个段寄存器,2所示。 表3.、 3 的代码组合和对应的状态 2 S4S S4S3状态 0 0 1 1 0 1 0 1 当前正在使用ES 当前正在使用SS 当前正在使用CS 或未用任何段寄存器 当前正在使用DS 当系统总线处于“保持响应”状态时,这些引线被浮置为高阻状态。 3. 控制总线 (1)BHE/S7:高8位数据总线允许/状态复用引脚,三态、输出。BHE 在总线周期的 T1 状态时输出,S7 在T2~T4 时输出。在8086 中,当BHE/S7 引脚上输出BHE 信号时,表 示总线高8位AD15~AD8 上的数据有效。在8088 中,第34 引脚不是BHE/S7,而是被赋予 另外的信号:在最小方式时,它为SS0, R、.. 和DT/..M/IO 一起决定了8088 当前总线周期的 读/写动作;在最大方式时,它恒为高电平。S7 在当前的8086 芯片设计中未被赋予定义,暂 作备用状态信号线。 (2)RD:读控制信号,三态、输出。当RD=0时,表示CPU 执行存储器或I/O端口的 读操作。是对内存单元还是对I/O端口读取数据,取决于M/IO(或..信 号。在执行DMA 操作时,RD 被浮空。 8086) M/IO(8088) (3)READY:“准备好”信号线,输入。该引脚接收被寻址的内存或I/O端口发给CPU 的响应信号,高电平时表示内存或I/O端口已准备就绪,CPU 可以进行数据传输。CPU 在 第 3 章8086/8088 微处理器及其系统 T3 状态开始对READY 信号采样。若检测到READY 为低电平,表示内存或 I/O端口尚未准备就绪,则CPU 在T3 状态之后自动插入等待状态TW,直到READY 变为 高电平,内存或I/O端口已准备就绪,CPU 才可以进行数据传送。 (4)TEST:等待测试输入信号,低电平有效。它用于多处理器系统中且只有在执行 WAIT 指令时才使用。当CPU 执行WAIT 指令时,它就进入空转的等待状态,并且每隔5 个时钟周期对该线的输入进行一次测试;若TEST=1,则CPU 将停止取下一条指令而继续 处于等待状态,重复执行WAIT 指令,直至TEST=0时,CPU 才结束WAIT 指令的等待状 态,继续执行下一条指令。等待期间允许外部中断。 (5)INTR:可屏蔽中断请求输入信号,高电平有效。它为高电平时,表示外设有中断 请求,CPU 在每个指令周期的最后一个T状态采样此信号。若IF=1,则CPU 响应中断, 并转去执行中断服务程序。若IF=0(关中断), 则外设的中断请求被屏蔽,CPU 将不响应 中断。 (6)NMI:非屏蔽中断请求输入信号,上升沿触发。此信号不受IF 状态的影响,只要 它一出现,CPU 就会在现行指令结束后引起中断。 (7)RESET:复位输入信号,高电平有效。通常,它与8284A(时钟发生/驱动器)的复 位输出端相连,而初次接通电源时所 8086/8088 要求复位脉冲宽度不得小于4个时钟周期, 引起的复位,则要求维持的高电平不能小于50μs;复位后,CPU 的主程序流程恢复到启动时 的循环待命初始状态,其内部寄存器状态如表3.RESET 线保持低 电平。 3所示。在程序执行时, 表3.复位后内部寄存器的状态 3 内部寄存器状态内部寄存器状态 标志寄存器清除SS 0000H IP 0000H ES 0000H CS FFFFH 指令队列缓冲器清除 DS 0000H (8)CLK:系统时钟,输入。通常与8284A 时钟发生器的时钟输出端CLK 相连,该时钟 信号的低/高之比常采用2∶1(占空度为1/3)。 4. 电源线和地线 电源线VCC 接入的电压为+5V±10%,有两条地线GND,均应接地。 5. 其他控制线 这些控制线(24~31 引脚)的功能将根据方式控制线MN/MX 所处的状态而确定。关 于这些引脚在最小方式与最大方式下的具体功能差异,将在3. 2节中给予详细说明。 由上述可知,8086/8088CPU 引脚的主要特点是:数据总线和地址总线的低16 位 AD15~AD0 或低8位AD7~AD0 采用分时复用技术。还有一些引脚也具有两种功能,这由 引脚33(MN/MX)来控制。当MN/MX=1时,8086/8088 工作于最小方式(MN), 在此方 式下,全部控制信号由CPU 本身提供。当MN/MX=0时,8086/8088 工作于最大方式,这 时系统的控制信号由8288 总线控制器提供,而不是由8086/8088 直接提供。 新编16/32 位微型计算机原理及应用(第 6 版 ) 2 8086/8088 系统的最小/最大工作方式 3. 由8086/8088CPU 构成的微机系统,有最小方式和最大方式两种系统配置方式。 3.1 最小方式 2. 8086 与8088 构成的最小方式系统区别甚小,现以8086 最小方式系统为例加以说明。 当MN/MX 接电源电压时,系统工作于最小方式,即单处理器系统方式,它适合于较小 规模的应用。8086 最小方式典型的系统结构如图3. 7所示。它和8位微处理器系统类似, 系统芯片可根据用户需要接入。图3.外接晶体的基本振 7中的8284A 为时钟发生/驱动器, 荡频率为15MHz,经8284A 三分频后,送给CPU 作系统时钟。8282 为8位地址锁存器,当 8086 访问存储器时,在总线周期的T1 状态下发出地址信号,经8282 锁存后的地址信号可 以在访问存储器操作期间保持不变,为外部提供稳定的地址信号。由于8282 是8位的锁存 器芯片,而8086/8088 有20 位地址,加上还有BHE 与ALE 信号连到8282 片上,因此,需要 采用3片8282 地址锁存器才能满足系统总线连接的需要。8286 为具有三态输出的8位数 据总线收发器,用于需要增加驱动能力的系统。在8086 系统中,要用2片8286,而在8088 系统中,只用1片8286 即可。2142 为1KB×4 位的静态RAM,2716EPROM 为2KB×8 位的可编程序只读存储器。8086/8088 有20 位地址信号线A19~A0,组成系统时将根据所 使用的存储器的实际地址进行选用。 图3. 7 8086 最小方式典型的系统结构示意图 第 3 章8086/8088 微处理器及其系统 15 系统中还有一个等待状态产生电路,它为8284A 的RDY 端提供一个信号,经8284A 同步后向CPU 的READY 线发送准备就绪信号,通知CPU 数据传送已经完成,可以退出当 前的总线周期。当READY=0时,CPU 在T3 之后会自动插入TW 状态,以避免CPU 与存储 器或I/ O 设备进行数据交换时,因后者速度慢来不及完成读/写操作而丢失数据。 在最小方式下,第24~31 脚的信号含义如下所示。 (1)INTA:中断响应信号,输出,低电平有效。它表示8086/8088CPU 对外设中断请 求INTR 作出的响应信号。INTA 信号被设计为在相邻的两个总线周期中送出两个连续的 负脉冲,第1个负脉冲是通知外设端口,它发出的中断请求已获允许;而在第2个负脉冲期 间,外设端口(例如中断控制器)将往数据总线上发送一个中断类型码n,使CPU 可以得到 有关此中断的相应信息。 (2)ALE:地址锁存信号,输出,高电平有效。它是8086/8088CPU 提供给地址锁存器 8282/8283 的控制信号。ALE 在T1 状态为高电平时,表示当前在地址/数据复用总线上输 出的是有效地址,由地址锁存器把它作为锁存控制信号而将地址锁存其中。 注意:ALE 信号总是接到锁存器的STB 端。 (3)DEN:数据允许信号,输出,低电平有效,三态。这是CPU 提供给8286/8287 数据 总线收发器的三态控制信号,接到OE 端。该信号决定了是否允许数据通过数据总线收发 器:当DEN(即OE)=1时,禁止收发器在收或发两个方向上传送数据;当DEN(即OE)=0时 , 才允许收发器传送数据。因此,总线收发器将DEN 作为数据收发的允许信号。在DMA 方 式时,DEN 被置为浮空。 (4)DT/..输出, R:数据收发信号 , 三态。用于控制8286/8287 的数据传送方向。当 DT/..R=1时,表示CPU 通过收发器发送数据 ; R=0时 , 式时,它被置为浮空。 当DT/..表示接收数据。在DMA 方 (5)M/IO:存储器/输入输出控制信号,输出,三态。用于区分CPU 当前是访问存储 器还是访问输入/输出端口。高电平表示访问存储器,低电平表示访问输入/输出设备。在 DMA 方式时,它被置为浮空。 .. 注意:8088CPU 的此引脚为M/IO 。 (6)WR:写信号,输出,低电平有效,三态。当WR=0时,表示CPU 正在执行存储器 或I/ O 写操作。在写周期中,WR 在T2、T3、TW 期间都有效。在DMA 方式时,WR 被置为 浮空。 (7)HOLD:总线保持请求信号,输入,高电平有效。它是系统中其他处理器部件(如 DMA———直接存储器存取控制器)用于向CPU 发出要求占用总线的一个请求信号。当它 为高电平时,表示其他处理器部件申请总线“保持”(即“持有”或“占有”) , 若CPU 允许让出 总线,则在当前总线周期的T4 状态从HLDA 引脚发出应答信号,并暂停正常操作而放弃对 总线的控制权。于是,其他处理器部件便获得对总线的控制权,以便完成所需要的操作(如 DMA 传送)。 (8)HLDA:总线保持响应信号,输出,高电平有效。当HLDA 为有效电平时,表示 CPU 对其他处理部件的总线“保持”请求作出响应并正处于响应的状态,与此同时,所有带 三态门的CPU 引脚都置为浮空,从而让出总线。当其他处理器部件完成操作(如DMA 传 送)时,“保持”申请结束,CPU 便转向去执行下一个总线周期的操作。 25 新编16/32 位微型计算机原理及应用(第 6 版 ) 3.2 最大方式 2. 8086 与8088 也都可以按最大方式来配置系统。当MN/MX 线接地时,则系统工作于 最大方式。图3.最大方式系统 8所示为8086 最大方式的典型系统结构。从图中可以看到, 与最小方式系统的主要区别是:前者是一个多处理系统,必须外加有8288 总线控制器,通 过它对CPU 发出的状态信息..、..、..0 进行不同的编码组合,就可以产生在最大方式系统 SS1S 中存储器和I/O端口以及锁存器(2) 8282与总线收发器8286 所需要的多种控制信号。同时, 在最大方式系统中,由于一般包含两个或多个处理器,这样就要解决主处理器和协处理器之 间的通信以及对总线的争用共享问题。为此,在最大方式系统中配置了8288 总线控制器, 它使总线的控制功能更加完善。 图3. 8 8086 最大方式的典型系统结构示意图 .. 通过比较两种工作方式可以知道,在最小方式系统中,控制信号M/IO(或M/IO )、 ALE 、R和DEN 是直接从CPU 的第24~ WR 、INTA 、DT/..29 脚送出的;而在最大方式系统 中,则由状态信号..、..、..0 隐含了上面这些信息,使用8288 后,系统就可以从..、..、..0 状 SSSS2S1S态信息的组合中得到(2) 与这(1) 些控制信号功能相同的信息。..、..、..0 和系统在当前总线周期 S2S1S 中具体的操作过程之间的对应关系如表3. 4所示。 4 ...... 表3.S2、S1、S0 的代码组合和对应的操作 ..S2 ..S1 ..S0 8288 产生的控制信号操作状态 0 0 0 0 0 1 INTA IORC 发中断响应信号 读I/O端口 第 3 章8086/8088 微处理器及其系统 35 续表 ..S2 ..S1 ..S0 8288 产生的控制信号操作状态 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 IOWC 、AIOWC 无 MRDC MRDC MWTC 、AMWC 无 写I/O端口 暂停 取指令 读内存 写内存 无源状态(CPU 无作用) 在表3.前7种代码组合都对应了某一个总线操作过程, 它们 4中, 通常称为有源状态, 处于前一个总线周期的T4 状态或本总线周期的T1T2 状态中,S2S1S0 至少有一个信号 、..、..、.. 为低电平。在总线周期的T3、TW 状态并且READY 信号为高电平时,..、..、..0 都为高电 S2S1S 平,此时,前一个总线操作过程就要结束,后一个新的总线周期尚未开始,通常称为无源状 ..2..1.. 态。而在总线周期的最后一个状态即T4 状态,S、S、S0 中任何一个或几个信号的改变,都 意味着下一个新总线周期的开始。 此外,还有几个在最大方式下使用的专用引脚,其含义简要解释如下所示。 (1)QS1、QS0:指令队列状态信号,输出。这两个信号的组合编码反映了CPU 内部当 前的指令队列状态,以便外部逻辑监视内部指令队列的执行过程。QS1、QS0 编码及其对应 的含义如表3. 5所示。 表3.、 0 编码及其对应的含义 5 QS1 QS QS1QS0含义 0 0 未从指令队列中取指令 0 1 从指令队列中取走第1个字节指令代码 1 0 指令队列已取空 1 1 从指令队列中取走后续字节指令代码 (2)LOCK:总线封锁信号,输出,低电平有效,三态。当LOCK 输出低电平时,表示 CPU 独占对总线的主控权,并封锁系统中的其他总线主部件占用总线,这样,可以避免系统 中多个处理主部件同时使用共享资源(如同时要求访问“内存”资源)而引起的冲突。 LOCK 信号由指令前缀LOCK 产生,其有效时间是从CPU 执行LOCK 指令前缀开始 直到下一条指令结束。在两个中断响应INTA 负脉冲期间也有效。在DMA 时,LOCK 端被 置为浮空。 (3)RQ/GT1、RQ/GT0:总线请求信号输入/总线请求允许信号,双向,输出,低电平有 效。在多处理系统中,当8086/8088CPU 以外的两个协处理器(如8087 或8089)需要占用 总线时,就会用该信号线输出低电平表示要求占用总线;当CPU 检测到有请求信号且总线 处于允许状态时,则CPU 的RQ/GT 线输出低电平作为允许信号,再经协处理器检测出此允 许信号后,便对总线进行占用。协处理器使用总线时,其输出的RQ/GT 为高电平;待使用完 毕,协处理器将RQ/GT 线由高电平变为低电平(释放); 当CPU 检测到该释放信号后,又恢 复对总线的主控权。RQ/GT1 和RQ/GT0 都是双向的,请求信号和允许信号在同一引线上 传输,但方向相反。若总线信号同时出现在这两个引脚上时,RQ/GT0 的优先级高于 新编16/32 位微型计算机原理及应用(第 6 版 ) RQ/GT1。 在8288 芯片上,还有几条控制信号线,如MRDC(MemoryReadCommand)、MWTC INTA, yWrtommad)、IORC(/ORaommad)、IOWC(/OWrtd)与 (MemorieCnIedCnIieComman 它们分别是存储器与I/O的读/写命令以及中断响应信号。另外,还有AMWC 与 AIOWC 两个输出信号,它们分别表示提前的写内存命令与提前的写I/O命令,其功能分别 和MWTC 与IOWC 一样,只是它们由8288 提前一个时钟周期发出信号,这样,一些较慢的存 储器和外设将得到一个额外的时钟周期去执行写入操作。在使用8288 时,连接在总线上的 装置一般都用MWTC 和IOWC,或者用AMWC 和AIOWC,但不会同时使用这4种信号。另 外,所有三态输出类型的控制线都可以被禁止,从而使它们均可以与系统总线断开。 3 8086/8088 的存储器 3. 3.1 存储器组织 3. 8086/8088 有20 条地址线,可寻址1MB 的存储空间。存储器仍按字节组织,每个字节 只有唯一的一个地址。若存放的信息是8位的字节,则将按顺序存放;若存放的数为1个 字,则将字的低位字节放在低地址中,高位字节放在 高地址中;当存放的是双字形式(这种数一般作为指 针), 其低位字是被寻址地址的偏移量;高位字是被 寻址地址所在的段地址。指令和数据(包括字节或 字)在存储器中的存放位置如图3. 9所示。对存放 的字,其低位字节可以在奇数地址中开始存放,也可 以在偶数地址中开始存放;前者称为非规则存放,这 样存放的字称为非规则字;后者称为规则存放,这样 存放的字称为规则字。对规则字的存取可在一个总 线周期完成,非规则字的存取则需两个总线周期。 这就是说,读或写一个以偶数为起始地址的字的指 令,只需访问一次存储器;而对于一个以奇数为起始 地址的字的指令,就必须两次访问存储器中的两个 偶数地址的字,忽略每个字中所不需要的那半个字, 并对所需的两个半字进行字节调整。各种字节和字 的读操作的例子如图3. 10 所示。 在8086/8088 程序中,指令仅要求指出对某个字节或字进行访问,而对存储器访问的方 式不必说明。无论执行哪种访问,都是由处理器自动识别的。 8086 的1MB 存储空间实际上分为两个512KB 的存储体,又称存储库,分别称为高位 库和低位库,低位库与数据总线D7~D0 相连,该库中每个地址为偶数地址;高位库与数据 总线D15~D8 相连,该库中每个地址为奇数地址。地址总线A19~A1 可同时对高、低位库 的存储单元寻址,A0 或BHE 则用于库的选择,分别接到库选择端SEL 上, 11 所示。 如图3. 第 3 章8086/8088 微处理器及其系统 图3.9指令和数据在存储器中的存放位置 图3.从8086 存储器的偶数和奇数地址读字节和字 10 当A0=0,选择偶数地址的低位库;当BHE=0 时,选择奇数地址的高位库。利用A0 或 BHE 这两个控制信号可以实现对两个库进行读/写(即16 位数据)操作,也可单独对其中的 一个库进行读/写操作(即8位数据), 6所示。 如表3. 图3.低位库的连接 11 8086 存储器高、 表3.低位库的选择 6 8086 存储器高、 BHE A0 读/写的字节BHE A0 读/写的字节 0 0 0 1 同时读/写高、低两个字节 只读/写奇数地址的高位字节 1 1 0 1 只读/写偶数地址的低位字节 不传送 在8088 系统中,可直接寻址的存储空间同样也为1MB,但其存储器的结构与8086 有 所不同,它的1MB 存储空间同属一个单一的存储体,即存储体为1MB×8 位。它与总线之 间的连接方式很简单,其20 根地址线A19~A0 与8根数据线分别同8088CPU 的对应地址 线与数据线相连。8088CPU 每访问1次存储器只读/写1字节信息,因此,在8088 系统的 新编16/32 位微型计算机原理及应用(第 6 版 ) 图3.12实际存储器中段的位置 存储器中不存在对准存放的概念,任何数据字都需要两次访问存储器才能完成读/写操作, 故在8088 系统中,程序运行速度比在8086 系统中慢。 3.2 存储器的分段 3. 8086/8088CPU 的指令指针(IP)和堆栈指针(SP)都是16 位,故只能直接寻址64KB 的 地址空间。而8086/8088 有20 根地址线,它允许寻址1MB 的存储空间。如前所述,为了能 寻址1MB 的存储空间,引入了分段的概念。 在8086/8088 系统中,1MB 存储空间可被分为若干逻辑段,其实际存储器中段的位置 如图3. 12 所示。 由图3.12 可知,每一段的大小,可能从1字 节开始任意递增,如100 字节、1000 字节等,直 至最多可包含64KB 长的连续存储单元;每个 段的20 位起始地址(又称段基址), 是一个能被 16 整除的数(即最后4位为0), 它可以通过用 软件在段寄存器中装入16 位段地址来设置。 注意:段地址是20 位段基址的前16 位。 从图3. 12 中还可以看到内存中各个段所 处位置之间的相互关系,即段和段之间可以是连续的、断开的、部分重叠的或完全重叠的。 一个程序所用的具体存储空间可以是一个逻辑段,也可以是多个逻辑段。 由于段基址是由存放于段寄存器,即CS 、DS 、SS 和ES 中的16 位段地址左移4位得来 的,因此,程序可以从4个段寄存器给出的逻辑段中存取代码和数据。若要对别的段而不是 当前可寻址的段中存取信息,则程序必须首先改变对应的段寄存器中段地址的内容,并将其 设置成所要存取的段地址信息。 最后需要强调的是,段区的分配工作是由操作系统完成的;但是,系统允许程序员在必 要时指定所需占用的内存区。 3.3 实际地址和逻辑地址 3. 实际地址是指CPU 对存储器进行访问时实际寻址所使用的地址,对8086/8088 来说,它 是用20 位二进制数或5位十六进制数表示的地址。通常,实际地址也称为物理地址。 逻辑地址是指在程序和指令中表示的一种地址,它包括两部分:段地址和偏移地址。 对8086/8088 来说,前者是由16 位段寄存器直接给出的16 位地址;后者则是由指令寻址时 的寄存器组合与位移量之和,它最终所给出的是一个16 位的偏移量,表示所寻址的地址单 元距离段起始地址之间的偏移字节的多少,故称为偏移地址,简称偏移量或偏移。段地址和 偏移地址都用无符号的16 位二进制数或4位十六进制数表示。 对于8086/8088CPU 来说,由于其寄存器都是16 位的体系结构,因此,程序中的指令 不能直接使用20 位的实际地址,而只能使用16 位的逻辑地址。由逻辑地址计算实际地址 的方法如图3. 2所示。 第 3 章8086/8088 微处理器及其系统 注意:一个实际地址可对应多个逻辑地址,如图3. 13 所示。图中的实际地址11245H 可以从两个部分重叠的段中得到:一个段的段地址为1123H,偏移地址为15H,其实际地址 为(11230H+15H)=11245H;另一个段的段地址为1124H,而偏移地址为05H,其实际地 址仍为(11240H+05H)=11245H 。由此可见,尽管两个段采用了不同的逻辑地址,但它们 仍可获得同一个实际地址。段地址来源于4个段寄存器,偏移地址则来源于IP 、SP 、BP 、SI 和DI 。寻址时应该使用哪个寄存器或寄存器的组合,BIU 将根据执行操作的种类和要取得 的数据类型来确定,如表3. 7所示为逻辑地址源。 图3.一个实际地址可对应多个逻辑地址 13 表3.逻辑地址源 7 存储器操作涉及的类型正常使用的段地址可被使用的段地址偏移地址 取指令 堆栈操作 变量(下面情况除外) 源数据串 目标数据串 作为堆栈基址寄存器使用的BP CS SS DS DS ES SS 无 无 CS,ES,SS CS,ES,SS 无 CS,DS,ES IP SP 有效地址 SI DI 有效地址 注意:实际上,这些寻址操作都是由操作系统按默认的规则由CPU 在执行指令时自动 完成的。 3.4 堆栈 3. 8086/8088 系统中的堆栈是用段定义语句在存储器中定义的一个堆栈段,与其他逻辑 段一样,它可在1MB 的存储空间中浮动。一个系统具有的堆栈数目不受限制,一个栈的深 度最大为64KB 。 新编16/32 位微型计算机原理及应用(第 6 版 ) 堆栈通过堆栈段寄存器(SS)和堆栈指针(SP)来寻址。SS 中记录的是其16 位的段地 址,它将确定堆栈段的段基址,而SP 的16 位偏移地址将指定当前栈顶,即指出从堆栈段的 段基址到栈顶的偏移量;栈顶是堆栈操作的唯一出口,它是堆栈地址较小的一端。 若已知当前SS=1050H,SP=0008H,AX=1234H,则8086 系统中堆栈的入栈和出栈 操作如图3.堆栈操作均以字为单位进行操作。 14 所示。为了加快堆栈操作的速度, 图3.出栈操作 14 8086 系统的堆栈及其入栈、 当执行PUSHAX 指令时,是将AX 中的数据1234H 压入堆栈,该数据所存入的地址 单元将由原栈顶地址10508H 减2后的栈顶地址10506H 给定。当执行POPBX 指令时, 将把当前堆栈中的数据1234H 弹出并送到BX,栈顶地址由10506H 加2变为10508H;再 执行POPAX 时,将把当前堆栈中的数据BBAAH 送到BX,则栈顶地址由10508H 加2变 为1050AH 。 3.5 “段加偏移”寻址机制允许重定位 3. 如上所述,微处理器在寻址时利用了段基地址加偏 8086/8088CPU 引入了分段技术, 移地址的原理,通常将这种寻址机制称为“段加偏移”寻址机制。 “段加偏移”寻址机制允许重定位(或再定位)是一种重要的特性。所谓重定位,是指一 个完整的程序块或数据块可以在存储器所允许的空间内任意浮动并定位到一个新的、可寻 址的区域。在8086 以前的8位微处理器中是没有这种特性的,而从8086 开始引入分段概 念之后,由于段寄存器中的段地址可以由程序来重新设置,因而,在偏移地址不变的情况下, 可以将整个存储器段移动到存储器系统内的任何区域而无需改变任何偏移地址。即“段加 偏移”寻址机制可以实现程序的重定位。由此可以很容易想到,由于“段加偏移”寻址机制允 许程序在存储器内重定位,因此,原来为8086 在实模式下运行所编写的程序,在其后80286 以上的高型号微处理器中,当系统由实模式转换为保护模式时也可以运行。这是因为,在从 实模式转换为保护模式时,程序块本身的结构或指令序列都未改变,它们被完整地保留下 来;而只不过在转换之后,段地址将会由系统重新设置,但偏移地址却没有改变。同样,数据 第 3 章8086/8088 微处理器及其系统 块也被允许重定位,重定位的数据块也可以放在存储器的任何区域,且不需要修改就可以被 程序引用。 由于“段加偏移”寻址机制允许程序和数据不需要进行任何修改,就能使它们重定位,这 使得应用具有一个很大的优点。因为,各种通用计算机系统的存储器结构不同,它们所包含 的存储器区域也各不相同,但在应用中却要求软件和数据能够重定位;而“段加偏移”的寻址 机制恰好具有允许重定位的特性,因此,这就给各种通用计算机系统在运行同一软件和数据 时能够保持兼容性带来极大的方便。 例如,有一条指令位于距存储器中某段首(即段基地址)8字节的位置,其偏移地址就是 8。当整个程序移到新的存储区,这个偏移地址8仍然指向距存储器中新的段首8个字节的 位置。只是这时段寄存器的内容必须重新设置为程序所在的新存储段的起始地址。如果计 算机系统没有重定位的特性,那么当一个程序在移动之前,就必须大范围地重写或更改,或 者要为许多不同配置的计算机系统设计许多的程序文本,这不仅需要花费大量的时间,还可 能会引起程序出错。 4 8086/8088 的指令系统 3. 3.1 指令系统的特点及指令基本格式 4. 8086 与8088 的指令系统完全相同,它们是由8位的8080/8085 指令系统扩展而来的, 同时,它们又能在其后续的80x86 系列的CPU 上正确运行。因此,8086/8088 指令系统是 80x86CPU 共同的基础。其主要特点如下: (1)采用可变长指令,指令格式由1~6字节组成,比较复杂。 (2)寻址方式多样灵活,处理数据的能力比较强,可处理字节或字、带符号或无符号的 二进制数据以及压缩型/非压缩型的十进制数据。 (3)有重复指令和乘除运算指令。扩充了条件转移、移位/循环指令。 (4)有软件中断功能和支持多处理器系统工作的指令。 指令格式是按指令系统的规范与要求精心设计的。了解指令格式有助于深入掌握指令 代码的组成原理。指令的基本组成包括两部分,即操作码与操作数。8086/8088 的指令格 式如图3. 15 所示。 图3. 15 8086/8088 的指令格式 其中,第1、2字节为基本字节,属操作码字段,B1 给出操作码,B2 给出寻址方式;第 3字节B3 至第6字节B6 为操作数字段,将根据不同指令对地址位移量和/或立即数的设置 做相应的安排。指令中的立即数(DATA)位于位移量(DISP)之后,均可为8位或16 位。当 新编16/32 位微型计算机原理及应用(第 6 版 ) 第3 章 8086/8088 微处理器及其系统 为16位时,低位在前,高位在后。若指令中只有8位位移量(DISP8),则CPU 在计算有效 地址(EA)时将自动用符号把它扩展为16位的双字节数,以保证计算不产生错误。若B3、 B4 有位移量,立即数就位于B5、B6;否则,立即数就位于B3、B4。 有关8086/8088指令的详细格式可参见附录A。 3.4.2 寻址方式 CPU 的寻址方式,就是根据指令功能所规定的操作码如何自动寻找相应的操作数的方 式。8086/8088的操作数可位于寄存器、存储器或I/O 端口中。对位于存储器的操作数,可 采用多种不同方式进行寻址。8086/8088不仅包含8080/8085的寻址方式,而且还有许多 扩展。下面对8086/8088的寻址方式进行简要介绍。 1.固定寻址 有些单字节指令其操作是规定CPU 对某个固定的寄存器进行的,如加法的ASCII调 整指令AAA,规定被调整的数总是位于AL中。 该指令用来调整AL中的结果,此结果是把两个ASCII字符当作操作数相加后形成的。 2.立即数寻址 操作数就在指令中,当执行指令时,CPU 直接从指令队列中取得该立即数,而不必执行 总线周期。立即数可以是8位,也可以是16位,并规定只能是整数类型的源操作数。这种 寻址主要用来给寄存器赋初值,指令执行速度快。 【例3.2】 MOV AX,1680H ; 将1680H 送AX,AH 中为16H,AL 中为80H 【例3.3】 MOV AX,'AB' ; 将ASCII 码'AB'在内存中的字内容BA(4241H)送AX 3.寄存器寻址 操作数放在CPU 的寄存器(如AX、BX、CX 和DX 等)中,而寄存器名在指令中指出。 这种寻址的指令长度短,操作数就在CPU 内部进行,不需要使用总线周期,所以,执行速度 转快。对 16位操作数来说,寄存器可以为8个16位通用寄存器。而对8位操作数来说,寄存 器只能为AH、AL、BH、BL、CH、CL、DH、DL。在一条指令中,源操作数或/和目的操作数 都可以采用寄存器寻址方式。 【例3.4】 MOV AX,SS ;将SS 的字内容送AX 【例3.5】 MOV SP,BP ;将BP 的字内容送SP 4.存储器寻址 指令系统中采用的复杂的“寻址方式”主要是针对存储器操作数而言的。CPU 寻找存 61