- 微型计算机原理及应用
- 赵全利主编
- 8331字
- 2024-10-29 19:24:43
2.1 8086微处理器
8086是Intel公司推出的最早应用到个人微型计算机(PC)上CPU芯片,随着微处理器技术的飞速发展,在8086基础上,相继推出增强型80x86及奔腾系列等更高档PC,但它们都兼容8086模式。本节主要介绍8086微处理器基本结构、功能、引脚分布、对存储器组织管理及一般工作过程。
2.1.1 8086微处理器的内部结构和功能
8086 CPU是Intel公司推出的第三代16位微处理器,其引入最大时钟频率为10MHz,是40脚双列直插组件(DIP)封装的芯片。8086 CPU有16位数据线、20位地址线总线,最大可寻址空间为1MB(即220B)存储单元,支持64KB个输入/输出(以下简称I/O)端口寻址。在结构设计上,8086微处理器分为功能独立的两个逻辑部件模块,即总线接口部件(Bus Interface Unit,BIU)和执行部件(Execution Unit,EU)。8086微处理器的BIU模块和EU模块的并行操作,使8086 CPU的工作效率和速度显著提高,同时也降低了对存储器存取速度的要求。其内部结构如图2-1所示。
1.总线接口部件BIU
CPU要处理的任何信息必须存放在存储单元或I/O端口中。总线接口部件BIU负责CPU内部与存储器或I/O接口之间的信息传递,为执行部件提供数据信息和控制命令。
总线接口部件由地址加法器、寄存器、地址总线和总线控制逻辑电路组成。其中,寄存器又可分为段寄存器(CS、DS、ES、SS共4个)、指令指针寄存器(IP)和指令队列缓冲器。总线接口部件主要实现以下功能。
1)根据段寄存器和指令指针IP或EU传递过来的16位有效地址,在地址加法器中形成20位物理地址。
2)根据物理地址所确定的存储单元,取出指令或数据(可以保持6B预先取出的指令队列),并顺序送至EU执行。若遇转移类指令,指令队列立即清除,BIU重新开始从内存中取转移目标处的指令代码送往指令队列。
3)负责传送在EU执行指令过程中需要的中间数据和EU运行的结果。
4)总线控制电路是微处理器同外部引脚的接口,它负责执行总线周期,并在每个周期内把相应的信号线同相应芯片的引脚接通,完成微处理器同存储器以及I/O设备之间的信息传递。
图2-1 8086微处理器的内部结构
2.执行部件EU
执行单元由通用寄存器、暂存寄存器、算术逻辑运算单元(ALU)、标志寄存器和EU控制器组成。
执行部件EU负责指令的执行并产生相应的控制信号,主要包括以下功能。
1)通过EU控制系统自动连续地从指令队列中获取指令,并对指令进行译码。
2)根据指令译码所得的微操作码,向算术逻辑部件(ALU)及相关寄存器发出控制信号,完成指令的执行。对数据信息的任何处理都是通过ALU来完成的。
3)有8个16位通用寄存器和一个标志寄存器,主要用于暂存运算数据、结果特征,确定指令和操作数的寻址方式以及控制指令的执行等。根据有关寄存器中的数据以及指令中提供的位移量计算有效地址(即偏移地址),然后送BIU部件产生物理地址。
3.流水线技术
在8086 CPU中,BIU和EU是两个独立部件,它们可以并行工作,即EU在执行当前指令的同时BIU可以取下一指令,为此引入了流水线作业的概念。引入流水线作业后,大大提高了处理器的工作速度和效率。
2.1.2 8086微处理器的寄存器组
寄存器组是CPU的主要组成部分。8086微处理器可以用来编程的有14个16位寄存器。按用途可以将其分为4类,即通用寄存器、指针寄存器、标志寄存器和段寄存器。它们通过不同的操作方式实现暂存CPU运行时所需的临时数据和信息。
由于寄存器组对CPU编程是可见的,故用汇编指令的程序设计在执行程序时可直接控制CPU对其操作,这不仅使CPU运行起来方便、快速,同时也便于理解和掌握CPU的工作原理及程序执行过程。
8086微处理器内部寄存器的结构如图2-2所示。
1.通用寄存器 通用寄存器一共有8个,通常又将其分为3类:数据寄存器、指针寄存器和变址寄存器。
(1)数据寄存器
AX、BX、CX、DX是一组16位通用数据寄存器,通常用于暂存计算过程中的操作数、计算结果或其他信息,具有良好的通用性。每个寄存器也可以拆成两个8位寄存器使用,按字节访问(8位的AH、AL、BH、BL、CH、CL、DH、DL)。作为16位字寄存器使用时,既可以用来存放数据,又可以用来存放地址。作为8位字节寄存器使用时,只能用来存放数据。大多数算术和逻辑运算指令都可以使用这些数据寄存器。
一般情况下,编程时各寄存器的专门用途如下。
AX(Accumulator):累加器,这是运算器中最活跃的寄存器,也是程序设计中最常用的数据寄存器。另外还被指定作为十进制调整、乘除法以及I/O等操作的专用寄存器。
图2-2 8086 CPU寄存器结构
BX(Base):基址寄存器,用于存放数据段内存空间的基地址。
CX(Count):计数寄存器,用于存放循环操作和字符串处理的计数控制数值。
DX(Data):数据寄存器,用于乘除法运算时扩展累加器及I/O操作时提供间接端口地址。该类寄存器既可以用来存放操作数,又可以用来存放操作结果。
(2)指针寄存器和变址寄存器
SP、BP、SI和DI是一组只能按字访问的16位寄存器,主要为访问内存时提供16位偏移地址。其中SI、DI、BP也可以用来暂存运算过程中的操作数。
一般情况下,编程时各寄存器的专门用途如下。
SP(Stack Pointer):堆栈指针,用于确定堆栈在内存中的栈顶的偏移地址(唯一用途)。
BP(Base Pointer):基址指针,用来提供堆栈中某指定单元的偏移地址作为基地址使用。
SI(Source Index):源变址寄存器,串操作时提供DS段中指定单元的偏移地址,也可用来存放变址地址。
DI(Destintion Index):目标变址寄存器,串操作时提供ES段中指定单元的偏移地址,也可存放变址地址。
通用寄存器除了具有上述功能外,还具有一些隐含用法,详细情况见附录B。
2.指令指针寄存器(Instruction Pointer,IP)
IP是一个16位专用寄存器,该寄存器的内容为当前需要执行指令的第一字节在存储器代码段内的地址。当该字节取出后,IP自动加1,即指向下一指令字节。IP的内容又称偏移地址,程序员不能对该指针进行存取操作,要改变该指针的值,可以通过程序中的转移指令、返回指令或中断处理来完成。
3.标志寄存器(Flag Registe,FR)
FR是一个16位的标志寄存器,如图2-3所示。在该标识寄存器中有意义的有9位,其中CF、AF、SF、PF、OF和ZF为状态标志。状态标志表示执行某种(指令)操作后ALU所处的状态,这些状态将会影响后面指令的操作。DF、IF和TF为控制标志,控制标志是通过程序设置的,每个控制标志对某种特定的功能起控制作用。
图2-3 标志寄存器
(1)状态标志位
1)进位标志(Carry Flag,CF)。进位标志位反映指令执行后是否在最高位产生进位或借位,若产生进位或借位,则CF=1,否则CF=0。该标志主要用于多字节的加法或减法运算,各种移位指令和逻辑指令也影响CF的状态。
2)奇偶校验标志(Parity Flag,PF)。奇偶标志位反映运算结果低8位的奇偶性。若低8位所含1的个数为偶数,则PF=1,否则PF=0。该标志可用于检查数据传送过程中是否发生错误。
3)辅助进位标志(Auxiliary Carry Flag,AF)。在8位加减操作中,辅助进位标志位反映指令执行后低4位是否向高4位产生进位或借位,若产生进位或借位,则AF=1,否则,AF=0。该标志用于BCD码加减法运算结果的调整。
4)零标志(Zero Flag,ZF)。零标志位反映运算结果是否为0。若运算结果为0,则ZF=1,否则ZF=0。
5)符号标志(Sign Flag,SF)。符号标志位用于带符号数的运算,若运算结果为负,则SF=1,否则SF=0。SF的取值与运算结果的最高位(符号位)取值一致。
6)溢出标志(Overflow Flag,OF)。溢出标志位用于带符号数的算术运算,当运算结果超出机器所能表示的范围,即字节运算结果超出−128~+127或字运算结果超出−32768~+32767时,就产生溢出,置OF=1,否则OF=0。在实际使用中,为了便于判断OF的状态,可以根据运算结果的最高位进位位与次高位进位位的异或值来判断是否溢出。若异或值为1,则溢出,置OF=1,否则不溢出,置OF=0。
(2)控制标志位
1)方向标志(Direction Flag,DF)。方向标志位用来决定数据串操作时变址寄存器中的内容是自动增量还是自动减量。若DF=0,则变址寄存器自动增量;若DF=1,则变址寄存器自动减量。该标志位可用STD指令置DF=1,CLD指令置DF=0。
2)中断允许标志(Interrupt Enable Flag,IF)。中断允许标志表示系统是否允许响应外部的可屏蔽中断。IF=1,表示允许中断;IF=0时,则禁止中断。该标志位可用STI和CLI指令分别置1和置0。该标志对中断请求以及内部中断不起作用。
3)陷阱标志(Trap Flag,TF)。陷阱标志位用来控制单步操作。若TF=1,则CPU工作于单步执行指令工作方式。CPU每执行一条指令就会自动产生一个内部中断,并转去执行中断服务程序,借以检查每条指令执行的情况。该标志没有对应的指令操作,只能通过堆栈操作改变它的状态。
4.段寄存器 在8086系统中,存储着3类信息,即指令代码、数据和堆栈信息。指令代码信息表示微处理器可以识别并执行的操作;数据信息包括字符和数值,是程序处理的对象;堆栈信息保存着返回地址和中间结果。8086 CPU要求不同类信息必须分别存放在存储器不同的存储段中。
每个存储段的最大存储空间为64KB,而段的起始地址由4个16位的段寄存器决定。
1)代码段寄存器(Code Segment,CS)。代码段寄存器用来存放当前执行程序所在段的起始地址的高16位(亦称代码段地址)。
2)堆栈段寄存器(Stack Segment,SS)。堆栈段寄存器用来存放当前堆栈段起始地址的高16位(亦称堆栈段地址)。
3)数据段寄存器(Data Segment,DS)。数据段寄存器用来存放当前数据段起始地址的高16位(亦称数据段地址)。
4)附加段寄存器(Extra Segment,ES)。附加段寄存器用来存放当前附加段起始地址的高16位(亦称附加段地址),附加段通常也用来存放数据。
2.1.38086微处理器的引脚分布与工作模式
1.引脚分布 Intel 8086微处理器采用40条引脚的双列直插式封装,各引脚分布如图2-4所示
各引脚标号从开有半圆标志的左端开始,按逆时针方向标注。
图中小括号标注的是最大工作模式下相应引脚的功能定义。
微处理器功能强大,片内信号线较多、外部引脚却很有限,为了解决封装要求,提高引脚利用率,对部分引脚采用了分时复用技术(即同一引脚在不同时刻连接不同的内部信号线)。
8086 CPU的引脚信号线按功能可以分为4类:地址总线、数据总线、控制总线和其他(时钟与电源)。地址总线由CPU发出,用来确定CPU要访问的内存单元或I/O端口的地址信号;数据总线用来在CPU与内存或I/O端口之间交换数据信息;控制总线用来在CPU与内存或I/O端口之间传送控制信息。
图2-4 8086微处理器各引脚分布
下面分三部分详细介绍各引脚的具体定义
1)地址/数据总线
1)AD15~AD0(输入/输出,三态)为分时复用地址/数据信号线,在执行存储器读写或I/O操作时,在总线周期的T1状态作为地址总线A15~A0使用。在其他时刻作为双向数据总线D15~D0使用。
2)A19/S6、A18/S5、A17/S4和A16/S3为分时复用地址/状态信号线,在进行存储器读/写操作的T1状态输出高4位地址A19~A16;对I/O操作时4个引脚全为低电平。在其他状态用来输出状态信息,S6始终为低电平;S5为中断允许标志位IF的当前状态;S4、S3表示当前使用的段寄存器,所表示的段寄存器如表2-1所示。
表2-1 S4、S3状态段寄存器
(2)控制总线
控制总线有16根,其中8个引脚有固定意义,另外8个引脚随工作模式的不同而有不同的意义。
引脚功能说明如下:
1)MN/MX(输入,引脚33)——工作模式控制线
接+5V电源为最小工作模式;接地时为最大工作模式
2 输出、三态,引脚32)——读控制信号
低电平有效,有效时表示CPU正在执行读操作。
3)INTR(输入,引脚18)——中断请求信号。
高电平有效,当该引脚为高电平时,并且中断标志位IF为“1”时,CPU在执行完现行指令后,将控制转移到相应的中断服务程序。若中断标志位IF为“0”时,CPU不响应中断请求,继续执行下一条指令。
4)NMI(输入,引脚17)——不可屏蔽的中断请求信号。
上升沿有效,不响应软屏蔽,当一个上升沿到来时,CPU在执行完现行指令后,立即进行中断处理,不受中断允许标志位IF影响。
5)RESET(输入,引脚21)——复位信号。
高电平有效,当有效时,CPU停止正在运行的程序,转而清除指令指针IP、数据段寄存器DS、附加段寄存器ES、堆栈段寄存器SS、标志寄存器FR和指令队列的值,使其值均为“0”,并置代码段寄存器CS为FFFFH。该信号结束后,CPU从地址为CS:IP=FFFFH:0000H开始的存储单元执行指令。
6)READY(输入,引脚22)——输入准备好信号。
高电平有效,CPU在总线周期的T3状态开始检测该信号,当有效时,下一个时钟周期将数据放置到数据总线上或从总线上读走;若无效,CPU自动插入一个或若干个等待状态TW,直到该信号有效进入T4状态,完成数据传输。
7 输入,引脚23)——测试信号
低电平有效,当CPU执行WAIT指令时,每隔5个时钟周期对该引脚采样,若为高电平,CPU继续处于等待状态,直到出现低电平时,CPU才开始执行下一条指令。
8 输出,三态,引脚34)——分时复用信号线
在总线周期T1状态输出BHE信号,BHE低电平有效,有效时使用高8位数据线AD15~AD8;无效时,使用低8位数据线AD7~AD0。S7目前尚未定义。
不同模式下的引脚功能说明如表2-2所示。
表2-2 无固定功能的引脚说明
(续)
(3)其他信号
1) GND-地线。
引脚1、20为接地端,双线接地。
2) Vcc-电源线。
引脚40为电源输入端,电源要求为正电源Vcc (+5V±10%)。
3) CLK-时钟信号输入端。
引脚19为CLK,由8284提供所需的时钟频率,占空比要求为33%(高电平占2/3周期、低电平占1/3周期),这样可以提供最佳的内部时钟。不同型号的CPU使用的时钟频率也不同,8086-1使用的时钟频率为10MHz。
2.工作模式
8086微处理器根据 引脚连接形式不同,可以把工作模式分为两种,即最小工作模式与最大工作模式。
当 引脚接+5V电源时,8086 CPU工作在最小模式。在最小模式卜整个系统只有一个能执行指令的CPU芯片,系统总线始终被该CPU控制,但允许系统中的DMA控制器临时占用总线。该方式适用于小系统情况,图2-5为最小工作模式卜的8086 CPU系统配置图。
图2-5 最小丁作模式下的8086 CPU系统配置图当
引脚接地时,8086 CPU工作在最大模式。在最大模式下系统允许有多个能够执行指令功能的CPU芯片,系统总线属于多个CPU共有,通常需要8087协处理器的协调在最大工作模式下存在总线竞争问题。图2-6为最大工作模式下的8086 CPU系统配置图。
图2-6 最大工作模式下的8086 CPU系统配置图
1.存储器的组织 存储器是由许多连续的存储单元组成的,每个存储单元可根据硬件电路被分配唯一的单元编码,即存储单元地址,由软件通过指令对存储单元进行读/写操作。
8086有20位地址线,最大的寻址空间为1MB(220B=1MB),其地址范围为:00000H~FFFFFH(用5位十六进制数可表示20位二进制地址线)。8086系统将存储空间分为两个512KB的存储体,一个由奇地址构成,一个由偶地址构成,由地址位A0来区分,存储体地址分配及存储数据如图2-7所示。
一般情况下,每个存储单元的长度为一个字节(8个二进制位),亦称为字节单元。8086 CPU的数据线为16位,由于微处理器内部的16位通用寄存器AX、BX、CX和DX可以分拆为两个8位寄存器使用,所以既可以进行8位数据(字节单元)的操作,也可以进行16位数据(字单元)的操作。在进行16位数据操作时,使用存储器的两个字节单元组成字单元,字单元的低8位数据存放在低地址字节单元中,而高八位数据存放在高地址字节单元中,为了提高读写速度,字单元地址必须为偶数。
在图2-7中,字节地址20000H、20001H、20002H、20003H单元的数据分别为43H、12H、56H和78H;字地址20000H单元的内容为1243H。
图2-7 存储体地址分配及存储数据示意图
由于8086有20位地址线,最大的寻址空间为1MB,而CPU内部编址寄存器只有16位,只能寻址64KB,为了实现16位地址对1MB内存空间的寻址,8086引入了分段技术。
所谓分段技术,就是把1MB的存储卒间分成若干个逻辑段,每个逻辑段的起始地址由16位段寄存器的数据决定。每一个逻辑段存储容量不大于216B=64KB,段内每个存储单元的地址是连续的,这样,16位地址可以表示段内的每一个存储单元。
8086微处理器指定的逻辑段为:数据段、代码段、堆栈段和附加段。每个段在存储器中的分布地址既可以完全独立,也可以和其他段相互重叠,可以分别寻址,也可以单独寻址。这样每个存储单元的地址取决于所在段的16位段地址和16位的段内地址(即偏移地址)。
存储器分段结构如图2-8所示。
图2-8 存储器分段结构
2.物理地址和逻辑地址 在8086系统中,每个存储单元被分配唯一的地址编码(20位二进制代码),称为物理地址。物理地址也就是存储单元的实际地址。CPU与存储器交换数据时所使用的地址就是物理地址。
在编写程序时使用的16位地址编码被称为逻辑地址。逻辑地址是在编程的时候使用的一种虚拟地址,使用逻辑地址可以让程序员在编制程序时,不必关心自己的数据存放的物理位置,只需要按照16位地址信息编写就可以了。在程序运行时,微处理器内部的BIU单元将自动完成16位段地址和16位偏移地址向20位物理地址的转换。
8086系统中,逻辑地址由段地址和段内偏移量组成。16位的段地址必须存放在段寄存器中,它决定了一个逻辑段的起始地址,亦可称为段基址,它实际上是20位物理地址的高16位。为了便于管理,每个段的起始地址应能被16整除,也就是说,它的20位地址中低4位应该为0,各个段的“段基址”分别存放在16位段寄存器CS、DS、SS或ES中。偏移地址为段内存储单元与所在段的起始地址之间的偏移量。若存储单元是该段的起始单元,则认为偏移量为0,段内的最大偏移量为216−1=FFFFH。段内偏移地址可分别由寄存器、存储单元的数据以及指令中所提供的位移量及其组合来确定。这样,就可以通过编写程序指出段寄存器内容及段内偏移地址,去访问任一段中的任一存储单元。
图2-9为逻辑地址与物理地址之间的关系。
段内任一单元的地址常用逻辑表达式“段地址:偏移地址”来描述。
例如,逻辑地址0035H:0000H,表示段地址为0035 H,偏移地址0000H。
图2-10为物理地址的形成过程。可以看出,存储单元的20位物理地址是通过将16位的“段地址”左移4位后再加上16位的“偏移地址”形成的。逻辑地址和物理地址的转换关系为:
物理地址=段地址×10H(左移4位)+偏移地址
图2-9 逻辑地址与物理地址
图2-10 物理地址形成过程
例如:在图2-9中,逻辑地址0035:0001,即段地址为0035,偏移量为0001H,则其物理地址为:
分段技术给编程寻址存储单元及存储器管理提供了方便,在实际使用时必须注意段地址与偏移地址的配合关系,见表2-3。
表2-38086约定的段寄存器与偏移地址结合方式
由表2-3可以看出:
1)当进行取指令操作时,8086 CPU会自动选择代码段寄存器CS的值并左移4位后作为段基址,再加上由IP提供的偏移地址形成当前要执行的指令在存储器中的物理地址。
2)当进行堆栈操作或BP作基址寄存器时,8086 CPU会自动选择堆栈段寄存器SS的值并左移4位后作为段基址,再加上由SP或BP提供的偏移地址形成物理地址。
3)当进行操作数存取操作时,8086 CPU会自动选择数据段寄存器DS的值作为段基址,再加上16位偏移地址形成物理地址。16位的偏移地址可以由指令直接提供,也可以由寄存器或者指令中的偏移量等信息组成的寻址方式产生。
2.1.5 8086微处理器的工作过程
在计算机执行程序(指令)前,必须将程序连续地存储在存储单元中。微处理器的工作过程就是在硬件基础上不断执行指令的过程。虽然计算机的程序千变万化,功能不尽相同,但它们在计算机中的执行过程具有相同的规律。
为了方便地描述微处理器的工作过程,下面通过一个简单例子说明指令的执行过程。
设汇编语言程序段如下。
该程序段由3条指令组成,各条指令的功能如下。
第一条指令的功能是把立即数09H送入累加器AL。
第二条指令是把AL中的内容与立即数12H相加,结果为09H+12H=1BH存入累加器。
第三条指令HLT为暂停指令。
微处理器不能直接识别汇编语言指令,必须把汇编指令编译(汇编)成微处理器能识别的机器码,机器码是微处理器能唯一识别的代码。它们的对照关系为:
设3条指令在内存中的起始物理地址为21000H,存放形式如表2-4所示
表2-43条指令在内存中的存放形式
该段程序(指令)执行过程如下。
1)总线接口部件BIU自动取出代码段寄存器CS中的16位段地址2000H,然后取出指令指针寄存器IP中的16位偏移地址1000H(取出后IP内容自动加1为1001H),经地址加法器产生20位地址信息21000H,通过外部20位地址总线输出21000H,经存储器芯片译码后选定相应的存储单元。
2)CPU给出读命令,从选定的21000H存储单元中首先取出指令代码“10110000”,通过外部数据总线传送到总线接口部件的指令队列缓冲器中。这时,执行部件EU可以从指令队列缓冲器中取出指令代码执行指令,总线接口部件可以同时并行地继续从存储器中读取下一单元的指令代码,IP的内容也自动指向下一单元。
3)执行部件从总线接口部件的指令代码队列中按先进先出方式取出指令代码,经EU控制器分析产生一系列相应的控制命令。由于第一字节指令的功能是把该指令第二字节地址1001H单元的内容09H传送给累加器AL,在控制器所发出的控制命令作用下,执行部件从指令队列缓冲器取出数据09H经内部数据总线送入累加器AL。至此,第一条指令执行完毕。
4)执行部件继续从总线接口部件的指令队列中取第二条指令,经EU控制器分析产生一系列相应的控制命令,类似第一条指令的执行过程,完成累加器AL的内容09H加12H的和送给AL。
5)执行第三条指令,其功能为程序暂停执行。
在执行部件执行指令的过程中,指令队列缓冲器中的指令字节在不断出队的同时,总线接口部件可以并行地从存储单元不断地取出指令字节加入指令队列缓冲器中,直至队列满为止,这就是所谓的取指令和执行指令的并行操作,从而大大提高CPU的工作速度和效率。
8086微处理器的工作过程就是在CPU的控制和操作下,不断地取指令、分析指令和执行指令的过程。