1、第5章输入/输出技术5.1 概述5.2 程序控制输入/输出习题第5章输入/输出技术5.1.1 外设接口的编址方式外设接口的编址方式在微型计算机系统中,主要采用两种不同的外设地址的编址方式。1外设地址与内存地址统一编址外设地址与内存地址统一编址这种编址方式又称为存储器映射编址方式。在这种编址方式中,将外设接口地址和内部存储器地址统一安排在内存的地址空间中,即把内存地址分配给外设,由外设来占用这些地址。用于外设的内存地址,存储器不能再使用。这样一来,计算机系统的内存空间一部分留做外设地址来使用,而剩下的内存空间可为内部存储器所使用。5.1 概概 述述第5章输入/输出技术外设与内存统一编址的方法占用
2、了部分内存地址,将外设看做是一些内存单元。因此,原则上说,用于内存的指令都可以用于外设,这给使用者提供了极大的方便。但由于外设占用的内存地址,内存不能再用,就相对地减少了内存的可用范围。而且,从指令上不易区分是寻址内存的指令还是用于输入/输出的指令。这种编址方式在68系列和65系列的微型机中得到了广泛的应用。第5章输入/输出技术M2外设与内存独立编址外设与内存独立编址在这种编址方式中,内存地址空间和外设地址空间是相互独立的。例如,在8086(8088)CPU中,内存地址是连续的1MB,即00000HFFFFFH,而外设的最大地址范围为000HFFFFH。它们相互独立,互不影响。这是由于CPU在
3、寻址内存和外设时,使用了不同的控制信号来加以区分。8086CPU的M/信号为1时,表示地址总线上有一个内存地址;当它为0时,则表示地址总线上的地址是一个有效的外设地址。而8088CPU为IO/,请读者注意。M2外设与内存独立编址外设与内存独立编址在这种编址方式中,内存地址空间和外设地址空间是相互独立的。例如,在8086(8088)CPU中,内存地址是连续的1MB,即00000HFFFFFH,而外设的最大地址范围为000HFFFFH。它们相互独立,互不影响。这是由于CPU在寻址内存和外设时,使用了不同的控制信号来加以区分。8086CPU的M/信号为1时,表示地址总线上有一个内存地址;当它为0时,
4、则表示地址总线上的地址是一个有效的外设地址。而8088CPU为IO/,请读者注意。IO第5章输入/输出技术内存与外设独立编址,各有自己的寻址空间。用于内存和用于外设的指令是不一样的,很容易辨认。但用于外设的指令功能比较弱,一些操作必须由外设首先输入到CPU的寄存(或累加)器后才能进行。这种编址方式在Z80系列及Intel80系列微机中得到广泛应用。除了上述两种最常用的编址方式外,还有其他一些方式。例如,在MCS-51单片机中,存放程序的内存地址是独立的64K,而存放数据的内存与接口统一编址占另外独立的64K。只要理解了前面所描述的两种方法,再去理解其他的方法将是十分容易的。第5章输入/输出技术
5、5.1.2 外设接口的基本模型外设接口的基本模型 外设经接口与微型机的连接框图如图5.1所示。第5章输入/输出技术图5.1 外设经接口与微型机的连接框图第5章输入/输出技术由图5.1可以看到,接口是实现CPU与外设间数据交换的通道,或者称为两者间的介面。接口的一边接在系统总线上;接口的另一边与外设相连接。接口与外设间通常有三种信息:(1)数据信息。在微机系统中通常有三种数据信息,即数字量、开关量和模拟量。数字量是以二进制编码表示信息的。开关量是用两个状态表示的信息,用一位二进制编码即可表示。模拟量是在时间上和幅度上均连续的信息,它必须经过转换,变为二进制编码才能被CPU识别和处理。这些数据信息
6、在本书后面的章节中会逐一加以介绍。第5章输入/输出技术(2)状态信息。状态信息用来表示外设所处的状态。例如利用BUSY(忙)信号、READY(就绪)信号来表示外设是否正在忙或外设已经就绪。(3)控制信息。通常这类信息是CPU经接口发出的,用于控制外设工作的信号。第5章输入/输出技术数据信息、控制信息和状态信息通常利用系统总线在CPU与接口之间进行传送。后面将会看到,在微型计算机中是如何利用这些信号实现CPU与外设间进行数据交换的。通常,一个接口可能有多个寄存器分别存放数据信息、控制信息和状态信息。CPU能够对这些寄存器读或写。人们还将这些能被CPU读或写的寄存器称为“端口”。可见,一个接口可能
7、包含几个端口,也可能只有一个端口。第5章输入/输出技术在微型计算机中,有四种基本的输入/输出方法,它们是:无条件传送方式 查询传送方式 中断方式 DMA(直接存储器存取)方式通常把前两种方式归类为程序控制输入/输出。它们都是利用CPU执行程序,实现微机与外设的数据传送。5.2 程序控制输入程序控制输入/输出输出第5章输入/输出技术5.2.1 无条件传送方式无条件传送方式在微机系统中,有一些简单的外设,当它工作时,随时都准备好接收CPU的输出数据或它的数据随时都是准备好的,CPU什么时候读它的数据均可以正确地读到。也就是说,外设无条件准备好向CPU提供数据或接收CPU送来的数据。所以CPU可以无
8、条件地向这样的外设传送数据。在CPU与这样的外设交换数据的过程中,数据交换与指令的执行是同步的,故有人也称其为同步传送。第5章输入/输出技术在与这类外设进行数据交换时,可以认为只有数据的输入和输出而不再需要图5.1所示的控制信息和状态信息。正如在本书的后面将要看到的,在无条件传送方式下,经接口输出的数据常作为控制信号使用,而由接口输入的数据又常作为状态信号来使用。常采用无条件传送的简单外设有许多种。例如,发光二极管、数码管、开关、继电器、步进电机等。第5章输入/输出技术1输入接口输入接口作为无条件传送方式数据输入的例子,先来看一下图5.2所示的电路。在图中,把开关S看做是一个简单的外设。S的状
9、态是确定的,要么闭合,要么打开。当计算机通过外设接口读S的状态时,一定会读到指令执行时刻S的状态。第5章输入/输出技术图5.2 开关S的输入接口第5章输入/输出技术在图5.2中,利用三态门构成输入接口,它可以是第2章中所讲的74LS244。图5.2中输入接口的地址为FFF7H。当CPU读接口地址FFF7H时,加在三态门低电平有效的控制端上的或门的输出为低电平。该电平使三态门导通,则开关S的状态就通过数据总线D0读到CPU。判断读入数据D0的状态,即可知S的状态。当D0=0时,S闭合;D0=1时,S打开。例如,可以利用S的状态来控制CPU执行不同的程序:当S闭合时,执行PROG1;S打开时执行P
10、ROG2。第5章输入/输出技术可用下述指令来实现:MOV DX,0FFF7HIN AL,DXTEST AL,01HJZ PROG1JMP PROG2结合第2章中所描述的时序,不难看出,在执行上面程序的过程中,只有在执行IN AL,DX指令时,才会使图5.2中的三态门导通,即使在从内存中读IN AL,DX指令操作码(ECH)时,也不会使三态门导通。第5章输入/输出技术2输出接口输出接口无条件传送方式实现数据输出的例子如图5.3所示。在图5.3中,发光二极管可以认为是一种最简单的外设,它总是处于准备好的状态,在输出接口的控制下发光或熄灭。图中锁存器接口使用74LS273,请特别,注意273是利用C
11、P端的上升沿来锁存数据的。根据图5.3中译码器(或门)的输出可以断定,该锁存器输出接口的地址为0000H。第5章输入/输出技术图5.3 锁存器输出接口第5章输入/输出技术因为只用锁存器的Q0和Q7输出来控制发光二极管的亮灭,利用下面的程序可使两发光二极管亮灭各1s进行闪烁:DIPDP:MOV DX,0000H GOON:MOV AL,81H OUT DX,AL ;点亮发光二极管 CALL TIS ;延时 1 s MOV AL,00H OUT DX,AL ;熄灭发光二极管 CALL TIS ;延时 1 s JMP GOON 第5章输入/输出技术当执行OUT指令时,译码器会在CP端产生负脉冲,利用
12、该负脉冲的上升沿,将D0D7上的数据锁存于273的Q边。可以认为CP端上的负脉冲具有与脉冲相同的波形。参照第1章中的时序,必须用的后沿(上升沿)将数据总线上已稳定的数据写到接口上,而前沿(下降沿)所对应的数据还不稳定或还没有加到锁存器的输入端上,因此,构成锁存器地址译码器时必须注意到时序的问题,使设计出来的译码器是安全可靠的。IOWIOWIOW第5章输入/输出技术从上述可见,开关S或发光二极管总是准备好的。当读接口时,总可以读到那一时刻S的状态。当写锁存器时,二极管总是准备好随时接收发来的数据,点亮或熄灭它。以上是两个最简单的例子,用以说明无条件传送的过程。对于其他类似的外设,如继电器、电机等
13、,需要根据它们的工作特性来决定是否可以采用无条件传送这种输入/输出手段。第5章输入/输出技术5.2.2 查询传送方式查询传送方式无条件传送对于那些慢速的或总是准备好的外设是适用的。但是,许多外设并不总是准备好的。CPU与这类外设交换数据可以采用查询传送方式。所谓查询传送方式就是微型计算机利用程序不断地询问外部设备的状态,根据它们所处的状态来实现数据的输入和输出。第5章输入/输出技术为了实现这种工作方式,要求外部设备向微型计算机提供一定的状态信息(或称状态标志),如图5.1中所表示的那样。下面对单一外设和多个外设在查询传送方式下的工作情况分别加以说明。第5章输入/输出技术1单一外设的查询工作单一
14、外设的查询工作最简单的情况是单一外设的情况。其采用查询方式传送数据的过程如下所述。如果CPU要从外设接收一个数据,则CPU首先查询外设的状态,看外设数据是否准备好。若没有准备好,则等待;若外设已将数据准备好,则CPU从外设读取数据。接收数据后,CPU向外设发出响应信号,表示数据已被接收。外设收到响应信号之后,即可开始下一个数据的准备工作。第5章输入/输出技术若CPU需要向外设输出一个数据,CPU首先查询外设的状态,看其是否空闲。若正忙,则等待;若外设准备就绪,处于空闲状态,则CPU向外设送出数据和输出就绪信号。就绪信号用来通知外设:由CPU送来有效数据。外设接收数据后,向CPU发出数据已收到的
15、状态信息。这样,一个数据的输出过程即告结束。第5章输入/输出技术以上所描述的查询传送方式工作的输入输出过程,可简要地用图5.4所示的流程图来说明。CPU先查询外设的状态,然后决定是否传送数据。为了说明查询传送方式工作的过程,现举一简单的例子加以说明。如图5.5所示,其中图5.5(a)为外设的工作时序。当它不忙时,其状态信号BUSY=0,CPU可经接口向外设输出数据。而当数据被加到外设上时,必须利用负脉冲将数据锁存于外设,并命令外设接收该数据。STB第5章输入/输出技术图5.4 单一外设查询工作流程框图第5章输入/输出技术图5.5(b)所示是该外设与接口的连接电路。图中利用锁存器输出数据到外设;
16、利用另一片锁存器的Q0输出产生控制信号;同时,利用三态门244构成输入接口,由数据线D7读进外设的忙状态。通过查询外设的状态,实现数据的输出。STB第5章输入/输出技术现将从数据段40000H单元开始的顺序的50个字节由图5.5(b)所示的接口,利用查询传送方式输出的程序如下:PRODAT:MOV AX,4000H MOV DS,AX MOV SI,0 MOV CX,50 MOV DX,02F9H MOV AL,01H OUT DX,AL ;使STB=1 第5章输入/输出技术GOON:MOV DX,02FAH WAIT:IN AL,DX TEST AL,80H ;查询外设状态 JNZ WAIT
17、 ;忙,则等待 MOV DX,02FIH MOV AL,SI OUT DX,AL ;输出数据 第5章输入/输出技术 MOV DX,02F9H MOV AL,00H OUT DX,AL ;输出STB 负脉冲 MOV AL,01H OUT DX,AL INC SI LOOP GOON RET 第5章输入/输出技术图5.5 查询传送方式工作示例(a)外设时序图;(b)外设接口连接图第5章输入/输出技术2多个外设的查询工作多个外设的查询工作以上介绍的是单个外设查询传送工作的过程。当微机系统中存在多个外设,需利用查询传送方式工作时,可采用图5.6所示的某种方法来实现。由图5.6可以看到,图中所表示的多个
18、外设查询传送方式工作均是对各外设逐个进行轮流查询,并根据其状态决定对其服务。但三种方法又略有不同,最终表现在对外设服务的优先级上。不同的应用场合,可采用不同的查询方法。第5章输入/输出技术图5.6 查询方式的几种方式第5章输入/输出技术从以上分析可以看到,无条件传送适合于简单的外设,不需要专门的状态及控制信息,仅利用简单的接口通过程序即可实现输入或输出。就查询传送方式来说,当采用这种方式工作时,CPU对外设的状态逐一进行查询,发现哪个外设需要服务便对它服务,然后再继续查询。在这种情况下,CPU就像采用查询传送方式工作的厂长。在此方式下,厂长一上班就一个科室接一个科室地逐个询问有无需要处理的问题
19、,若有,则厂长加以处理;若没有,则转到下一个科室。询问完科室再逐个车间进行询问。也就是说,厂长不做别的事,就是一个科室接一个科室、一个车间接一个车间不停地轮流询问和处理各部门的问题。第5章输入/输出技术从上面对查询传送方式的描述可以看到,这种工作方式有两大缺点:(1)降低了CPU的效率。在这种工作方式下,CPU不做别的事,只是不断地对外设的状态进行查询。在实际工程应用中,对于那些慢速的外设,在不影响外设工作的情况下,CPU可以抽空做一些别的事。第5章输入/输出技术(2)对外部的突发事件无法做出实时响应。如上面提到的厂长,在他询问一车间无厂长要处理的问题刚刚离开一车间时,一车间发生爆炸(或大火)
20、等突发事件需要厂长处理,而这时厂长(也就是CPU)根本不知道事件的发生,也就无法做出处理,必须等到他把全厂其他所有车间和科室询问处理完再回到一车间,才能发现事故,对发生的爆炸(或大火)进行处理,也许这时一切都已经晚了。第5章输入/输出技术查询传送方式的优点在于这种工作方式原理很易理解,实现起来也很容易。因此,在那些对实时性要求不高的工程应用中经常被采用。一般来说,查询及无条件传送方式多用于慢速的外设。第5章输入/输出技术5.2.3 中断方式中断方式中断是计算机中一个非常重要的概念,而且在微型机中应用得极为广泛。掌握好中断的概念及其应用是每一个学习微型计算机的人必须做到的,尤其是在微型机的监测控
21、制系统中,经常会遇到实时处理各种突发事件。因此,在这些系统中一般都会用到中断。一个没有采用中断的监测控制系统要么是一个非常小的系统,要么是一个性能很差的系统。第5章输入/输出技术在微型机系统中,采用中断的优点就在于既能提高CPU的效率又能对突发事件做出实时处理。这就如同前面提到的那位厂长。在中断方式下,他上班后直接进入办公室,做他的工作或阅读有关企业管理方面的书。某时刻下面的科室或车间发生需要厂长处理的问题,于是电话铃响了,厂长暂停读书并用书签插在正在阅读的那一页上,接电话处理下面发生的问题。当问题处理完后,厂长放下电话,找到书签的位置接着读书。第5章输入/输出技术中断方式具有上面所提到的优点
22、,但中断实现起来比较麻烦,调试也比较困难。一旦出现故障需认真仔细地进行排除。在本节里,首先介绍中断的一般概念,接着说明8086(8088)的中断系统,最后介绍可编程中断控制器8259,直到使读者能熟练地应用中断解决具体的工程问题。第5章输入/输出技术1中断的基本概念中断的基本概念1)中断的概念及中断源分类在CPU执行程序的过程中,由于CPU内部或其外部某种事件发生,强迫CPU暂时停止正在执行的程序而转向对发生的事件进行处理,事件处理结束后又能回到原来中止的程序,接着中止前的状态继续执行原来的程序,这一过程称为中断。引起中断的事件就称为中断源。中断源的分类没有统一标准,但不外乎内部中断源和外部中
23、断源两大类。第5章输入/输出技术由处理器内部产生的中断事件称为内部中断源。例如,当CPU进行算术运算时,除数太小,致使商无法表示、运算发生溢出或执行软件中断指令等情况,都认为是内部中断。若中断事件是发生在处理器外部,如由处理器的外部设备(广义地说)产生的时,这类中断源称为外部中断源。例如,某些外设请求输入/输出数据,硬件时钟定时时间到,某些设备出现故障等等,均属于这种情况。这里所说的外部设备含义比较广泛,例如,硬件定时器、A/D变换器等均可看做外部设备。第5章输入/输出技术外部中断源产生引起中断的事件,事件发生后,如何告诉CPU以便让它做出处理呢?在CPU上有专门的中断请求输入引线,不同的CP
24、U中断请求引线多少不一,多的可多达十几条而少的则有一两条。如前所述,8088(8086)CPU有两条输入信号线:INTR和NMI。外部中断源利用INTR和NMI告诉CPU已发生了中断事件。第5章输入/输出技术2)中断的一般过程在这里以INTR为例说明中断的一般过程。所谓一般过程就是指无论哪种CPU(或处理器)都存在这样一个过程,并且通过对一般过程的描述,可加深对中断方式工作的理解。可屏蔽中断的一般过程按先后顺序分为如下几步。中断请求当外部设备要求CPU对它服务时,便产生一个有效的中断请求信号。注意这是一个电平信号,将其加到CPU的中断请求输入端,即可对CPU提出中断请求。第5章输入/输出技术对
25、于中断请求信号,应注意两个问题:其一是有效的中断请求电平必须保持到被CPU发现;其二是当CPU响应请求后,应当把有效的请求电平去掉。这样才能保证CPU不会对同一请求造成多次响应,而且也为下一次请求做好了准备。在使用可编程中断控制器(如下面要介绍的8259)时,CPU的中断响应信号就能做到这一点。若自己构成中断请求硬件,则必须注意到这个问题。第5章输入/输出技术 中断承认CPU在每条指令执行的最后一个时钟周期,检测中断请求输入端有无请求发生,然后决定是否对它做出响应。CPU承认INTR中断请求,必须满足以下4个条件:(1)一条指令执行结束。CPU在一条指令执行的最后一个时钟周期对请求进行检测,当
26、满足要叙述的4个条件时,本指令结束,即可响应。(2)CPU处于开中断状态。只有在CPU的IF=1,即处于开中断时,CPU才有可能响应可屏蔽中断请求。第5章输入/输出技术(3)没有发生复位(RESET)、保持(HOLD)和非屏蔽中断请求(NMI)。在复位或保持请求时,CPU不工作,不可能响应中断请求;而NMI的优先级比INTR高,CPU响应NMI而不响应INTR。(4)开中断指令(STI)、中断返回指令(IRET)执行完,还需要执行一条指令才能响应INTR请求。另外,一些前缀指令,如LOCK、REP等,将它们后面的指令看做一个整体,直到这种指令执行完,方可响应INTR请求。第5章输入/输出技术
27、断点保护中断事件的发生是随机的,尤其是外部中断。由于要求在中断事件处理结束后必须回到被中断的程序,接着中断前的状态继续向下执行,因此必须进行断点保护。断点保护一般分为两部分:一部分工作由CPU硬件在中断响应过程中自动完成;另一部分由程序员在中断服务程序中利用指令来完成。第5章输入/输出技术CPU在响应中断时,会由CPU硬件自动保护断点的部分信息(又称为保护现场),见图5.7所示中断过程示意图。如果图5.7中所示中断事件出现在指令MOV AL,81H执行过程中,该指令执行结束且满足其他条件,则CPU便对该中断做出响应。CPU保护该指令执行结束时的断点信息。不同的CPU利用其硬件自动保护的断点信息
28、是不一样的。例如8086(8088)CPU保护的是MOV AL,81H指令执行结束时,也就是下一条指令第一个指令字节所对应的CS和IP,同时保护这时的标志寄存器F。而MCS51则只保护当时的PC(它指向下一条指令的第一个字节)。第5章输入/输出技术图5.7 中断过程示意图第5章输入/输出技术一般情况下,CPU硬件自动保护的信息是不够的。由图5.7可以看到,中断在MOV AL,81H指令执行结束得到响应,经过一系列工作(见后述)转向中断服务程序。在中断服务程序中又用到了寄存器DX和AL,改变了它们的内容,则中断返回到被中断的程序,接着中断前的OUT DX,AL指令执行时,DX和AL的内容均已被修
29、改。因此,若不采取保护措施必然会发生错误。由于中断是随机发生的,在中断服务程序一开始,要由程序设计者保护在本服务程序中所用到的所有寄存器,然后才能使用这些寄存器。第5章输入/输出技术可见,断点保护,一部分由CPU硬件自动完成,另一部分则由程序设计者完成。这些保护通常是用压入堆栈的方法来实现的。中断源识别当微型机系统中存在多个中断源时,例如有多个中断源通过一条中断请求线INTR向CPU提出请求,一旦做出响应就必须弄清楚是哪一个中断源提出的请求,以便有针对性地对它服务,这就是中断源识别。第5章输入/输出技术常用的中断源识别方法有以下两种:(1)软件查询:利用输入接口将多个中断源的状态读入,逐个进行
30、查询,查询到是谁就转向对谁服务。(2)中断矢(向)量法:所谓中断矢量就是中断服务程序的入口地址(也就是中断服务程序的起始地址)。如给每一个中断源分配一个特定的中断服务程序的入口地址,将中断源的中断服务程序区分开来。在8088CPU中是给每一个中断源分配一个中断向量码(或叫做中断类型码),中断向量码不是中断矢量,但与中断矢量有密切的关系,后面将会看到,可通过中断向量表将两者联系到一起。第5章输入/输出技术目前,许多CPU(或单片机)都采用矢量法进行中断源识别。对中断源服务确定了中断源并且进行了断点保护后,接下来就是对具体的中断源的服务。不同的中断源服务不一样,一般根据预先确定的要求编写程序予以实
31、现。其详细情况将在中断优先级控制中说明。第5章输入/输出技术 断点恢复和中断返回这里的断点恢复是指恢复那些由设计者在断点保护时所保护的内容。前面已经提到,在断点保护时一部分寄存器的内容是CPU硬件自动保护的,另一些寄存器的内容是由设计者(或程序员)通过程序保护的。这里的断点恢复是恢复设计者所保护的内容,通常用弹出堆栈指令来完成(与保护时的压入堆栈操作相反)。第5章输入/输出技术3)中断优先级控制在具有多个中断源的微型机中,不同的中断源对服务的要求紧迫程度是不一样的。在这样的微型机系统中,需要按中断源的轻重缓急来对它们服务。第5章输入/输出技术根据上述思想,在微型机中提出了中断优先级的控制问题。
32、中断优先级控制应当解决这样两种可能出现的情况:(1)当不同优先级的多个中断源同时提出中断请求时,CPU首先响应最高优先级的中断源;第5章输入/输出技术图5.8 中断嵌套示意图第5章输入/输出技术(2)当CPU正在对某一中断源服务时,有比它优先级更高的中断源提出中断请求,CPU能够中断正在执行的中断服务程序而去对优先级更高的中断源进行服务,服务结束后再返回原优先级较低的中断服务程序继续执行。第5章输入/输出技术上面的第(2)种情况,就是优先级高的中断源可以中断优先级低的中断服务程序,这就形成了中断服务程序中套着中断服务程序的情况,这就是所谓的中断嵌套。中断嵌套可以在多级上进行,形成多级中断嵌套,
33、其示意图如图5.8所示。在这种情况下,中断服务程序有两种形式:一种是允许中断的中断服务程序;另一种是不允许中断的中断服务程序。两种形式的服务程序框图分别如图5.9(a)和(b)所示。第5章输入/输出技术图5.9 中断服务程序框图(a)不允许中断的中断服务程序框图;(b)允许中断的中断服务程序框图第5章输入/输出技术由图5.9可以看到,两种中断服务程序的区别仅在于不允许中断的中断服务程序一直是关中断的,仅在中断返回前开中断,则整个中断服务程序均不会响应中断。而允许中断的中断服务程序中有开中断指令,则允许中断。第5章输入/输出技术对于图5.9,更重要的是读者必须记住并理解一个中断服务程序的基本框架
34、:开始必须有断点保护,这就是前面提到的由程序员利用指令完成的那一部分;然后要有对中断源的具体服务;服务完后必定要有断点恢复;最后则是中断返回。这个基本框架是设计人员必须遵循的,是非常重要的。第5章输入/输出技术当微型机系统需要中断嵌套工作时,需要编写前面提到的允许中断的中断服务程序。同时,要特别注意,每一次嵌套都要利用堆栈来保护断点,使堆栈内容不断增加,因此,要充分估计堆栈的大小,不要使堆栈发生溢出。第5章输入/输出技术28086(8088)的中断系统的中断系统8086(8088)具有功能很强的中断系统,可以处理256个不同方式的中断。每一个中断赋予一个字节的中断向量码(也称中断类型码),CP
35、U根据向量码的不同来识别不同的中断源。8086(8088)中断源分为两大类,下面将逐一加以介绍。1)内部中断源8086(8088)的内部中断主要有5种。第5章输入/输出技术 除法错中断在8086(8088)执行除法指令时,若除数太小,致使所得的商超过了CPU所能表示的数值范围,则CPU立即产生一个向量码为0的中断。因此,除法错中断又称为方式0中断。中断向量码0是由CPU内部硬件自动产生的。第5章输入/输出技术 单步中断8086(8088)CPU的标志寄存器中有一位TF标志陷阱状态标志。CPU每执行完一条指令后都检测TF的状态。如果发现TF=1,CPU产生中断向量码为1的中断,使CPU转向单步中
36、断的程序。单步中断广泛应用于程序的调试,使CPU一次执行一条指令。单步中断的中断向码01H也是由CPU内部硬件自动产生的。第5章输入/输出技术 断点中断8086(8088)的指令系统中有一条专门用来设置断点的指令,其操作码为单字节CCH。CPU执行该指令时产生向量码为3的中断(即方式3中断)。断点中断在调试过程中用于设置断点。断点中断向量码03H亦是由CPU内部硬件自动产生的。第5章输入/输出技术 溢出中断当CPU进行算术运算时,如果发生溢出,则会使标志寄存器的OF标志位置1。如果在算术运算后加一条溢出中断指令INTO,则溢出中断指令测试OF位,若发现OF=1,则发生向量码为4的中断(即方式4
37、中断)。溢出中断的中断向量码04H同样是由CPU内部硬件自动产生的。若发现OF=0,则不发生中断并继续执行该指令后面的指令。第5章输入/输出技术 用户自定义的软件中断用户可以用INT n这样的指令形式来自定义软件中断。其中INT为助记符,形成一个字节的操作码;n为由用户确定的、一个字节的中断向量码。INT n是由用户自己确定的两个字节的软件中断指令。可见,软件中断指令的中断向量码是由程序员(用户)决定的。总之,内部中断的中断向量或者是CPU指定的,如除法出错、单步、断点和溢出中断,或者是由用户预先给定的。当CPU响应这些中断时,CPU本身或通过软件指令即可获得中断向量码。第5章输入/输出技术2
38、)外部中断8086(8088)有两个信号输入端供外部中断源提出中断请求,下面分别予以说明。非可屏蔽中断NMI如前所述,8086(8088)的NMI不受IF标志的限制。只要CPU在正常执行程序,一旦NMI请求发生,CPU在一条指令执行结束后将对它做出响应。NMI的请求输入为上升沿有效。8086(8088)CPU响应NMI中断请求时,由CPU内部硬件自动产生中断向量码02H,该向量码决定非屏蔽中断服务程序的入口地址。第5章输入/输出技术 可屏蔽中断请求INTR该中断通常简称为中断请求,它受中断允许标志位IF的约束。只有当IF=1,CPU才有可能响应INTR请求。INTR高电平有效。8086(808
39、8)CPU响应INTR中断请求与响应内部中断和外部NMI中断的方法不同。在CPU响应内部中断和NMI中断时,是由CPU硬件自动形成或由软件指令提供中断向量码的。根据该中断向量码可决定中断服务程序的入口地址,转向相应的中断服务程序去执行。可以认为,中断源在得到CPU响应时是与外部没有关系的。第5章输入/输出技术但是,INTR中断响应则不一样,CPU的响应过程要做两方面的工作:其一,CPU首先产生两个连续的中断响应总线周期。在第一个中断响应总线周期,CPU将地址总线及数据总线置高阻,送出第一个中断响应号。在第二个中断响应总线周期,CPU送出第二个信号。该信号启动外部中断系统,通知它将提出中断请求的
40、中断源的一个字节的中断向量码放到数据总线上,CPU由数据总线即可获得该中断源的中断向量码。第5章输入/输出技术外部中断系统(通常是可编程中断控制器)预先对不同的中断源赋予不同的中断向量码。因此,CPU获得不同的中断向量码也就可以区分不同的中断源。其二,当CPU获得中断源的中断向量码后,再由CPU硬件进行断点保护(FLAG,CS,IP)并关中断。然后,根据中断向量码,获得中断源的服务程序入口地址,转向对中断源进行服务。可见,在获得中断向量码的方式上,INTR与内部中断和NMI中断是不同的。的时序如图5.10所示。第5章输入/输出技术图5.10 8088 CPU的INTR中断响应时序第5章输入/输
41、出技术由图5.10可见,响应INTR的过程需要两个总线周期。每个总线周期送出一个负脉冲。第一个负脉冲用于响应提出中断请求的外设(接口)。第二个负脉冲期间,提出中断请求的外设将其中断源的中断向量码送到数据总线上。CPU可从数据总线上获取该向量码。顺便提一句,图5.10是8088 CPU的中断响应时序。8086与其不同之处仅仅在于在两个总线周期间多加了三个空闲的时钟周期。第5章输入/输出技术综上所述,可利用图5.11表示8088(8086)CPU的中断响应的全过程。对这一过程,总结如下:(1)由图5.11可见,CPU利用硬件查询各中断源。一条指令执行结束后,先查询的优先级比后面的高。因此,除单步外
42、的内部中断(除法、断点、溢出及软件中断指令)的优先级最高,然后依次是NMI、INTR,优先级最低的是单步中断。第5章输入/输出技术(2)各种中断源在响应过程中获取中断向量码的途径是不一样的。除法、溢出、断点、单步及NMI均由CPU内部硬件产生;软件中断指令的中断向量码包含在指令中;而INTR的中断向量码是由CPU从数据总线上读取得到的。获得中断源的中断向量码以后的过程则全都是一样的(见图5.11)。第5章输入/输出技术(3)特别提醒读者注意的是,图5.11的整个过程从CPU硬件查询中断源到CPU转到中断服务程序这一复杂的过程,全部都是由CPU硬件自动完成的。读者必须记住这个过程,在今后利用中断
43、解决具体的工程问题时,设计人员的工作就在于利用硬件和软件配合CPU的这个过程,最终使中断顺利地实现。后面将会看到这一点。第5章输入/输出技术图5.11 8088(8086)的中断响应过程第5章输入/输出技术3)中断向量表前面已提到,中断服务程序的入口地址称为中断向量(或中断矢量),每一个中断源都具有它自己的中断服务程序及其入口地址。前面又提到,每一个中断源都具有它自己的中断向量码。那么,中断向量码和中断向量两者有什么关系呢?中断向量码和中断向量(即中断服务程序的入口地址)是通过图5.12所示的中断向量表建立联系的。第5章输入/输出技术图5.12 中断向量表第5章输入/输出技术从图5.12可以看
44、到,中断向量表是内存00000H003FFH的一段大小为1024个存储单元的区域。存储单元的地址(00000H003FFH)叫做中断向量表地址,在这些地址中存放着中断向量。中断向量也就是中断服务程序的入口地址,它如何存放呢?每一个中断源都按其中断向量码所决定的地址存放其服务程序的入口地址:中断服务程序入口的偏移地址向量码4=中断向量表地址及加1的地址中断服务程序入口的段地址向量码4=中断向量表地址加2及加3的地址第5章输入/输出技术如上所述,除法中断服务程序入口地址的偏移地址就存放在00000H和00001H单元中,而入口地址的段地址就存放在00002H和00003H单元中。参见图5.11,当
45、除法中断发生后,CPU响应的最后步骤就是中断向量码(00H)4构成中断向量表地址,即从00000H和00001H单元取出事先放好的中断服务程序入口的偏移地址放进IP,而从00002H和00003H单元中取出事先放好的中断服务程序的段地址放到CS中。则从下一个总线周期开始,CPU一定转向除法中断服务程序的入口地址,开始执行服务程序。对于其他中断源,其思路与除法中断一样。第5章输入/输出技术中断服务程序的入口地址(即中断矢量)必须事先填写到中断向量表中。填写中断向量表可用下面两种方法:直接编程序填写中断向量表若某中断源的中断向量码为48H,而该中断的中断服务程序名称为TIME,则可编写如下程序填写
46、中断向量表:第5章输入/输出技术SEDITV:MOV DX,0000H MOV DS,DX MOV SI,0120H ;中断向量码 48H4=0120H MOV DX,OFFSET TIME ;取服务程序入口的偏移地址 MOV SI,DX MOV DX,SEG TIME ;取服务程序入口的段地址 MOV SI+2,DX 第5章输入/输出技术在该程序中,将TIME的移偏地址放在了向量码48H4=0120H及其加1的单元中,也就是中断向量表地址00120H和00121H中,而把TIME所在段的段地址放在了向量码48H4=0120H的加2和加3单元中,即00122H和00123H中。第5章输入/输出
47、技术 DOS系统调用填写中断向量表若在DOS下工作,则可采用DOS系统调用:INT 21H的功能25H25HAH中断向量码AL中断服务程序段:偏移量DS:DX第5章输入/输出技术程序如下:MOV AH,25H ;功能号MOV AL,48H ;中断向量码MOV DX,SEG TIMEMOV DS,DXMOV DX,OFFSET TIMEINT 21H第5章输入/输出技术这样一来,就将中断向量码和中断服务程序的入口地址通过中断向量表联系在一起,而且每个中断向量码(也就是每个中断源)在中断向量表中占有4个地址,其中2个地址放中断服务程序入口地址的偏移地址,另2个地址放中断服务程序入口地址的段地址。由
48、于8088 CPU有00HFFH共256个中断源,所以中断向量表也只有1KB大小。第5章输入/输出技术3中断控制器中断控制器8259前面曾经提到,可编程中断控制器是当前最常用的解决中断优先级控制的器件。中断控制器8259具有很强的控制功能,它能对8个或通过级联对更多的中断源实现优先级控制。通过提供不同的中断向量码来识别这些中断源,为用户构成中断系统提供强有力的手段。从现在开始,我们将介绍一些功能强大的可编程器件。这些可编程器件结构复杂,使用灵活。从应用角度出发,主要介绍如何用好它们,来完成所需的功能。读者应从以下几个方面来认识并最终用好它们。第5章输入/输出技术(1)弄清楚芯片外部引线的功能。
49、只有熟悉每一条引线,在将来工程应用中才有可能将芯片连接到系统总线上。(2)了解芯片的工作方式或工作特点,以便将来遇到具体的工程问题,能够知道利用芯片的哪种工作方式或哪些工作特性来解决问题。(3)理解芯片内部的控制字、命令字、状态字,以便在具体应用时能选择控制字、命令字并利用状态字对芯片编程。(4)了解芯片所占的接口地址,以利于对芯片的具体连接。(5)在上述的基础上,实现对芯片的初始化及具体应用。第5章输入/输出技术下面开始具体介绍可编程中断控制器8259。1)8259的外部引线可编程中断控制器8259外部引线及内部结构简图分别如图5.13(a)和(b)所示。第5章输入/输出技术图5.13 82
50、59中断控制器(a)8259引线图;(b)8259内部结构简图第5章输入/输出技术8259中断控制器的引线及功能说明如下:D0D7为双向数据线,与系统总线的数据线相连接。编程时控制字、命令字由此写入;中断响应时,8259的中断向量码由此送到数据总线上,提供给CPU。、为写和读控制信号,与系统总线的写、读信号相连接。为片选信号,只有为低电平时,才能实现CPU对8259的写或读操作。通常在系统中连接地址译码器。A0是8259内部寄存器的选择信号。它的不同状态,对应不同的内部寄存器。使用中,通常接地址总线的某一位,例如A1或A0等。WRRDCSCS第5章输入/输出技术INT为8259的中断请求输出信