版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章输入输出接口(1)7.1输入输出接口基础
7.2中断系统
7.3DMA传送和DMA控制器8237
7.4总线与接口标准7.5主机板上的定时计数逻辑7.6键盘接口及应用
小结
习题七 7.1输入输出接口基础
在讨论具体接口之前,在这一节里,我们讨论I/O(输入输出)接口的几个基本问题:I/O的基本方式、I/O接口的结构、I/O指令要求的接口逻辑。通过这些问题的讨论,勾画出输入输出接口技术的基本轮廓。
7.1.1输入输出的基本方式
1.输入输出指令
微机系统中存在着存储器地址空间和输入输出地址空间。存储器的每个字节单元占存储器地址空间的一个地址。与此相类似,在输入输出地址空间中,占据一个输入输出地址的称为一个输入输出端口或简称为端口(PORT)。
CPU可以从端口读入数据,也可以向端口输出数据。对80X86微处理器,CPU从端口读入数据的指令称为输入指令,助记符为IN;CPU向端口输出数据的指令称为输出指令,助记符为OUT。指令的一般格式为
INDST,SRC
OUTDST,SRC
对于IN指令,目的地址DST的寻址方式为寄存器方式,字节输入时为AL,字输入时为AX。源操作数的寻址方式有两种:①直接寻址方式,即在SRC的位置上直接写上代表端口地址的数或能求出值的表达式。对于直接寻址方式有一点限制,就是端口地址不能大于255(0FFH)。②寄存器间接寻址。间址寄存器为DX。这种寻址方式需要在IN指令之前,把输入端口地址传送至DX寄存器。
对于OUT指令,源操作数的寻址方式和IN指令的目的操作数的寻址方式相同,目的操作数寻址方式与IN指令的源操作数寻址方式相同。有8位端口和16位端口两种端口。对于8位端口而言,要用一条指令输入或输出16位数据将涉及两个相邻的端口,如表7.1所示。对于16位端口,用一条指令输入或输出16位数据只涉及一个端口。表7.1IN指令和OUT指令的格式和功能输入输出指令的执行不影响任何标志位的状态。
2.输入输出同步
IN指令可以把外部数据输入CPU,OUT指令可以把CPU的数据输出到外部,它们是实现数据输入输出传输的基础。但是,实际数据传输过程中,有一个突出的必须解决的问题,就是主机与外部设备之间时间同步的问题。表现在:
(1)外部设备工作时有自己的定时机构,主机在运行程序、执行指令时也有自己的定时系统,从一般意义上来讲,它们在时间上是不同步的。对于一个要向主机输入数据的设备,主机不能准确知道什么时候已把要输入的数据准备好了;反之,这个输入设备把数据准备好之后,也不知道什么时候主机将用IN指令取走数据。
对于一个接收主机输出数据的设备,主机不能准确知道什么时候这个设备已经作好了接收数据的准备;反之,该设备也不能准确知道什么时候主机将输出新数据。为了可靠而有效地传输数据,主机和外部设备之间除传输数据之外,还需要互相提供联络信息。联络信息可以理解为状态信息,如向接收方提供“数据已准备好”的状态,请对方取走;联络信息也可理解为命令或请求,如“把数据取走”。实际上,理解为状态或命令并没有严格的区别,把“数据已准备好”的状态解释为“请把数据取走”的命令也是可以的。如何向对方提供联络信息,对于对方提供的联络信息以什么方式响应和处理,是实现主机与外部设备之间同步需要解决的基本问题。
(2)一个微机系统中,如果有多个外部设备存在,也就存在这种可能性:两个或多于两个设备同时要求与主机交换信息。在这种情况出现时,必须以某种策略决定首先应该响应和处理哪个设备的传输请求,然后响应和处理哪个设备的传输请求,这是实现同步要解决的另一个基本问题。
在以后讨论的各种输入输出方式以及各种接口板,都用某种方法解决了主机与外设之间同步问题。
3.输入输出的基本方式
在微机中,CPU和接口之间的信息交换方式有3种,它们是查询方式、中断方式和存储器直接存取(DMA)方式。
1)查询方式
查询方式是CPU在向接口输入或输出数据时,主动去检查外设是否“准备好”,只有当确认外部设备已具备传输条件之后,才进行数据交换。
查询输入方式的程序流程图见图7.1。图7.1查询输入方式的程序流程假定某接口的状态端口地址为STATUSPORT,数据端口地址为DATAPORT,状态口的D7位为接口的“准备好”标志位,高电平有效,则查询输入程序如下:
AGAIN:INAL,STATUSPORT
ANDAL,80H
JZAGAIN
INAL,DATAPORT假定某接口的状态端口地址为STATUSPORT,数据端口地址为DATAPORT,状态口的D7位为接口的“准备好”标志位,高电平有效。要求:采用查询方式将内存中DATA单元的一个字节的内容输出,其查询输出程序如下:
AGAIN:INAL,STATUSPORT
ANDAL,80H
JZAGAIN
MOVAL,DATA
OUTDATAPORT,AL查询输出方式的程序流程图见图7.2。
显然,在查询方式下,CPU需要花费许多时间来查询外设的状态,并且等待外设进行数据传输的准备,CPU工作效率很低。但这种方式不需要增加额外的硬件电路,易于实现。
2)中断方式
中断是CPU处理随机事件的一种机制。在CPU执行程序的过程中,当某一特殊事件发生时,CPU暂时停止当前的运行程序而转去执行处理这一特殊事件的程序(称为中断处理程序),待特殊情况处理程序执行完后,CPU返回到被暂时停止的程序接着运行。图7.2查询输出方式的程序流程中断是CPU和外设进行I/O的有效方法,它可以避免因反复查询外部设备的状态而浪费时间,提高了CPU的工作效率。
在外部设备没有作好数据传输准备时,CPU可以运行与数据传输无关的其他指令。外设准备好后,主动向CPU请求中断,CPU响应这一请求,暂停正在运行的程序而运行与外设进行数据传输的中断处理程序,在中断处理程序中,利用IN和OUT指令,完成与外设的数据传输,然后再返回继续运行原来的程序。
为了实现中断传输,需要在CPU和外设中间设置中断控制器。采用查询方式和中断方式时,数据的输入和输出是由指令IN和OUT来完成,因此,查询方式和中断方式也成为程序控制方式。
3)存储器直接存取方式
存储器直接存取DMA(DirectMemoryAccess)方式的基本思想是在外部设备和存储器之间开辟直接的数据传输通路,数据传输不是靠执行I/O指令,数据不经过CPU内的任何寄存器,而是在存储器和外部设备之间的通路上直接传输数据。
DMA方式实际上是把I/O过程中外设与内存数据交换的操作与控制交给了DMAC(DMA控制器,DirectMemoryAccessController)来完成,简化了CPU的操作。在查询和中断方式下,数据传输过程中的一些操作,如存数和取数、地址修改、传输字节计数、传输是否结束检测等,是由程序实现的。在DMA方式下,这些操作都由DMA控制器的硬件实现,因此传输速率高,特别适用于大批量的数据传输。7.1.2输入输出接口的基本结构
接口(Interface)一词的基本意思是界面,任何相关的异体之间总存在着接口。两个微机系统,如果它们之间有数据往来,它们之间就存在接口。在一个微机系统内,由于各部分之间要交换信息,所以各部分之间也存在接口。微处理器内部各部分之间也存在接口。但是,从应用的目的考虑,并不是什么接口都有必要深入讨论。例如,微处理器是已经封装好了的集成电路,它内部各部分之间的接口就没必要深入讨论。在微机系统内,微处理器与其它部分的接口就是体现在微处理器输入输出引脚上的微处理器级总线。如何利用微处理器的总线开发出微机系统,是微机系统开发者必须关心的问题。对应用有实际意义的,是讨论这样的主机与其它已有的外部设备或要开发的外部设备之间的接口问题,这就是我们要讨论的输入输出接口技术。
1. I/O接口的组成框图
对于I/O接口的组成参看两个图:图7.3是IBMPC/XT微机的组成框图,回顾图6.4(6.1)是一个有代表性的南桥芯片提供的接口功能图。在第6章的叙述里,只简要介绍了图中各控制器的基本功能。图7.3中主机板内的“I/O接口逻辑”包含在图6.4所示的功能块中。图7.3IBMPC/XT微机I/O结构框图
2. IBMPC/XT系统提供的接口概述
如图7.3所示,基本配置的IBMXT系统为I/O接口既提供了硬件资源,又提供了软件资源。提供的硬件资源包括:
(1)在扩展插槽上提供了I/O总线。I/O总线是主机板与外部设备接口相连的唯一途径,任何外设接口的开发,必须建立在I/O总线的基础上。后面将详细说明I/O总线内容。
(2)主机板上有键盘接口逻辑和扬声器接口逻辑。键盘接口逻辑的出口接在机箱后的专用5芯插座上,扬声器接口与固定在机箱内的扬声器直接相接。
(3)主机板上有以两片8259中断控制器为核心组成的中断控制逻辑。中断控制逻辑可以接受15个外部中断请求,表示为IRQ0~IRQ15,其中IRQ2被从片8259的中断请求线INT占用。主片8259的中断请求输出引脚INT与CPU的中断请求输入引脚INTR相连。当CPU的INTR引脚有一个来自主片8259的有效信号输入时,则产生硬件可屏蔽中断请求INTR,这种请求可被CPU用指令CLI来禁止,也可由指令STI来允许。7.2.2节将详细讨论8259中断控制器。图6.4的南桥芯片中“中断控制器”模块包含8259。
(4)主机板上有以两片8237DMA控制器为核心组成的DMA传送控制逻辑,共有8个数据通道,用于实现内存与外部设备之间和内存存储区之间直接(不经过CPU内寄存器)、快速、成批数据的传送。图6.4的南桥芯片中集成了两个级联的8237。7.3节将详细讨论8237。
(5)主机板上有一片8254定时/计数器芯片,有3个功能:①用于当日计时,和CMOS共同组成定时计时系统;②为动态存储器刷新提供定时信号;③向扬声器提供可编程的脉冲信号。图6.4南桥芯片中的“计数定时器”模块集成着该功能的电路。7.5节将详细讨论8254。
(6)基本配置的系统微机包含的I/O接口卡可能有不同的组合,但在功能上和编程上是兼容的。通常包括以下接口逻辑(第8章对这些接口详细讨论):
①显示器接口。由于现在很少用单色显示器,所以现在显示器接口虽有不同制式,但都支持彩色的字符和图形显示。
②两个标准(Centronics)的并行打印机接口,不仅支持并行打印机工作,也支持任何遵守这种接口协议的输出设备,如绘图仪等。
③两个标准(RS232)的串行异步通信接口。
④磁盘驱动器接口,通常能连接两个软盘驱动器和两个硬盘驱动器。除此之外,I/O总线中还提供了相当容量的+5V、-5V、+12V和-12V直流电源。
系统为I/O接口提供的软件资源包括DOS的功能调用和BIOS调用。在第4章中,我们已经讨论了利用INT21H指令实现的I/O功能调用,包括从键盘缓冲区读取字符码、在显示器上显示字符、利用打印机打印输出字符等。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检、引导装入、主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大的方便。程序员不必了解硬件操作的具体细节,直接使用指令设置参数,并利用INT指令,中断调用BIOS,所以利用BIOS功能编写的程序简洁,可读性好。关于BIOS的调用,我们将在以后各节陆续讨论。
3.现代微机系统I/O接口的主要特点
这个问题在第6章和本章的开始已经介绍了。这里再提出来是想提醒,前面说明的接口资源是IBMPC/XT系统的。现代微机系统的I/O总线与IBMPC/XT有较大不同,将在7.4节详细说明。
7.1.3I/O指令需要的接口逻辑和端口地址分配
无论哪种输入输出方式,I/O指令是实现输入输出控制的基础。在外部设备的接口逻辑中,必须有一部分逻辑能使I/O指令得以执行。这部分逻辑,可以说是最基本的I/O接口。从应用的目的出发,本节还将介绍IBMPC/XT机基本配置下I/O端口地址的分配情况。
1. I/O指令需要的接口逻辑
对于接口设计者来说,系统I/O端口地址分配十分重要。 哪些地址已分配给了别的设备,哪些是计算机制造商为今后开发而保留的,哪些地址是空闲的,了解这些信息是计算机系统接口设计的首要工作。
在IBMPC/XT微机系统设计中,按照设备接口的配置情况,I/O接口的硬件分成系统板上的I/O芯片和I/O扩展槽上的接口控制卡两类。同时,根据I/O接口的硬件分类,将I/O空间分成两部分。
IBMPC/XT系列微机I/O地址线可有16根,最大可寻址I/O端口地址空间为64K。由于IBM公司最初设计微机主板及规划接口卡时,采用了非完全译码方式,只将低10位地址线A0~A9进行译码, 而不考虑高6位地址线A10~A15, 因此其I/O端口地址范围是0000H~03FFH,总共只有1024个端口,并且把前512个端口分配给了主板,后512个端口分配给了扩展槽上的常规外设。后来在PC/AT系统中,又作了一些调整,其中前256个端口(000H~0FFH)供系统板上的I/O接口芯片使用,后768个端口(100H~3FFH)供扩展槽上的I/O接口控制卡使用。端口地址的选择与访问存储器时对存储单元的地址选择很相似,也是用译码器逻辑对I/O总线中的地址总线进行译码实现的。只不过这里不是利用20条地址线而是只用A0~A9共10条地址线。在开发一个I/O端口时,必须先为它指定一个端口地址,并要设计一个地址译码器。在输入端的地址状态与指定的端口地址一致时,译码器恰好输出有效信号,作为端口选择信号。
除了实现端口选择的译码之外,还有输入还是输出的控制信号。控制信号是CPU通过I/O总线发来的,已经在第4章讨论过。而这个端口并不是DMA传输涉及的端口,DMA传输涉及的端口是由DMA控制器选定的。为了避免这种错误现象发生,将AEN信号反相加入译码器与非门的输入端,在DMA传输时就会封闭译码器的输出。
有些外部设备,一个设备就占用多个I/O端口地址。例如一部简单的并行打印机接口就占用3个端口,一个输出打印字符码,一个用于输入打印机状态,一个输出控制信号。这就需要选择合适的端口地址译码电路。图7.4输入数据端口的典型结构图7.5输出数据端口的典型结构
2. IBM系列机的I/O端口地址分配
IBMPC系统I/O地址空间范围为0~3FFH。实际上有不少I/O地址已分配出去了。有些已分配给系统基本I/O设备的接口,有些分配给可选I/O设备的接口,有些根据系统生产厂家的建议需要保留, 留给计划开发的I/O设备接口。用户在为自己开发的接口选择地址时,一定要检查系统有哪些I/O端口地址已被占用,从而避开已占用的地址。表7.2列出了IBMPC系统I/O端口地址的分配情况。表7.2IBM系列微机I/O端口地址分配
7.2中断系统
在微机系统中,中断功能是靠微处理器本身的功能和与之配合的外部逻辑共同实现的。这种外部逻辑通常是以中断控制器为核心组成的。所以,本节首先讨论微处理器本身提供的中断功能,然后讨论IBMPC系列微机的外中断和中断控制器8259,最后讨论如何应用中断功能。
7.2.1微处理器的中断功能
中断是指CPU暂停正在执行的程序,转去执行处理中断事件的中断服务程序,待执行完中断服务程序再返回到原被中断的程序继续执行。通常称引起中断的事件为中断源。
1.中断的种类和中断类型号
中断可分为外部硬中断和内部中断两大类。
外部硬中断是微处理器外部事件发生,产生中断请求信号,中断请求信号再通过微处理器芯片上的接受中断请求信号的引脚加入微处理器而出现的中断。
微处理器芯片上有两个引脚用于接受外部中断请求信号:NMI和INTR,分别接受不可屏蔽中断请求和可屏蔽中断清求。所谓“可屏蔽”和“不可屏蔽”是指微处理器的PSW(Flags)寄存器中的IF控制位对中断响应是否存在控制作用。可屏蔽中断是受IF位控制的中断:如果IF位为1,微处理器将能响应可屏蔽中断的中断请求,称为开中断状态,置IF为1的指令STI称为开中断指令;如果IF位为0,就关闭了微处理器响应可屏蔽中断的功能,称为关中断状态,清除IF位为0的指令CLI称为关中断指令。可屏蔽中断的中断请求信号在微处理器的INTR端加入。
常规外部设备,如键盘、打印机、磁盘机、串行异步通信接口,以及自己开发的接口设备或专用接口(如组成计算机网络的链路卡)等,如果它们利用中断机制(有些接口可以不用中断机制)与CPU交换信息,都将利用可屏蔽中断。所以,我们将主要讨论可屏蔽中断操作及应用。当CPU的NMI(NonMaskableInterrupt)引脚上有一个来自外部的由低到高的上跳变触发信号时,产生中断类型号为2的NMI请求,并转入相应的服务程序。这种中断的特点是不能被CPU用指令CLI(IF位置0)来禁止,一旦出现请求,CPU应立即响应,因此,称为不可屏蔽中断。不可屏蔽中断NMI用来处理对整个系统来说致命的异常情况。内部中断又分为异常中断和软中断两类。最好理解的是软中断,就是指令INT执行时所产生的中断。软中断和其它中断一样,也将转去执行中断服务子程序。很容易提出的问题是,既然INT指令是作为指令排入程序中,就是说,它的位置是编程者设定的,而它的执行又将调用一个子程序,那么为何不把这个子程序直接排在INT指令的位置上或用CALL指令调用这个子程序呢?这是一个很好的问题,这就是,软中断干什么?软中断是用汇编语言编程时,用户的应用程序调用系统软件(主要是操作系统)中子程序的主要方法。系统软件,特别是在ROMBIOS和常驻内存的操作系统中,有许多精心设计的子程序,它们作为系统资源可供用户使用。在高级语言编程时,这些系统子程序常以应用程序接口函数形式,被高级语言应用程序调用。在汇编语言编程时,INT指令的作用与应用接口函数的作用一样,用于调用系统资源。回顾前面讨论过的INT21H指令的功能就可以理解中断机制中的软中断所实现的应用程序调用系统程序的功能。内部中断的另一类称为异常中断,这些中断既不是由外部设备提出申请而产生的中断,也不是由用户在程序中发中断指令INT而发生的, 而是由于内部的突发事件所引起的中断。这类中断也是不可屏蔽中断,其中断处理过程与软中断相同,因此,有些书中也把它们归到软中断一类。这类中断包括:
1) 0号中断——被零除中断
当CPU执行除运算操作时,若出现除数为0,则引起0号中断。
2) 1号中断——单步中断
CPU执行一条指令前,若检测到PSW的单步标志位TF=1,则在该条指令执行后立即停止,引起1号中断,该中断支持程序单步跟踪的功能。
3) 3号中断——断点中断
该中断主要供调试程序使用。通常调试程序时,把程序按需要分成若干段,每段设置一个断点。当CPU执行到断点时产生中断,这时程序员可检查各寄存器及有关存储单元的内容。设置断点实际上是把一条断点指令INT3插入程序中,CPU每执行到断点处的INT3指令便产生一个中断。系统并未提供断点中断服务程序,通常由调式软件支持。
4) 4号中断——溢出中断
在执行单字节指令INTO时,如果CPU检测到溢出标志OF=1,则产生4号中断,进行溢出处理;如果OF=0,则不中断。溢出中断处理程序的主要功能是输出一个出错信息,在处理程序结束时,不返回原程序,而是把控制权交给操作系统。系统分配给每个中断源的编号称为中断类型号。系统中的外部中断和内部中断,硬中断和软中断统一编号。在中断发生时,借助中断类型号,能使程序转入相对应的中断服务程序。中断类型号的范围为0~255,即最多256个。其中,由中断指令产生的软中断,其中断类型号由指令本身给出,INTn指令中的n即是中断类型号。例如INT21H,其中断类型号为21H。可屏蔽中断的中断类型号由外部中断控制逻辑提供,并在处理器响应中断时从外部输入处理器。系统的中断类型号见表7.3。表7.3IBMPC定义的中断类型号
2.中断向量表和中断描述符表
CPU对中断的处理是通过中断服务程序来实现的,中断服务程序的入口地址信息存放于中断向量检索表内。CPU依据中断类型号获取中断服务程序的入口地址,但在实模式和保护模式下采用不同的途径,在实模式下使用中断向量表,在保护模式下使用中断描述符表IDT。通过中断向量表或中断描述符表IDT,提供中断服务程序的入口地址,实现从主程序向中断服务程序的跳转。
1)中断向量表
80x86微处理器家族各成员在设计时硬件逻辑保证了这一项规则:在实模式下,存储器地址最低的1024单元,即地址0000H~03FFH,专用于存储各种中断服务程序的入口地址。从00000H开始,每4个单元存放一个中断服务程序入口。其中前两个单元的16位是入口地址的段内偏移部分,后两个单元的16位是入口地址的段地址。程序运行转入中断服务程序时,入口地址的段内偏移部分将装入IP中,入口地址的段地址部分装入CS。中断服务程序的这32位以逻辑地址形式表示的入口地址称为中断向量或中断指针。存储器地址最低的1024个单元共可存256种中断向量,这个专用于存储中断向量的存储区称为中断向量表。中断类型号与中断向量表的关系如何?简单地说,中断类型号是访问中断向量表的索引号。也就是说,中断向量在中断向量表中的存储顺序是以中断类型号为索引的。中断类型号与中断向量指针的关系是:
中断向量最低字节的指针=中断类型号(N)×4
中断类型号为0,其中断向量在向量表的00000H~00003H地址;中断类型号为1,其中断向量在00004H~00007H地址……;中断类型号为255时,其中断向量应在003FCH~003FFH地址。中断类型号与中断向量地址的对应关系如表7.4所示。表7.4中断类型号与中断向量地址的对应关系应该明确,中断类型号只与存放中断向量的地址有关,存放中断向量的地址等于中断类型号乘以4。但中断类型号不能决定中断向量本身和中断服务程序的功能。中断向量,即中断服务程序的入口地址和中断服务程序是软件开发者确定和设计的。例如,在执行除法指令时,因除数为0或商值溢出而引起的类型号0中断,存放中断向量的地址为00000H~00003H,这是确定不变的。但中断向量本身,即存放在这4个单元中的中断服务程序入口地址和中断服务程序则是系统软件开发者确定和设计的。在系统启动时,操作系统不仅要把这个中断服务程序装入内存,还要把服务程序的入口地址装入00000H~00003H单元。如果某个用户的应用程序开发者认为有必要,可以更改这个中断服务程序。这就要求把新的中断服务程序装入内存后还要把新程序的入口地址装入00000H~00003H单元。
2)保护模式下的中断服务程序入口地址
在第2章曾经介绍过高档CPU保护模式访问存储器的编制寻址机制。与这种机制相适应,保护模式下取代中断向量表的是中断描述符表IDT。中断描述表IDT每一个表项对应一个中断类型号,这些表项被称为中断/陷阱门描述符。每个描述符为8字节长,IDT表长为2KB,因此对应256种中断。中断/陷阱门描述符的8个字节中给出中断服务程序的入口地址:16位的段选择符和32位的段内偏移地址,16位的段选择符进而给出基地址(即段地址)。为了与实模式下的中断向量表相分离,又为了与保护模式下的虚拟存储器系统和多任务相适应, IDT不再固定设置在主存储器地址的最低端。它被定义成一个特殊的段,由中断描述符表寄存器IDTR来指示IDT的内存地址。IDTR是个48位的寄存器,其值分为两部分:32位指明IDT的基地址,其余16位指明IDT的边界,即字节数。在响应中断时,通过IDTR可在内存中找到中断描述符表IDT的首地址,以中断类型号N乘以8作为对应于中断N的中断描述符表项在IDT的首地址,读取相应的门描述符。8字节门中的32位段内偏移地址装入EIP寄存器,16位的段选择符装入CS,使程序进入中断服务程序运行。
3.实模式下的中断响应和返回操作过程
中断响应的操作过程,对于可屏蔽中断、不可屏蔽中断和内部中断,是不尽相同的。
1)可屏蔽中断的响应操作
在IF位为1(即开中断)情况下,从INTR端加入中断请求信号开始,到进入中断服务程序为止所经过的一系列操作,称为可屏蔽中断的响应过程。这个响应过程包括以下操作:
(1)等待当前指令结束,然后进入中断响应周期。这就是说,在进入中断响应周期之前必须执行完当前指令。有几种特殊情况应该说明,首先,关于有前缀的指令。大家知道,指令前缀有3种:指定段寄存器前缀(如指令MOVAX,CS:VAR)、重复前缀(如指令REPMOVSB)和LOCK前缀。指令前缀汇编后是一个字节的代码,排在指令的指令码前边。应该明确的概念是,指令前缀本身不是独立的指令,只是指令的一部分,所以不允许在前缀码和指令码之间响应中断。说得更具体一点,就是响应中断时要在堆栈里保存返回地址,这个返回地址不允许是前缀码下一个字节的地址。但是对于有重复前缀的字符串操作指令,例如REPMOVSB指令,每一次传送(一个字节或一个字)之后可以响应中断,但这时保存的返回地址是REP字节的地址。这就保证了中断服务程序执行结束返回时,仍返回到这条指令,把没有完成的重复传送完成。如果不希望在重复操作期间被中断,可在这条指令前设置CLI(关中断)指令,在这条指令后设置STI(开中断)指令。其次,对于目的地址是段寄存器的MOV和POP指令(CS不允许是目的地址),本条指令之后不允许响应中断,而是还要执行一条指令结束后才能响应中断。这一操作特点可以保证在更换段地址又更换指针(如SS和SP都更换)之间不被中断(编程时应保证用MOV指令向SS置值时,相邻下条指令要向SP置值)。
(3)当前的PSW、CS和IP的内容依次压入堆栈。这就是说,保存了断点的状态和断点地址,以便返回时恢复。
(4)清除PSW中的IF位和TF位为0。清除IF位为0意味着关中断,中断服务程序中排有STI指令开中断,或者服务程序结束时返回指令IRET之后才恢复开中断状态,这一操作功能对中断管理是很有意义的。图7.6中断响应周期时序
(5)把中断服务程序的入口地址置入IP和CS,即把地址为4×n和4×n + 1两个单元的16位数作为中断服务程序入口的偏移地址置入IP,把地址为4×n + 2和4×n + 3两个单元的16位数作为服务程序的段地址置入CS。
至此,完成了可屏蔽中断的响应过程,开始进入中断服务程序。
2)不可屏蔽中断的响应过程
不可屏蔽的中断请求在NMI端加入。CPU对它的响应不受IF位的控制(但可以在外部逻辑中对加入NMI端的信号进行控制)。与可屏蔽中断一样,不可屏蔽中断也要等待当前指令执行结束。如果同时出现了不可屏蔽中断请求和可屏蔽中断请求,CPU将优先响应不可屏蔽中断请求。因为不可屏蔽中断的中断类型号为2,是微处理器硬件决定的,所以不需要从外部取回一个字节的中断类型号操作。不可屏蔽中断响应的其它操作和可屏蔽中断相同。
3)内部中断的响应操作
所有的内部中断,其中断响应操作有以下共同点:
(1)中断类型号要么是指令码给定的,要么是处理器硬件决定的,都不需要从外部逻辑输入;
(2)没有包括信号的响应周期;
(3)不受IF位的控制,但单步中断受TF位控制;
(4)除单步中断之外,其它内部中断都比外部中断优先响应。所以CPU对中断响应的优先次序是:除数为0中断、INTn和INTO指令的优先级最高,NMI次之,INTR再次,单步中断优先级最低。除上述特点外,内部中断响应也要执行可屏蔽中断响应的(3)、(4)和(5)项操作。
应该说明的是,中断响应时清除TF标志位对单步中断特别有意义。TF为1时,每执行完一条指令时引起一次单步中断,在中断服务程序中显示各寄存器的内容和状态字信息。试想,如果中断响应时不清除TF位为0,进入中断服务程序时TF位仍为1,将造成什么后果?将不停地引起中断,每次中断都只执行同一条指令而不能返回。中断响应时清除TF位为0就避免了这种现象。中断服务程序期间TF为0,到IRET指令恢复PSW值时,才恢复TF位。中断的返回,无论内部中断或外部中断,都是由中断服务程序的末尾设置IRET指令实现的。IRET指令的操作是恢复断点处的地址和PSW的内容,即依次从堆栈中弹出保存的IP、CS和PSW值,使被中断了的程序继续执行。
7.2.2外中断控制逻辑和中断控制芯片8259A
在输入输出接口技术的讨论中,讨论外部可屏蔽中断是很有意义的。因为外部设备利用中断机制与CPU交换信息,实际上就是利用外部可屏蔽中断。对于8086微处理器来说,与可屏蔽中断有关的两个引脚是INTR中断请求信号引脚,用于按受外部中断请求;INTA中断响应信号输出引脚,用于指明对中断请求的响应情况。
80286的微机系统中,用两片8259A组成了可屏蔽中断的外部控制逻辑,如图7.7所示。在第6章解释图6.4时曾经说那个南桥芯片“中断控制器(InterruptController)中集成着两个级联的8259电路支持15个中断源;还集成着另一个中断控制电路APIC(AdvancedProgrammableInterruptController),支持24个中断源。”这说明现代微机的中断控制系统仍然保留着用8259芯片实现的中断控制机制。图7.7可屏蔽中断的外部控制逻辑图7.88259引脚图表7.58259A引脚定义及功能在实际系统中,主片8259A的两个端口地址是20H和21H,从片8259A的两个端口地址是70H和71H。CAS0~CAS2是3条级联线。在级联方式时,一片8259作为主片,带动最多8片8259作为从片(每个从片的中断请求端INT与主片一条中断请求线IR相接),最多能控制64个中断级。主片的CAS0~CAS2和所有从片CAS0~CAS2相接。但这时主片的CAS0~CAS2是作为输出信号端,从片的CAS0~CAS2作为输入信号端。在响应中断请求时,主片向这3条线发出的3位代码将选定一个从片。2. 8259A的内部逻辑结构
图7.9是8259A的内部逻辑结构。图7.98259A的内部逻辑结构
(1)中断请求寄存器IRR:用来寄存有中断请求的所有中断级,每级对应一位,有中断请求时对应位置1。
(2)服务寄存器ISR:寄存正在服务的所有中断级(在执行互相嵌套的多级中断时,这些中断级都被认为是正在服务)。
(3)优先权分析器PR:把IRR内所有为1的位按优先次序规则进行分析,以确定哪一级是有请求的最高级。
(4)中断屏蔽寄存器IMR:IMR对IRR起屏蔽作用。寄存器8位对应8个中断源,哪1位写1,则该位所对应的中断请求IR被禁止;反之,写0,则该位所对应的中断请求IR被允许。表7.68259A的I/O端口地址
(6)级联缓冲器/比较器:用于多片级联及数据缓冲方式。级联方式中,主片和从片之间将3个引脚CAS0~CAS2相互连接。主片将中断申请被响应的从片的标志ID通过CAS0~CAS2送到从片,通知中断被响应。从片收到标志号后,与自身的标志号相比较,若相符,则在第2个脉冲到来时,从片将中断号送到数据总线上。
3. 8259的编程
在8259内起控制作用的逻辑部分包括许多受指令直接访问的控制位。 从编程的意义上,这些控制位被编排为7个8位寄存器,可用输入输出指令读/写。这7个寄存器可分为两组。第1组4个寄存器寄存初始化命令字ICW1~ICW4,通常是在系统加电后程序对系统初始化阶段设置的,在以后的操作中基本保持不变;第2组3个寄存器寄存操作命令字OCW1~OCW3。程序对这3个寄存器置入不同的命令字,实现对中断过程的管理。值得注意的是,这7个寄存器只占用两个I/O端口地址,由地址总线最低位A0的两个值来选址。各命令字的格式和功能将在后面讨论。
8259的编程分为两个阶段:初始化阶段和操作阶段。初始化阶段应该在系统加电或复位后由系统初始化程序完成。这阶段要用输出指令向8259置入初始化命令字。在操作阶段,要用输出指令向8259发适当的操作命令字,实现对8259的状态、中断方式和过程的控制。这期间一般不再发初始化命令字。
1)初始化编程
初始化编程阶段的任务是:①设定中断请求信号的有效形式,即是高电平有效,还是低电平向高电平跳变的上升边沿有效;②8259A是单片工作方式还是级联工作方式;③设定8259A管理的中断类型号基值,即0级中断IRQ0对应的中断类型号,以便在中断请求响应时,得到中断向量表中相应类型号的地址;④设定各级的优先排序规则;⑤设定一次中断处理结束时的结束操作规则。这些任务都是通过向8259A发初始命令字ICW实现的。
(1)初始化命令字ICW1。ICW1的格式如下:
其中,×位表示无关位,可为任何值。
LTIM:为1,表示有效的中断请求信号是高电平;为0,表示有效中断请求信号是低电平向高电平跳变的上升边。
SNGL:为1,表示这片8259是单片方式工作;为0,表示多片级联方式工作。
IC4:为1,表示在后面程序还要设置初始化命令字ICW4;为0,表示不再设置ICW4。显然,ICW1的设置完成了前面说的初始化任务的①和②。设置ICW1需要I/O地址为A0=0,对于IBMPC系列微机而言,这个I/O地址分别是020H和A0H。发送操作命令字OCW2和OCW3时也用这个I/O端口地址,发送的命令字的位4为1是ICW1的特征标志,8259在接收命令字时对位4进行判别,以确认其命令字是否是ICW1。
(2)初始化命令字ICW2。ICW2用于设置中断类型号基值。微处理器在响应外中断时,依据中断类型号获得中断向量在中断向量表内的地址,即保存中断服务子程序入口地址的地址。外中断的中断类型号是在中断响应期间由8259A提供的。但应该特别指出,8259A是依据初始化过程中用ICW2命令置入的中断类型号基值提供中断类型号的。 IRQ0对应的中断类型号称为中断类型号基值,它一定是可以被8整除的正整数。ICW2的用途就是设定这个基值,格式为:设置ICW2的地址为A0=1,对于IBMPC系列微机,I/O地址分别为21H和0A1H。
(3)初始化命令字ICW3。如果外中断控制逻辑只由一片8259A组成(设置ICW1时D1位SNGL为1),则不设置ICW3。只有在多于一片8259A组成级联控制逻辑时,无论主片还是从片设置的ICW1的D1位设置为0,并且在ICW2设置之后向A0=1地址设置的才是ICW3。对于主片和从片设置的ICW3是不同的,意义也不同。向主片设置的ICW3,指明主片的哪个或哪些输入端IR接有从片。所以ICW3是一个字节,各位分别标有为S0~S7。每一位对应一个IR输入端。设置ICW3时,那些接有从片的输入端对应的位设置为1,否则为0。在响应中断请求时,如果主片判别出是从接有从片的IR端输入的中断请求,将在CAS0~CAS2三条线上发出代表该IR端的3位代码,以便选中对应的从片。向从片设置的ICW3,其D7~D3为0,只是D2~D0位组成0~7的编码。向不同的从片设置的ICW3值是不同的,所设置的值必须与它所接的主片的IR输入端序号相同。如图7.8所示的外部中断控制逻辑只在主片的IR2一个输入端接有一个从片。该从片里设置的ICW3为2(即00000010),主片中设置的ICW3为00000100。
ICW3的设置在中断响应时能实现把合适的中断类型号送入CPU。以图7.8逻辑结构为例。当向主片上没有接从片的请求端,如IR1(即IRQ1)发有中断请求时,由于主片检测寄存于主片中的ICW3的D1位为0,表明它的IR1端没有接从片,就将信号作用下,从主片把中断类型号字节(ICW2和末3位为001组成)送入CPU,本系统为09H。当向从片的IR请求端,如从片的IR1(即IRQ9)发有中断请求时,这个请求经从片的INT发给主片的IR2。由于主片检测到寄存于主片中的ICW3的D2位为1,表明IR2端接有从片,这个请求是从该从片发来,这时CAS0~CAS2三条线上的代码为010,选定ICW3最低3位为010的从片,在信号作用下,CPU从选定从片取入中断类型号,即71H。
(4)初始化命令字ICW4。只有ICW1中的IC4位为1才能设置ICW4。ICW4的格式如下:
位7~位5总为0。
位4—SFNM,设置该位为1,将工作于特殊的全嵌套方式;该位为0,工作于正常全嵌套方式。IBMPC系统设置该位为0。位3—BUF,该位设置为1,表明缓冲方式,这时芯片的/为输出引脚,输出信号可作为数据收发缓冲器(三态门)的控制信号。该位设置为0,表明不工作于缓冲方式,不需要也不输出这种控制信号。
位2—M/S,在BUF位为1有效时,该位为1则表示该片为主片;该位为0,则为从片。位1—AEOI,规定中断结束方式。该位为1,自动结束。在CPU响应中断请求过程中,向8259发第2个脉冲时,清除中断服务寄存器中本级对应位。这就是说虽然下面就要转入这一级的中断服务子程序,但它的标志位却在转入服务子程序前就已清除了。这样当服务子程序结束返回时,不需其它任何操作。这就是所谓自动结束。设定AEOI位为0,为非自动结束方式,必须在中断服务子程序中排入输出指令,向8259发操作命令字清除相应的中断标志位,才算“中断结束”。在级联方式时,要分别向主片或从片发清除中断标志位的操作命令字。在IBMPC系统中,设定该位为0,即非自动结束方式。位0—μPM,该位为1,表示与80x86微处理器配合工作;该位为0,表示与8080或8085微处理器配合工作。显然,在IBMPC系统中,该位应设定为1。
设置ICW4的I/O端口地址和设置ICW2、ICW3、OCW1的I/O端口地址相同,都是A0=1,但由于发送初始化命令字必须遵循固定的次序,所以不会造成错误。对于图7.7中的主片,其初始化命令字的设置次序如图7.10所示。ICW1的发出作为初始化序列的开始,它是以地址A0=0(20H)和发出字节的位4为1为特征的,其它命令字的设置要么地址不是A0=0(20H),要么命令字的位4不为1。一旦ICW1被设置,以下对地址A0=1(21H)的输出指令一定设置ICW2。然后依据ICW1中的SNGL位和IC4位的值决定设置ICW3和ICW4。在初始化序列未完成之前,对A0=1(21H)地址的输出指令不可能设置操作命令字;从另一方面说,初始化序列完成后,对A0=1(21H)地址的输出指令不会被当作ICW2、ICW3或ICW4。要设置初始化命令字必须从ICW1开始。
在图7.7外部控制逻辑中,两片8259A设置的初始化命令字如下:
图7.108259初始化命令字设置次序主片:
ICW1=00010001,边沿触发,有ICW4,级联方式;
ICW2=00001000,中断类型号基值为08H;
ICW3=00000100,在IR2端接有从片;
ICW4=00000001,非数据总线缓冲方式,中断正常(非自动)结束,正常全嵌套方式。从片:
ICW1=00010001,边沿触发,有ICW4,级联方式;
ICW2=01110000,中断类型号基值为70H;
ICW3=00000010,该片的识别标志,对应主片的IR2;
ICW3=00000001,非数据总线缓冲方式,中断正常(非自动)结束,正常全嵌套方式。
2)操作编程
操作编程需要向8259A发各种操作命令字。这些命令字决定着中断方式,管理着中断响应次序等。8259A可以控制实现的中断方式有:全嵌套方式、循环优先方式、特殊的屏蔽方式和查询方式等。这些方式的实现要靠操作命令字的设置。
首先说明各操作命令字的格式和基本功能,然后讨论实现各种中断方式管理时,应如何设置操作命令字。
(1)操作命令字OCW1。OCW1用于设置屏蔽状态,命令字的各位与8259A中的中断屏蔽寄存器IMR的各位相对应,用输出指令把OCW1发送到IMR。中断屏蔽寄存器IMR中为1的位所对应的中断输入线IR处于被屏蔽状态,被屏蔽的中断请求不能使8259A的INT输出端产生有效的请求信号。
设置OCW1的I/O地址是A0=1。
OCW1格式:
1=屏蔽;0=允许
(2)操作命令字OCW2。设置OCW2的地址是A0=0,与地址相同的其它命令字的区别是OCW2和D4、D3位组合为00。操作命令字OCW2的格式:
R(Rotate):该位为1指明中断级的优行顺序是循环式的。“标准”的循环方式,是按循环的顺序每个中断级轮流成为最高优先级。如果当前级为最高级,它被服务完就变成最低级,与它相邻的高序号的级变为最高级。例如,一个0级中断在执行时被看作最高级,1级为次高级,7级为最低级。0级执行后即变为最低级,1级变为最高级,2级变为次高级。因此,所有的中断级的优行权是相等的、循环的。R位为0是固定的优先次序,0级最高,7级最低。
SL(SpecificLovel):该位指明是否要指定一个中断级。该位为1,本控制字的L2~L03位组合将指明一个中断级。至于指明这个中断级有什么意义,随R和EOI位的组合不同而不同。如果设定SL位为0,则L2~L0位无意义。
EOI(EndofInterrupt):该位为1,说明这个操作控制字的任务之一是执行结束中断的操作,用作结束中断命令;否则,该位为0,则不执行结束中断操作。结束中断操作意味着撤消正在服务的中断请求和服务标志。如果初始化时ICW4的AEOI位为1,说明设定的是自动结束中断方式,设置OCW2时EOI位自然应为0。
L2L1L0:3位编码,用来指定中断等级,该等级是为了对指定的ISR复位或执行优先级指定循环方式。该3位是和SL配合使用。
(3)操作命令字OCW3。OCW3用于管理特殊的屏蔽方式和查询方式。发送OCW3的地址是A0=0,它的特征标志为D4D3=01。OCW3的格式如下:
其中,ESMM位为特殊屏蔽方式(SpecialMaskMode)控制位。该位为1则允许特殊屏蔽方式。
SMM位为特殊屏蔽方式标志位,该位为1,表示特殊屏蔽方式;该位为0,为非特殊屏蔽方式。只有ESMM位为1,SMM位的意义才有效。如果ESMM位为0,SMM位无任何意义。
P位用于管理查询方式。P位为1,指明用查询方式,即查询决定优先级次序;P位为0,非查询方式。P位为1的OCW3可用作查询命令。下一条对同一地址(A0=0,20H)的读(IN)指令起中断识别作用。其操作是,如当时有中断请求,将识别出优先级最高的中断请求,把ISR(中断服务寄存器)的相应位置1,同时输入一个字节的信息到CPU(AL)。这个字节信息的格式如下:
其中,位7为1表示有中断请求;为0表示无中断请求。在位7为1时,W2~W0是有意义的,它们的组合指明请求服务的各中断级中的最高优先级。
RR和RIS位用于控制读出8259内部寄存器IRR和ISR的内容。如果发送的OCW3的RR、RIS位组合为10或11,则称为读寄存器命令。发送RR、RIS组合为10(P位为0)的OCW3后,对同一地址(A0=0,20H)的输入指令将读回中断请求寄存器IRR的内容到CPU(AL)。同样,如果RR和RIS组合为11的OCW3(P位为0)发送后,对同一地址的输入指令将读回中断服务寄存器ISR的内容。读寄存器命令无需每次读之前都发一次。只要发过一次,对以后的读总是起控制作用。RR和RIS位组合为00和01时无意义。
向地址A0=1发的OCW1是屏蔽字,对同一地址的输入指令将读回OCW1设置的屏蔽字。非自动方式:在这种结束方式下,在服务子程序中,通常是在返回主程序之前,用输出指令向8259A发一个中断结束命令字,即OCW2内EOI位为1,以便将该服务程序在ISR寄存器中对应位清除。非自动中断结束(EOI)有两种格式:不指定的EOI和指定的EOI,我们将结合中断级优先排序方式说明结束命令字。
第一,完全嵌套排序方式的命令字设置规则。完全嵌套排序方式的规则是:优先级次序随序号的递增而由高变低,即0级的优先级最高,7级的优先级最低;执行某中断级服务程序期间,在没有发出结束命令字之前,不能再响应本级或较低级的中断请求,但能响应较高级的中断请求。当然,这时CPU必须处于开中断状态。发送初始化命令字ICW序列后,默认的排序方式就是这种方式。也可用发操作命令字OCW2=00将8259设置为这种排序方式。在完全嵌套方式下,应通过发非指定中断级的结束命令字,即OCW2中的R、SL、EOI位组合为001,来实现中断结束操作。这种命令字的设置,将把ISR寄存器内为1的所有位中优先级最高的位置0,因为这一级一定是刚刚响应的中断级。对于IBMPC系列微机,为了结束IRQ0、IRQ1、IRQ3~IRQ7的中断操作,只需向主片(端口20H)发值为20H的OCW2;但为了结束IRQ8~IRQ15的中断操作,需向主片(端口20H)和从片(端口A0H)分别发送值为20H的OCW2。这样撤消了ISR中的正在服务的中断级标志。通常,发结束命令的指令应该排在中断服务程序的末尾,返回指令IRET之前。如果不发结束命令,服务过的中断没有撤消,就不可能再响应同级或较低级的中断请求。原则上,发出中断结束命令字的两条指令设置在中断服务程序的其它位置也是允许的。但必须注意到,这两条指令执行后,就允许同级或较低级中断发出请求并得到CPU的响应,在本级中断服务程序中间转入同级或较低级的服务子程序。仅在前面这一小段说明中,已经两次应用了OCW2。一次是发OCW2=00H,可以设置8259为完全嵌套方式;另一次是发OCW2=20H作为中断结束命令。这说明OCW2有多种功能,后面还将遇到OCW2的其它操作功能。
如果发结束命令字时,OCW2中的R、SL、EOI3位组合为011,而且L2~L03位指明一个中断级,那么命令发出后,就可清除(或撤消)一个指定级的中断标志(ISR中对应位
清0)。第二,优先级循环排序方式。通过发R、SL位组合为10的OCW2可以使8259A工作于优先级循环排序方式。这种优先级排序方式的规则是:优先级等级是轮流的,刚刚结束的中断级,例如5级,变为优先级最低级,而相邻的6级变为最高级,7级变为次高级;待6级服务后,它变为最低级,5级变为次低级,7级升为最高级,0级为次高级等等,依此类推。这种优先级排序方式也有两种中断结束方式:自动结束方式(ICW4的AEOI位为1)和非自动结束方式(ICW4的AEOI位为0)。在非自动结束方式时,结束命令字是R、SL、EOI组合为101的OCW2。这就是说,R、SL、EOI组合为100的OCW2用于设置和启动自动循环排序方式,而R、SL、EOI位组合为101的OCW2用于非指定级的中断结束并维持这种循环排序方式的命令字。每发一次这样的命令字,结束正在服务的中断并使优先关系循环移动一级。要从这种排序方式退回到完全嵌套方式,须用R、SL、EOI组合为000的OCW2命令字。第三,指定最低级的循环排序方式。要设定这种排序方式,须用R、SL、EOI位组合为110、L2~L0指定一个最低级的OCW2。这种排序方式的实质是用OCW2来改变或设定各级的优先权。它在L2~L0位指定的是最低级,例如指定5级为最低级,那么相邻级,6级为最高优先级(不是4级,这就说明仍遵照“循环”的规则)。这种排序方式建立后,用另一个OCW2来结束正在服务的中断级并指定新的最低级。这时OCW2的R、SL、EOI组合为111,L2~L0指定一个新的最低级(自然也指定了最高级)。
表7.7列出了OCW2中的R、SL、EOI3位各种组合的意义和应用。表7.7OCW2的各种格式和应用第四,特殊屏蔽的优先排序方式。对于完全嵌套的排序方式,中断服务程序正在执行期间,同级或较低级的中断请求不被响应,只有用OCW2结束命令字结束中断后,才可能改变这种情况。但是,我们可以用ESMM和SMM位组合为11的OCW3设置8259A工作于特殊的屏蔽方式。与完全嵌套的排序方式不同,在这种方式下,除用OCW1屏蔽掉的中断级和正在服务的中断级外,其它任何级的中断请求都将中断正在服务的中断(当然CPU要处于开中断状态)。不难想象,在这种排序方式下,在中断服务程序中适当地排入设置OCW1指令,就相当于赋予OCW1中没有屏蔽的中断级有更高的优先权。用这种方法可以在程序的不同阶段任意改变中断级的优先次序。第五,用查询法排序。8259A还提供一种用查询法响应与8259A相接的8级中断请求的方法。这时8259的INT线不用,或CPU内的中断开关控制触发器设定为关中断状态。目的是CPU不再响应INT线上的中断请求。在这种方式下,选择最高优先级和转入服务程序的过程是:首先发操作命令字OCW3作为查询命令。这时OCW3的P位为1,RR位和RIS位都是0。该命令字发向8259A后,8259A内的中断请求寄存器IRR内容被“冻结”。其次用输入指令IN(地址为A0=0)查询并识别当前有中断请求且优先级最高的中断级。指令执行后输入CPU(AL)的最高位为1,表示8259A的8个中断请求输入端中有的输入端已有中断请求。在最高位为1情况下,字节的最低3位给出一个中断级,这个中断级是有请求的所有中断级中优先级最高的一级。最后根据得到的优先级最高一级的序号可以计算得到服务子程序的入口地址或存放服务程序入口地址的地址。
把8259A内部寄存器内容读入CPU包括以下几种操作:第1种对地址A0=1执行IN指令,将读入设置于IMR中的OCW1,即中断屏蔽字。第2种是在发过P位为0,RR位和RIS位组合为10的OCW3读寄存器命令后,用对A0=0地址的输入指令,将读IRR寄存器的内容输入AL寄存器。第3种是在发过P位为0,RR位和RIS位组合为11的OCW3读寄存器命令后,用对A0=0地址的输入指令,将读ISR寄存器内容输入AL。
8259A还有其它的优先级排序方式和工作方式,例如特殊的全嵌套方式和级联方式,这里不一一介绍了。
如前所述,IBMPC系统中的8259A初始化程序段在ROMBIOS中,在BIOS中的时钟中断、键盘中断、磁盘中断和打印中断等几个中断服务子程序利用的都是完全嵌套(也称正常)排序方式。由于初始化时ICW4的AEOI位为0,即非自动中断结束方式,所以每个中断服务程序的末尾都有MOVAL,20H和OUT20H,AL两条指令作为结束中断命令。使用完全嵌套方式时应特别注意以下几点:①中断请求可能出现在任何时刻,但只有CPU处于开中断状态时才能响应中断请求。
②同时有多级中断请求时,先响应中断优先级高的中断请求。
③在执行某一级的中断服务程序期间,有较高级中断请求出现,则响应较高级的中断请求后,再继续本级的服务程序。7.2.3中断系统应用
中断系统是个控制机构,利用可屏蔽中断来实现输入输出传输数据,就是中断系统的重要应用。并行接口和串行接口传输数据,都可以借助中断系统来实现。中断不一定都用作数据传输的控制,例如本节将给出的时钟中断例子,其服务程序的基本任务是计时,形成时间信息。无论用于数据传输的控制,还是用于其它操作目的,在应用中断控制机构时都要完成以下几点工作:
(1)分配合适的中断级。中断请求信号必须连接到中断控制器的某个IRQ端。分配IRQ端的原则是:首先,只能利用没有被系统已有设备占用的IRQ端。其次,分配时参照外部设备实时性要求,实时性要求越高,应分配优先级较高的IRQ端。
(2)设计或选择中断请求信号产生逻辑。中断请求输入端IRQ2~IRQ7上,要加入什么形式的中断请求信号是8259A初始化时已确定的。在开发外设接口时,如果要利用中断,就要有一部分逻辑电路产生形式合适的中断请求信号。例如,一个数据输入设备,中断请求信号应该在输入设备准备好了一个数据时产生;如果是输出设备,中断请求信号应在输出设备作好接受一个数据的准备时产生。许多专门用于I/O接口设计的大规模集成电路芯片,例如后面要讲到的串行接口芯片8250等,本身都具有形成或产生中断请求信号的逻辑。
(3)为中断服务子程序分配合理的存储空间并把服务程序的入口地址置入中断向量表。
向中断向量表置入中断向量的最方便的方法是利用DOS的功能调用,即INT21H指令。入口参数设置:
AH中预置入功能号25H;
AL中预置入要设置的中断类型号n;
DS:DX中预置入中断服务程序的入口地址(两个寄存器分别置入段地址和偏移地址)。
如果按以上要求预置入口参数,指令INT21H执行后,就可把中断服务程序的入口地址置入中断向量表的适当地址中。例如,中断服务程序的入口地址标号为VINTSUB,中断类型号为10,则设置中断向量的指令序列为以下形式:
…
MOVDX,OFFSETVINTSUB
PUSHDS
MOVAX,SEGVINTSUB
MOVDS,AX
MOVAL,10
MOVAH,25H
INT21H
POPDS
…下面给出的程序是IBMPC机ROM中日时钟中断服务程序。中断请求信号源是重复频率为18.2Hz的周期性脉冲信号,是由主机板上的8254定时/计数器的0通道产生的。它把系统的4.77MHz基本时钟信号进行分频得到中断请求信号,与8259的IRQ0相接。这就是说,它占用的是外中断中的最高优先级,每隔(1/18.2)s时间发一次中断请求。
;数据段为DATA,段地址为0040H其中包括有关伪指令:这个中断服务子程序完成3部分功能:对发来的中断请求次数进行计数,从而建立当日实时时间系统;对磁盘驱动器电机转角计数器进行减1计数,当计数器减到0值时,表示预定的转角已到,使电机运转标志位清0并关闭磁盘驱动器电机;程序中用INT1CH指令提供一个出入口,用户可以利用这个出入口附加任何程序段完成自己希望的功能,当然这个功能一定是与时间参数有关的。下面就来分析这个程序。
开始列出的数据定义语句和相等伪指令语句也在BIOS程序清单的开始部分,这里只选列了与本服务程序有关的变量和常数。变量定义语句注释部分给出的变量地址是很有用的,特别是两个时间计数字TIMER_LOW和TIMER_HIGH的地址。子程序的前4条指令完成开中断和保护3个寄存器的内容。第5条CALL指令调用的子程序也在后面列出了,完成的功能是在数据段寄存器置入040H,使数据段指向0040H。
至标号T5之前的指令完成的是计时功能,其过程如图7.11的流程图所示。在存储器中开辟的两个计数字,TIMER_LOW(0040:006D、0040:006C)是时计数字,每计满一次近似为一个小时时间;TIMER_HIGH(0040:006F、0040:006E)是日计数字,每计24(18H)近似为一日。实际上,TIMER_LOW每计满一次经过的时间,略短于1小时,等TIMER_HIGH计到24时,已经积累了时间误差。为了修改这个误差,在TIMER_HIGH达24后,再让TIMER_LOW单元计到0B0H。计到此恰好是一日。每计满到一日时间,在TIMER_OFL单元置入标志1。图7.11计时程序流程图标号T5和T6之间的指令完成的操作是:磁盘驱动电机计数器单元减1,如果结果为0,使电机运行状态标志字节中的运行控制位关闭,然后向驱动器端口发控制字,使电机停转。
这里的INT1CH指令是为调用用户自己开发的程序而设置的。1CH×4=70H,从0000:0070H开始的4个存储单元被分配存放被调子程序的入口地址。系统提供的这个子程序只包括一条IRET指令,所以在执行INT1CH指令后立即返回来执行INT1CH下面一条指令。用户可以根据自己的需要重新设计一段程序取代IRET指令,那么每次时钟中断都将执行一次用户附加的这段程序。所以我们说INT1CH指令提供了一个出入口,用户可以利用这个出入口附加任何程序段完成特定的功能。当然所附加的程序段必须满足INT指令所调子程序的结构格式要求。
INT1CH下面的两条指令是向8259A发中断结束操作命令字。
最后是恢复保护的寄存器内容和返回被中断的程序。
通过时钟中断服务程序的分析,可以概括出中断服务程序通常应包括以下几部分:
(1)保护
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 剩余和回流污泥泵安全操作规程培训课件
- 便桥施工安全技术措施培训课件
- 工贸企业振动机安全操作规程培训
- 满堂脚手架搭设安全技术交底培训
- 小岩溶地段TBM施工安全交底培训课件
- 砌筑工程安全技术培训课件
- 2026年鲁菜的独特创意
- 2026年四川火锅的多种锅底比拼
- 2026年人教版六年级小升初数学仿真模拟试卷(附答案可下载)
- 2026年家庭教育指导师考试题库及答案
- 2027年中考英语【阅读理解】满分答题技巧
- 贵州省粮食储备集团有限公司招聘考试真题
- 部编版新教材道德与法治五年级上册第2课《探索中国革命道路》教学设计
- 四年级上数学学困生转化计划
- 1.【川教版】《生命 生态 安全》三年级上册 全册课件
- (高清版)JTGT 5640-2020 农村公路养护预算编制办法
- 武汉市2024届高三年级五月模拟训练(五调)英语试卷(含答案)+听力材料
- 行政伦理学教程(第四版)课件 第1章 行政伦理的基本观念
- 矿井通风与安全-金属非金属矿山
- 软件著作权合作协议
- 汽车工程系汽车构造教案
评论
0/150
提交评论