微机原理与接口技术(基于32位机)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 微处理器及其结构

摘要 微处理器是微型计算机的核心。本章首先介绍16位Intel 8086微处理器的内部结构、寄存器结构、外部引脚及其功能,然后重点讲述32位Intel 80486微处理器的内部结构、寄存器结构、外部引脚及其功能,并对Intel 80486微处理器的工作模式和总线操作时序进行详细讲解。

2.1 Intel 8086 16位微处理器

Intel 8086微处理器是Intel公司于1978年6月推出的16位微处理器,采用高性能的N沟道、耗尽型硅栅工艺(NMOS)制造,封装在标准40引脚的双列直插式(DIP)管壳内,内部包含约29000个晶体管。8086微处理器有16位数据总线和20位地址总线,直接寻址的存储空间为1MB(220),用其中的16位地址总线,可以访问64KB(216)的输入/输出端口。8086微处理器工作时钟频率有3种,8086微处理器为5MHz,8086-1微处理器为8MHz,8086-2微处理器为10MHz。8086微处理器还提供了一套完整的、功能强大的指令系统。

2.1.1 Intel 8086微处理器内部结构

8086微处理器的主要特点:16位微处理器,数据总线16位,地址总线20位,可寻址1MB(220)存储空间,时钟频率为5~10MHz。8086微处理器的内部结构由执行单元(EU,execution unit)和总线接口部件(BIU,bus interface unit)两部分组成,如图2.1所示。

1.总线接口部件(BIU)

BIU负责8086微处理器与存储器和外设之间的信息传送。具体地说,BIU负责从内存的指定区域取出指令,送至指令队列排队。在执行指令时所需要的操作数,也由BIU从内存的指定区域取出,传送给执行部件(EU)去执行。图2.1虚线右侧展示出BIU的组成结构。BIU包含一个地址加法器、一组16位的段寄存器、一个16位的指令指针IP、一个6字节的指令队列缓冲器以及总线控制电路。

(1)地址加法器和段寄存器

由于8086微处理器具有20位地址总线,可以方便地寻址220=1M字节的内存单元。但是在CPU内部只有16位的寄存器,这就无法保存和传送每个存储单元的20位地址信息。为了正确地访问存储器,8086采用了分段结构,将1MB的内存空间划分为若干个逻辑段,在每个逻辑段中使用16位段基址和16位偏移地址进行寻址,段寄存器用来存放各段的段基址。利用BIU的地址加法器计算并形成CPU所要访问的存储单元地址(20位)或I/O端口地址(16位)。有关存储器的分段、段寄存器的使用以及存储器地址的形成将在2.1.4节中予以详细介绍。

图2.1 8086微处理器内部结构

(2)指令队列缓冲器

指令队列缓冲器是6字节的“先进先出”RAM存储器,用来按顺序存放CPU要执行的指令代码,并送到EU中去执行。EU总是从指令队列的输出端取指令,每当指令队列中存满一条指令后,EU就立即开始执行。当指令队列中前两条指令字节被EU取走后,BIU就自动执行总线操作,读出指令并填入指令队列中。当程序发生跳转时,BIU立即清除原来指令队列中的内容并重新开始取指令代码。

(3)总线控制电路

总线控制电路主要负责产生总线控制信号。例如,产生对存储器的读/写控制信号和I/O端口的读/写控制信号等。

2.执行部件(EU)

图2.1虚线左边展示出EU的组成结构。EU负责指令的执行。它从BIU的指令队列中取出指令、分析指令并执行指令,而执行指令过程中所需要的数据以及执行的结果也都由EU向BIU发出请求,再由BIU对存储器或外设进行存取操作来完成。EU主要由算术逻辑单元(ALU)、数据暂存寄存器、标志寄存器(FR)、通用寄存器(AX、BX、CX、DX)、指针寄存器(SP和BP)、变址寄存器(SI和DI)、指令译码器和EU控制电路组成。

(1)算术逻辑单元(ALU)

ALU是一个16位的算术逻辑运算部件,用来对操作数进行算术运算和逻辑运算,也可以按指令的寻址方式计算出CPU要访问的内存单元的16位偏移地址。

(2)数据暂存寄存器

数据暂存寄存器是一个16位的寄存器,它的主要功能是暂时保存数据,并向ALU提供参与运算的操作数。

(3)EU控制电路

EU控制电路接收从BIU指令队列中取出的指令代码,经过分析、译码后形成各种实时控制信号,对各个部件进行实时操作。

各种寄存器的说明见2.1.2节。

2.1.2 Intel 8086微处理器寄存器结构

8086微处理器中包含4个通用寄存器、4个指针和变址寄存器、4个段寄存器和1个标志寄存器。8086微处理器寄存器组结构如图2.2所示。

图2.2 8086微处理器寄存器组

1.通用寄存器(general purpose registers)

通用寄存器组包括4个16位的寄存器AX、BX、CX、DX。它们既可以作为16位寄存器使用,也可以分为两个8位寄存器使用,即高8位寄存器AH、BH、CH、DH和低8位寄存器AL、BL、CL、DL。这些数据寄存器既可以作为算术、逻辑运算的源操作数,向ALU提供参与运算的原始数据,也可以作为目标操作数,保存运算的中间结果或最后结果。在有些指令中,这些寄存器具有特定的用途,例如,AX作为累加器,BX作为基址寄存器,CX作为计数寄存器,DX作为数据寄存器。

2.指针及变址寄存器(pointer and index registers)

指针及变址寄存器包括两个指针寄存器SP(stack pointer)、BP(base pointer)和两个变址寄存器SI(source index)、DI(destination index)。这组寄存器通常用来存放存储器单元的16位偏移地址(即相对于段起始地址的距离,简称偏移地址)。

(1)指针寄存器

在8086 微处理器内存中有一个按照“先进后出”原则进行数据操作的区域,称为堆栈。CPU对堆栈的操作有两种,压入(PUSH)操作和弹出(POP)操作。在进行堆栈操作的过程中,SP用来指示堆栈栈顶的偏移地址,称为堆栈指针;而BP则用来存放位于堆栈段中的一个数据区的“基址”的偏移量,称为基址指针。

(2)变址寄存器

SI、DI称为变址寄存器,它们用来存放当前数据所在存储单元的偏移地址。在串操作指令中,SI用来存放源操作数地址的偏移量,称为源变址寄存器;DI用来存放目标操作数地址的偏移量,称为目的变址寄存器。

3.段寄存器(segment registers)

在8086微处理器中有4个16位的段寄存器:CS(code segment)、DS(data segment)、SS(stack segment)和ES(extra segment),这些寄存器指明了一个特定的现行段,用来存放各段的段基址。当用户用指令设定了它们的初值后,实际上已经确定了一个64K的存储区段。其中,代码段寄存器(CS)用来存放当前使用的代码段的段基址,用户编制的程序必须存放在代码段中,CPU将会依次从代码段取出指令代码并执行;数据段寄存器(DS)用来存放当前使用的数据段的段基址,程序运行所需要的原始数据以及运算的结果应存放在数据段中;附加段寄存器(ES)用来存放当前使用的附加段的段基址,它通常也用来存放数据,在执行数据串操作指令时,用来存放目标数据串(此时DS用来存放源数据串);堆栈段寄存器(SS)用来存放当前使用的堆栈段的段基址,所有堆栈操作的数据均保存在这个段中。

4.指令指针(instruction pointer)

指令指针IP为16位寄存器,IP的内容总是指向BIU将要取的下一条指令代码的16位偏移地址。当取出1字节指令代码后,IP自动加1并指向下一条指令代码的偏移地址。它的内容是由BIU来修改的,用户不能通过指令预置或修改IP的内容,但有些指令的执行可以修改它的内容,也可以及将其内容压入堆栈或由堆栈中弹出。

5.标志寄存器(flag register)

8086微处理器中有一个16位的标志寄存器(FR),但只使用了9位。其中6位为状态标志位,用来反映算术运算或逻辑运算结果的状态;3位为控制位,用来控制CPU的操作。8086 CPU标志寄存器各位的定义如图2.3所示。

图2.3 8086 CPU标志寄存器

(1)状态标志位

CF(carry flag):进位标志。表示本次加法或减法运算中最高位(D7或D15)产生进位或借位的情况。CF=1表示有进位,CF=0表示无进位(减法运算时表示借位情况)。

PF(parity flag):奇偶校验标志。表示本次运算结果中包含1的个数。PF=1表示有偶数个1,PF=0表示有奇数个1。

AF(auxiliary carry flag):辅助进位标志。表示加法或减法运算结果中D3位向D4位产生进位或借位的情况。AF=1表示有进位,PF=0表示无进位(减法时表示借位情况)。

ZF(zero flag):零标志。表示当前的运算结果是否为0。ZF=1表示运算结果为0,ZF=0表示运算结果不为0。

SF(sign flag):符号标志。表示运算结果的正、负情况。SF=1表示运算结果为负,SF=0表示运算结果为正。

OF(overflow flag):溢出标志。表示运算过程中产生溢出的情况。OF=1表示当前正在进行的补码运算有溢出,OF=0表示无溢出。

(2)控制标志位

DF(direction flag):方向标志。用来设定和控制字符串操作指令的步进方向。DF=1时,串操作过程中的地址会自动递减1;DF=0时,地址自动递增1。

IF(interrupt enable flag):中断允许标志。用来控制可屏蔽中断的标志位。IF=1时,开中断,CPU可以接受可屏蔽中断请求;IF=0时,关中断,CPU不能接受可屏蔽中断请求。

TF(trap flag):单步标志。用来控制CPU进入单步方式。TF=1时,CPU处于单步工作方式,每执行完一条指令就自动产生一次内部中断;TF=0时,CPU不能以单步方式工作。CPU的单步工作方式为程序调试提供了一种重要的方法。

2.1.3 Intel 8086微处理器引脚信号及功能

8086微处理器是40引脚双列直插式芯片,微处理器通过这些引脚可以和存储器、I/O接口、外部控制管理部件以及其他微处理器相互交换信息。8086微处理器的引脚信号如图2.4所示。

图2.4 8086微处理器的引脚信号

在学习8086微处理器的引脚信号前,必须弄清微处理器最小模式和最大模式的概念。所谓最小模式,是指在系统中只有一个8086微处理器,所有的总线控制信号都直接由8086微处理器产生,因此,系统中的总线控制电路被减到最少。最大模式是相对最小模式而言的。在最大模式下,系统中总是包含两个或多个微处理器,其中一个主处理器就是8086,其他的处理器称为协处理器,它们是协助主处理器工作的,例如数值运算协处理器8087,输入/输出协处理器8089。8086微处理器工作在最大模式还是最小模式下,完全由硬件决定。当CPU处于不同工作模式时,其部分引脚的功能是不同的。

1.两种模式下功能相同的引脚

(1)AD15~AD0(address data):地址/数据总线,双向,三态。

这是一组采用分时方式传送地址或数据的复用引脚。根据不同时钟周期的要求,决定当前是传送要访问的存储单元或I/O接口的低16位地址,还是传送16位数据,或是处于高阻状态。

(2)A19/S6~A16/S3(address/status):地址/状态信号,输出,三态。

这是采用分时的方法传送地址或状态的复用引脚。其中,A19~A16为20位地址总线的高4位地址;S6~S3是状态信号,S6表示CPU与总线连接的情况,S5指示当前中断允许标志IF的状态,S4、S3的代码组合用来指示当前正在使用的段寄存器,它们对应段寄存器的情况见表2.1。

表2.1 S4、S3的代码组合及其对应段寄存器情况表

(3)(bus high enable/statue):允许总线高8位数据传送/状态信号,输出,三态。

为总线高8位数据允许信号,当低电平有效时,表明在高8位数据总线D15~D8上传送1字节的数据。S7为设备的状态信号。

(4)(read):读信号,输出,三态,低电平有效。

信号低电平有效时,表示CPU正在进行读存储器或读I/O端口的操作。

(5)READY(ready):准备就绪信号,输入,高电平有效。

READY信号用来实现CPU与存储器或I/O端口之间的时序匹配。当READY信号高电平有效时,表示CPU要访问的存储器或I/O端口已经做好了输入/输出数据的准备工作,CPU可以进行读/写操作。当READY信号为低电平时,表示存储器或I/O端口还未准备就绪,CPU需要插入“TW状态”进行等待。

(6)INTR(interrupt request):可屏蔽中断请求信号,输入,高电平有效。

CPU在每条指令执行到最后一个时钟周期时,都要检测INTR引脚信号。当INTR为高电平时,表明有I/O设备向CPU申请中断。若标志寄存器中IF=1,CPU则会响应中断,在当前指令操作结束后,为申请中断的I/O设备服务。

(7)(test):等待测试控制信号,输入,低电平有效。

信号用来支持构成多处理器系统,实现CPU与协处理器之间同步协调的功能,只有当CPU执行WAIT指令时才使用。

(8)NMI(non-maskable interrupt):非屏蔽中断请求信号,输入,高电平有效。

当NMI引脚上有一个上升沿有效的触发信号时,表明CPU内部或I/O设备提出了非屏蔽的中断请求,CPU会在结束当前所执行的指令后,立即响应中断请求。

(9)RESET(reset):复位信号,输入,高电平有效。

RESET信号有效时,CPU立即结束现行操作,处于复位状态,初始化所有的内部寄存器。复位后各内部寄存器的状态见表2.2。当RESET信号由高电平变为低电平时,CPU从FFFF0H地址开始重新启动执行程序。

表2.2 系统复位后8086微处理器内部寄存器状态表

(10)CLK(clock):时钟信号,输入。

CLK为CPU提供基本的定时脉冲信号。8086微处理器一般使用时钟发生器8284A来产生时钟信号,时钟频率为5~8MHz,占空比为1:3。

(11)VCC电源输入引脚。

8086微处理器采用单一+5V电源供电。

(12)GND:接地引脚。

(13)(minimum/maximum):最小/最大模式输入控制信号。

引脚用来设置8086微处理器的工作模式。当MN/MX为高电平(接+5V)时,CPU工作于最小模式;当为低电平(接地)时,CPU工作于最大模式。

2.CPU工作于最小模式时使用的引脚信号

当引脚接高电平时,CPU工作于最小模式。此时,引脚信号24~31的含义及其功能如下。

(1)(memory I/O select):存储器、I/O端口选择控制信号。

信号指明当前CPU是选择访问存储器还是访问I/O端口。当为高电平时,访问存储器,表示当前要进行CPU与存储器之间的数据传送;当为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。

(2)(write):写信号,输出,低电平有效。

信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。

(3)(interrupt acknowledge):可屏蔽中断响应信号,输出,低电平有效。

CPU通过信号对外设提出的可屏蔽中断请求做出响应。当为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。

(4)ALE(address lock enable):地址锁存允许信号,输出,高电平有效。

CPU利用ALE信号可以把AD15~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁在地址锁存器中。

(5)(data transmit or receive):数据发送/接收信号,输出,三态。

信号用来控制数据传送的方向。当为高电平时,CPU发送数据到存储器或I/O端口;当为低电平时,CPU接收来自存储器或I/O端口的数据。

(6)(data enable):数据允许控制信号,输出,三态,低电平有效。

信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。

(7)HOLD(bus hold request):总线保持请求信号,输入,高电平有效。

在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入CPU,请求CPU让出总线控制权。

(8)HLDA(hold acknowledge):总线保持响应信号,输出,高电平有效。

HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。

3.CPU工作于最大模式时使用的引脚信号

当引脚接低电平时,CPU工作于最大模式。此时,引脚信号24~31的含义及其功能如下。

(1)(status signals):总线周期状态信号,输出,低电平有效。

它们表明当前总线周期所进行的操作类型。的代码组合及对应操作见表2.3。

(2)(request grant):总线请求信号输入/总线请求允许输出信号,双向,低电平有效。

该信号用以取代最小模式时的HOLD/HLDA两个信号的功能,是特意为多处理器系统设计的。当系统中某一部件要求获得总线控制权时,通过此信号线向CPU发出总线请求信号,若CPU响应总线请求,则通过同一引脚发回响应信号,允许总线请求,表明CPU已放弃对总线的控制权,将总线控制权交给提出总线请求的部件使用。引脚的优先级高于

2.3 代码组合及对应操作表

(3):(lock)总线封锁信号,输出,低电平有效。

信号有效时,表示此时8086 CPU不允许其他总线部件占用总线。

(4)QS1,QS0(queue status):指令队列状态信号,输出。

QS1和QS0信号的组合可以指示总线接口部件BIU中指令队列的状态,以便其他处理器监视、跟踪指令队列的状态。QS1,QS0的代码组合与队列状态见表2.4。

表2.4 QS1,QS0代码组合与队列状态表

2.1.4 Intel 8086微处理器的存储器组成及输入/输出结构

1.8086微处理器的存储器组成

8086微处理器有20条地址线,可直接寻址1MB的存储空间,每一个存储单元可以存放1字节(8位)二进制信息。为了便于对存储器进行存取操作,每一个存储单元都有一个唯一的地址与之对应,其地址范围用十进制数表示为0~1048575,用十六进制数表示为00000H~FFFFFH,共有1048576个存储单元。将存储器按照地址顺序排列如图2.5所示。

图2.5 8086微处理器存储单元及其地址

在进行数据存取操作时,数据可以是字节、字、双字,甚至是多字,它们分别占用一个存储单元、两个存储单元、四个存储单元和多个存储单元。

2.存储器分段及物理地址的形成

(1)存储器的分段

8086微处理器将1MB存储器划分为若干个区段以后,每个段包含216字节(即64KB),并且每个段的首地址都是一个可以被16整除的数(即段的起始地址的最低4位为0)。在任意时刻,程序能很方便地访问4个分段的内容。这4个分段又被称为4个现行可寻址段,即代码段、数据段、堆栈段和附加段。将这4个现行段的起始地址的最高16位地址值(用十六进制数表示为4位)分别存放在CS、DS、SS和ES段寄存器中,称为现行段的段基址。利用指令可以任意设定段寄存器的内容。段基址一旦确定,对应64KB的存储区段就完全确定下来,程序可以从4个段寄存器给出的逻辑段中存取指令代码和数据。

存储空间的分段方式可以有多种,段与段之间可以部分重叠、完全重叠或者完全分离。存储器分段示例如图2.6所示。

图2.6 8086微处理器存储器分段示例

若已知当前有效的代码段、数据段、附加段和堆栈段的段基址分别为1000H,3501H,7F3BH和EAB0H,那么它们在存储器中的分布情况如图2.7所示。由图可见,1MB的存储器除已经被定义的4个段外,还剩下一些空白(未用)区域,如果要用到这些区域,则必须首先改变相应段寄存器的内容,重新设置4个段寄存器。一旦加以定义,就可以通过段寄存器来访问不同的段。

图2.7 8086微处理器存储器分布情况

(2)存储器中的逻辑地址和物理地址

存储器采用分段结构以后,对存储器的访问可以使用两种地址,即逻辑地址和物理地址。

逻辑地址由段基址(存放在段寄存器中)和偏移地址(由寻址方式提供)两部分构成,它们都是无符号的16位二进制数。逻辑地址是用户进行程序设计时采用的地址。

1MB内存空间中每个存储单元的物理地址都是唯一的,由20位二进制数构成。物理地址是CPU访问内存时使用的地址。当用户通过编写程序将16位逻辑地址送入CPU的总线接口部件BIU时,地址加法器通过地址运算将其变换为20位的物理地址。计算20位物理地址的公式为:

物理地址=段基址×16+偏移地址

式中,段基址×16的操作常常通过将16位段寄存器的内容(二进制形式)左移4位,末位补4个0来实现。8086微处理器存储器物理地址的形成过程如图2.8所示。

【例2.1】 数据段寄存器DS=2100H,试确定该存储区段物理地址的范围。

首先需要确定该数据区段中第一个存储单元和最后一个存储单元的16位偏移地址。因为一个逻辑段的最大容量为64KB,所以第一个存储单元的偏移地址为0,最后一个存储单元的偏移地址为FFFFH。该数据区段由低至高相应存储单元的偏移地址为0000H~FFFFH。

存储区的首地址=DS×16+偏移地址=2100H×16+0000H=21000H

存储区的末地址=DS×16+偏移地址=2100H×16+FFFFH=30FFFH

从例2.1可知,该数据段的物理地址范围是21000H~30FFFH,如图2.9所示。有时也采用“段基址﹕偏移地址”这种形式来表示存储单元的地址。

【例2.2】 ① 当CS=5A00H,偏移地址=2245H时,求物理地址。

     ② 当CS=4C82H,偏移地址=FA25H时,求物理地址。

图2.8 8086微处理器存储器物理地址形成示意图

图2.9 数据段地址范围示意图

根据物理地址的计算公式,可得:

  题①的物理地址=CS×16+偏移地址=5A00H×16+2245H=5C245H

  题②的物理地址=CS×16+偏移地址=4C82H×16+FA25H=5C245H

从例2.2可以看出:在题①和②中给定的段基址和偏移地址各不相同,而计算所得的物理地址却是一样的,均为5C245H。这说明,对于存储器中的任意存储单元来说,物理地址是唯一的,而逻辑地址却有无数组。不同的段基址和相应的偏移地址可以形成同一个物理地址。

(3)按信息特征分段存储与分段寻址

8086微处理器在存储器中存储的信息包括程序指令、数据及计算机运行的状态等。为了便于寻址和操作,这些信息在存储器中分段存储,因而将存储器划分为:程序区、数据区和堆栈区,并通过段寄存器CS、DS、ES和SS进行寻址。

① 对程序区的访问

专门用于存放程序指令代码的存储区域称为程序区。访问程序区时,段基址由代码段寄存器CS指定,IP的内容表示段内的偏移地址。当前所取指令的物理地址为:

物理地址=CS×16+IP

要访问不同的程序区时,只需要修改代码段寄存器CS的内容即可。

② 对数据区的访问

用来存放数据信息的区域称为数据区。这些数据信息包括CPU要处理的原始数据、运算的中间结果和最后结果。访问数据区时,DS的内容用来表示数据段的段基址,而偏移地址由指令的寻址方式所求得的有效地址(EA,effective address)来确定。其物理地址为:

物理地址=DS×16+EA

③ 对堆栈区的访问

堆栈是特殊的存储区域,用来存放由PUSH指令压入的需要进行保护的数据和状态信息。访问堆栈区时,用堆栈段寄存器SS指示堆栈段的段基址,SP的内容表示栈顶的偏移地址。BP的内容表示栈底的偏移地址。堆栈操作时存储单元的物理地址为:

物理地址=SS×16+SP

④ 字符串操作

在存储器中,字符串操作是指对两个数据块进行传送或比较,这就需要指定传送的源数据区和目标数据区。通常用DS作为源数据区的段寄存器保存段基址,源变址寄存器SI的内容表示偏移地址,用ES作为目标数据区的段寄存器保存段基址,目的变址寄存器DI表示偏移地址。地址的计算公式为:

源数据区物理地址=DS×16+SI

目标数据区物理地址=ES×16+DI

3.8086微处理器的输入/输出结构

在8086微机系统中,配置了一定数量的输入/输出设备,而这些设备必须通过输入/输出接口芯片与CPU相连接。每个I/O接口芯片都有一个或几个I/O端口,像存储器一样,每个I/O端口都有一个唯一的端口地址,以供CPU访问。

由于8086用地址总线的低16位A15~A0来表示端口地址,因此8086 CPU可以访问的I/O端口地址共有64K(65536)个,其地址为0000H~FFFFH。这些端口均为8位端口(即通过该端口一次输入/输出一个字节信息)。对端口的寻址有直接寻址方式和间接寻址方式两种。直接寻址适用于地址在00H~FFH范围内的端口寻址。间接寻址适用于地址在0100H~FFFFH范围内的端口寻址(所有端口均可采用间接寻址方式)。