第2章8086微处理器及其体系结构本章学习重点:•了解8086CPU的编程结构及引脚功能;•掌握8086的存储器和I/O组织;•掌握8086的操作及时序;•熟悉8086最小方式下的系统结构.本章学习难点:•8086的编程结构及寄存器结构;•8086的操作时序.2.18086的编程结构2.1.18086/8088CPU的内部结构8086:Intel系列的16位微处理器,数据总线16位、20条地址线,可寻址地址范围1MB,指令队列6个字节,8086工作时,只要一个5V电源和一个时钟,时钟频率为5MHz。8086CPU的内部由两个独立的工作部件构成:执行部件EU(ExecutionUnit)总线接口部件BIU(BusInterfaceUnit)。其内部结构框图如下图所示:地址总线20位AHALBHBLCHCLDHDLSPBPDISI通用寄存器暂存器ALU状态EU控制器123456CSDSSSESIP内部寄存器总线控制电路地址加法器8位指令队列缓冲器外总线8086CPU结构图队列总线总线接口单元BIU执行单元EUALU数据总线16位1.执行部件EU作用:(1)从指令队列中取出指令。(2)对指令进行译码,发出相应相应的控制信号。(3)接收由总线接口送来的数据或发送数据至接口。(4)进行算术运算。执行部件EU的组成:(1)算术逻辑单元ALU它是运算器的核心,几乎所有的算术运算,逻辑运算和移位操作都是由ALU完成的。(2)暂存寄存器协助ALU完成运算,暂存参加运算的数据。(3)四个通用寄存器AX、BX、CX、DX四个通用寄存器都是16位或作两个8位来使用(4)专用寄存器SP、BP、DI、DISP------堆栈指针寄存器BP------基址指针寄存器DI-------目的变址寄存器SI-------源变址寄存器(5)执行部件的控制电路从总线接口的指令队列取出指令操作码,通过译码电路分析,发出相应的控制命令,控制ALU数据流向。2.总线接口部件BIU功能:(1)取指令送到指令队列。(2)CPU执行指令时,配合EU从指定的内存或外设中取操作数据,将数据传送到EU中,或把EU的执行结果送到指定的内存单元或外设。总线接口部件的组成:(1)四个段地址寄存器CS-16位代码段寄存器DS-16位数据段寄存器ES-16位附加段寄存器SS-16位堆栈段寄存器(2)16位指令指针寄存器IP(PC)(3)20位的地址加法器(4)6字节的指令队列缓冲器(5)完成与EU通信的内部寄存器说明:(1)指令队列缓冲器:8086的指令队列为6个字节,8088的指令队列为4个字节。使用了队列装置,在EU执行指令的同时,BIU将取下一个字节指令或几个字节的指令依次放入指令队列缓冲器中。CPU执行完一条指令后,可以马上执行下一条指令(流水线技术)。即:BIU与EU的工作是并行的,这一种并行工作方式,改变了以往计算机取指令→译码→执行指令的串行工作方式,大大提高了CPU的工作效率。(2)地址加法器:产生20位地址。CPU内无论是段地址寄存器还是偏移量都是16位的,通过地址加法器产生20位地址。例如:段代码CS=0FE00H,指令指针IP=0400H,则通过地址加法器产生的20位物理地址为0FE000H+0400H=0FE400H。EUBIUCPU内部工作过程简述:①EU准备执行一条指令时,从BIU部件的指令队列前部取出指令的代码,然后去执行指令。在执行指令过程中,如果必须访问存储器或者I/O端口,EU就会请求BIU,进入总线周期,完成访问内存或者I/O端口的操作;如果此时BIU正好处于空闲状态,会立即响应EU的总线请求。如BIU正将某个指令字节取到指令队列中,则BIU将首先完成这个取指令的总线周期,然后再去响应EU发出的访问总线的请求。②当指令队列是空的,EU就处于等待状态,一旦指令队列中有一条指令,EU会立即取出执行。③当8086的指令队列中有两个空字节(8088中有一个空字节),BIU就会自动把指令取到指令队列中。取指的顺序按指令在程序中出现的前后顺序。④当指令队列已满,且EU又没有总线访问请求时,BIU便进入空闲状态。⑤在EU执行转移指令、调用指令和返回指令时,由于待执行指令的顺序发生了变化,则指令队列中已经装入的字节被自动消除,BIU会接着往指令队列装入转向的另一程序段中的指令代码。2.1.28086/8088CPU的寄存器结构8086/8088内部有14个16位的寄存器,寄存器可以分为通用寄存器和专用寄存器两大类,如图2.2所示。1.通用寄存器(8个)8个16位通用寄存器分为两组:数据寄存器(4个)地址指针和变址寄存器(4个)1)数据寄存器8086/8088有4个16位的通用寄存器(AX、BX、CX、DX),可以存放16位的操作数,也可分为8个8位的寄存器(AL、AH;BL、BH;CL、CH;DL、DH)来使用。其中AX称为累加器,BX称为基址寄存器,CX称为计数寄存器,DX称为数据寄存器,这些寄存器在具体使用上有一定的差别。2)指针和变址寄存器包括:堆栈指针SP、基址指针BP、源变址寄存器SI、目的变址寄存器DI,可用来存放数据和地址,但只能按16位进行存取操作。•SP堆栈指针寄存器:入栈(PUSH)和出栈(POP)指令是由SP给出栈顶位置(段内偏移量)。•BP基址指针寄存器:用来存放位于堆栈段中的一个数据区基址的偏移地址。•变址寄存器SI和DI是用来存放当前数据段的偏移地址的。•源操作数地址的偏移量放SI中,SI称为源变址寄存器。•目的操作数地址的偏移量放DI中,DI称为目的变址寄存器。2.段寄存器组8086CPU具有寻址存储器空间1MB的能力,但是8086指令中给出的地址码仅有十六位,为此,8086用一组段寄存器将这1MB存储空间分成若干个逻辑段。8086CPU的BIU中有四个16位的段寄存器,段寄存器是用来存放段起始地址的,8086的指令直接访问这四个段。代码段寄存器CS:用于存放当前代码段的段地址;数据段寄存器DS:用于存放当前数据段的段地址;附加段寄存器ES:用于存放当前附加段的段地址;堆栈段寄存器SS:用于存放当前堆栈段的段地址。在微机系统的内存中通常存放着三类信息:8086/8088汇编语言规定,不同的信息要存放在不同的存储段,这些存贮段的存储器段地址(段基址)要由各自的段存器提供。3.控制寄存器组1)指令指针寄存器(IP16位)。它始终指向CPU下一条要取指令所在存贮器单元的偏移地址(段地址由CS提供)。用户不能更改IP的值,每取一个指令字节,IP自动加1,如果程序需要转移或分支,只要把转移地址放入IP即可。标志寄存器FR仅定义了9位,其中6位用作状态标志,3位用作控制标志。D15OFDFIFTFSFZFAFPFCF进借位标志奇偶标志半进借位标志零标志符号标志单步中断中断允许方向标志1-有进、借位0-无进、借位1-低8位有偶数个10-低8位有奇数个11-低4位向高4位有进、借位0-低4位向高4位无进、借位1-结果为00-结果不为0D0溢出标志2)标志寄存器FR:例1:若CPU执行5439H+476AH加法运算指令:所以指令执行后有:SF=1,ZF=0,PF=1,AF=1,CF=0,OF=1C15=0C14=1C3=1符号位S=1低8位中8个1运算结果不为0有溢出DF—方向标志:当DF=0时,在串操作指令中,进行自动增址操作;当DF=1时,在串操作指令中,进行自动减址操作;IF—中断允许标志:当IF=0时,禁止CPU响应可屏蔽中断;当IF=1时,允许CPU响应可屏蔽中断;TF—单步陷阱标志:当IF=1时,表示CPU进入单步工作方式;当IF=0时,表示CPU正常执行程序。通常用于程序的调试。控制标志位3个,用来控制CPU的操作:2.28086/8088系统存储器的组织和堆栈2.2.18086/8088系统存储器的组织8086/8088是16位的微处理器,在组成存储系统时,总是使偶地址单元的数据通过AD0~AD7(低8位)传送,而奇地址单元的数据通过AD8~AD15(高8位)传送,所有的操作可以是按字节为单位也可以是按字为单位来处理的,但8086/8088系统中的存储器是以8位(一个字节)为单位对数据进行处理的。因此每个字节用一个唯一的地址码表示,这称为存储器的标准结构。8088/8086有20根地址总线,可直接寻址的存储器单元数为:220=1MB,每个字节对应一个唯一的地址,地址范围为0~220-1,用16进制表示:00000~FFFFFH。几个概念:位(bit)是计算机所能表示的最小最基本的数据单位,它指的是取值只能为0或1的一个二进制数值位。位作为单位时记作字节(byte)由8个位二进制位组成,通常用作计算存储容量的单位。字节作为单位时记作B字长字长是微处理器一次可以直接处理的二进制数码的位数,它通常取决于微处理器内部通用寄存器的位数和数据总线的宽度。数据存储格式当存储器存放的数是一个字节时,将按顺序存放在每个存储单元中;当存放的是一个字时,字的低字节存放在低地址中,高字节存放在高地址中,并以低字节的地址作为字地址。若字地址为偶地址,则称为规则字存放;若字地址为奇地址,则称为非规则字存放。06000H规则字06001H06002H03H04H05H06H07HA37F296B504CD335(7FA3H)非规则字规则字(506BH)(D335H)存储器的组成存储器与8086CPU连接时,1MB存储空间分成两个512KB存储器,即:偶地址存储器:(A0=0),其数据线与8086CPU系统的数据线D7~D0相连,A0=0用于片选;奇地址存储器:(A0=1),其数据线与8086CPU系统的数据线D15~D8相连,/BHE(高8位数据总线允许控制)=0用于片选;8086CPU数据总线为16位:对于访问(读或写)字节的指令,需要一个总线周期;对于访问一个偶地址的字的指令,需要一个总线周期;对于访问一个奇地址的字的指令,需要两个总线周期(CPU自动完成)。8088CPU数据总线为8位:无论是字,还是字节,也无论是对规则字,还是非规则字,每一个总线周期只能完成一个字节的数据存取操作。对字数据所组成的连续两个总线周期是由CPU自动完成的。8086存储器的分段结构8086/8088CPU有20条地址线(A19~A0),能寻址外部存贮空间为=1MB。由于CPU内部的地址寄存器BX、IP…都是16位,只能寻址64KB,为了使CPU能寻址到外部存贮器1MB空间中任何一个单元,巧妙地采用了地址分段方法(将1MB空间分成若干个逻辑段),从而将寻址范围扩大到了1MB逻辑段彼此独立,但可紧密相连,也可重叠,在整个1MB存储空间浮动,仅需改变段寄存器内容。一般把存储器划分为:程序区、数据区和堆栈区。这样,就可以在程序区中存储程序的指令代码,在数据区中存储原始数据、中间结果和最后结果,在堆栈区中存储压入堆栈的数据或状态信息。2.2.2存储器的分段和物理地址的形式分段方法:各逻辑段的起始地址——基址,必须能被16整除,即一个段的起始地址(20位物理地址)的低4位二进制码必须是0。把1MB的存贮空间划分成不受任何限制的若干个逻辑段,每段最多64KB。8086CPU中有四段寄存器:CS,DS,SS和ES,这四个段寄存器存放了CPU当前可以寻址的四个段的基址,也即可以从这四个段寄存器规定的逻辑段中存取指令代码和数据。一旦这四个段寄存器的内容被设定,就规定了CPU当前可寻址的段。由于系统中只设有4个段寄存器,任何时候CPU只能识别当前可寻址的4个逻辑段。如果程序量或数据量很大,超过64K字节,那么可定义多个代码段、数据段、附加段和堆栈段,但4个段寄存器中必须是当前正在使用的逻辑段的基地址,需要时可修改这些段寄存器的内容,以扩大程序的规模。在一个段内的每个存贮单元,可以用相对于本段的起始地址(基址)的偏移量来表示,这个偏移量称为段内偏移地址,也称为有效地址(EA)。段内偏移地址也用16位二进制编码表示.所以,在一个段内有=64K个偏移地址(即一个段最大为64KB)。06002000A