1、微机原理、汇编与接口技术,朱定华,7.1,7.2,7.3,中断和中断系统,中断控制器8259A,中断系统和中断指令,第七章 中断技术,7.4,实地址方式下的可屏蔽中断服务程序的设计,7.1 中断和中断系统,早期的计算机没有中断功能,CPU和外设之间的信息 交换采用的是查询方式,CPU的大部分时间都浪费在反复 查询上。这就妨碍了计算机高速性能的充分发挥,产生了 快速的CPU与慢速的外设之间的矛盾,这也是计算机在发 展过程中遇到的严重问题之一。为解决这个问题,一方面 要提高外设的工作速度;另一方面引入了中断。,所谓中断,是指计算机在正常运行的过程中,由于种种原因,使CPU暂时停止当前程序的执行,而
2、转去处理临时发生的事件(即执行中断服务程序),处理完毕后,再返回去继续执行暂停的程序。,使用中断技术,使得外部设备与CPU不再是串行工作, 而是分时操作,从而大大提高了计算机的效率。,为了实现中断功能而设置的各种硬件和软件,统称为 中断系统。,7.1.1 中断的概念,1. 中断请求引起中断的原因或发出中断申请的来源,称为中断源。当外部中断源要求CPU为它服务时,就输出一个中断请求信号加载到CPU的中断请求输入端,这就是对CPU的中断申请信号。由于每个中断源向CPU发出中断请求信号是随机的,而CPU是在现行指令周期结束时,才检测有无中断请求信号发生;故在现行指令执行期间,必须把随机输入的中断请求
3、信号锁存起来,并保持至CPU响应后才可以清除。因此,每一个中断源都设置有一个中断请求触发器来记载它的中断申请信号。,7.1.2 中断请求与控制和中断源的识别,2. 中断源识别 当系统有多个外部中断源时,一旦发生中断,CPU必须确定是哪一个中断源。识别的方法:每个中断源都有一条中断请求信号线,且固定其中断服务程序的入口地址,CPU根据中断信号线,就可以进入相应的中断服务程序;向量中断,使用向量中断系统的中断源除了能输出中断请求信号外,还能输出一个中断向量,CPU根据这个中断向量能够获得该中断源的中断服务程序的入口地址。 80x86 CPU采用向量中断,并把中断向量称作中断类型码。系统为每一个中断
4、源指定一个中断类型码,中断源在其中断请求被CPU响应后,将它的中断类型码送到数据线上;与此同时,CPU将数据线上的中断类型码读入,根据中断类型码能够进入该中断源的中断服务程序。,7.1.2 中断请求与控制和中断源的识别,7.1.2 中断请求与控制和中断源的识别,3. 中断控制对外部中断源的中断有两级控制:中断屏蔽和中断允许。在每一个外部中断源的中断请求电路中,增加一个中断屏蔽触发器,将中断源输出的中断请求信号与中断触发器的输出相与后再作为该中断源的中断请求信号。中断屏蔽触发器的状态就控制了外部中断源的中断请求是否被送至CPU。CPU内部有一个中断允许触发器,只有当其允许中断(即开中断)时,CP
5、U才能响应中断;若不允许中断(即关中断)时,即使CPU的中断请求线上有中断请求,CPU也不响应。80x86的中断允许触发器是由其标志寄存器的中断标志位IF来控制的,中断标志位的状态可由STI和CLI指令来改变。,1.实现中断及返回。,当某一中断源发出中断申请时,CPU能决定是否响应这个中断请求。当CPU在执行更紧急、更重要的工作时,可以暂不响应中断;若允许响应这个中断请求,CPU必须在现行的指令执行完后,把断点处的(E)IP和CS值(即下一条应执行的指令的地址),各个寄存器的内容和标志位的状态,推入堆栈保留下来(称为保护断点和现场),然后才能转入中断源的服务程序 。当中断处理完后,再恢复被保留
6、下来的各个寄存器和标志位的状态(称为恢复现场) ,使CPU返回被中断的程序 。,7.1.3 中断系统的功能,2.实现优先权排队。,通常,在系统中有多个中断源,会出现两个或多个中断源同时提出中断请求的情况,这样就必须要设计者事先根据轻重缓急给每个中断源确定一个中断级别,即优先权。当多个中断源同时发出中断申请时,CPU能找到优先权级别最高的中断源,响应它的中断请求;在优先权级别高的中断源处理完了以后,再响应级别较低的中断源。,7.1.3 中断系统的功能,3.高级中断源能中断低级的中断处理。,当CPU响应某一中断请求,在进行中断处理时若有优 先权级别更高的中断源发出中断申请,则CPU要能中断正 在进
7、行的中断服务程序,保留这个程序的断点和现场(类 似于子程序嵌套),响应高级中断,在高级中断处理完以 后,再继续执行被中断的中断服务程序。而当发出新的中断申请的中断源的优先级别与正在处 理的中断源同级或更低时,CPU就先不响应这个中断申请, 直至正在处理的中断服务程序执行完以后才去响应这个新 的中断申请。,7.1.3 中断系统的功能,CPU在现行指令结束后响应中断,CPU就响应中断, 转入中断响应周期。中断响应及中断过程如下:,(1) 关中断。,(2) 保留断点。,(3)给出中断入口地址,转入相应的中断服务程序。,(4)保护现场。,(5) 执行中断服务程序。,(7) 中断返回。,7.1.4 CP
8、U对外部可屏蔽中断的响应及中断过程,(6)恢复现场。,关中断:在CPU响应中断后,发出中断响应信号的同时,内 部自动地关中断。,保留断点:CPU响应中断后把IP和CS推入堆栈保存,以备中断 处理完毕后,能返回被中断程序。,7.1.4 CPU对中断的响应及中断过程,保护现场:为了使中断处理程序不影响被中断程序的运行,故 要把断点处的有关的各个寄存器的内容和标志位的状态, 推入堆栈保护起来。80x86 是由软件(即在中断服务程序 中)把要用到的寄存器的内容用PUSH指令推入堆栈,而标 志位的状态是在保留断点的同时由硬件推入堆栈的。,7.1.4 CPU对中断的响应及中断过程,给出中断入口地址,转入相
9、应的中断服务程序:80x86是根据中断源提供的中断类型码读取中断向量表或中断描述符表得到中断服务程序入口地址的。,恢复现场:把所保存的各个内部寄存器的内容和标志位的状态, 从堆栈弹出,送回 CPU中的原来位置。这个操作是用POP 指令来完成的。80x86的标志位的状态由硬件恢复。,7.1.4 CPU对中断的响应及中断过程,中断返回:在中断服务程序的最后要安排一条中断返回指令,将 堆栈内保存的(E)IP和CS值弹出,运行就转移到被中断程序。80x86的中断返回指令还将堆栈内保存的标志状态弹出给标志寄存器,使系统恢复中断前的状态。,7.1.4 CPU对中断的响应及中断过程,7.1,7.3,中断和中
10、断系统,中断控制器8259A,中断系统和中断指令,第七章 中断技术,7.4,实地址方式下的可屏蔽中断服务程序的设计,7.2,Intel8259A是8080/8085以及80x86的可编程的中断控制器,80x86是通过它来管理中断的。它具有8级优先权控制,通过级联可扩展至64级优先 权控制。每一级中断都可以屏蔽或允许。在中断响应周期,8259A可提供相应的中断类型码,从而能迅速地转至中断服务程序。,7.2 中断控制器8259A,8259A的内部组成如下图,7.2.1 8259的组成和接口信号,(1) 在中断请求输入端IR7IR0上接受中断请求。,(2) 中断请求锁存在IRR中,并与IMR相“与”
11、,将未屏 蔽的中断送给优先级判定电路。,(3) 优先级判定电路检出优先级最高的中断请求位,并 置位该位的ISR。,(4) 控制逻辑接受中断请求,输出INT信号。,7.2.2 8259A处理中断的过程,(5) CPU接受INT信号,进入连续两个中断响应周期。,单片使用或是由CAS2CAS0选择的从片8259A,就在 第2个中断响应周期,将中断类型向量从D7D0线输出;如果是作主片使用的8259A,则在第1个中断响应周 期,把级联地址从CAS2CAS0送出。,(6) CPU读取中断向量,转移到相应的中断处理程序。,(7) 中断的结束是通过向8259A送一条EOI(中断结束)命 令,使ISR复位来实
12、现的。在中断服务过程中,在EOI命令 使ISR复位之前,不再接受由ISR置位的中断请求。,7.2.2 8259处理中断的过程,8259A单片使用如图所示,7.2.3 8259A的级联连接,在IR7IR0上输入中断请求,INT和与CPU相连接。这时,中断请求输入共计有IR0IR7,共8个级别。,8259A级联连接如右图。,7.2.3 8259A的级联连接,8259A的命令字包括初始设定的初始化命令字ICW和操作过程中给出的操作命令字OCW。,7.2.4 8259A的命令字,初始化命令字ICW包括ICW1ICW44个命令字,用于设定8259A的工作方式、中断类型码等。对于80x86 CPU,ICW
13、命令字设置过程如下图所示。,7.2.4 8259A的命令字,LTIM:1为电平触发中断,0为边沿触发中断;,SNGL:1为单独使用,0为级连使用;,IC4:1为设置IC4,0为不设置IC4 ;,T7T3:中断类型码高5位(低3位为IR7IR0编码后的值);,ID2ID0:从片的识别地址(存放IR7IR0编码后的值),从片使用;,S7S0:主片的IR7IR0上连接从片8259A时,相对应的位为1,主片使用;,SFNM:1为特殊全嵌套方式,0为全嵌套方式;,AEOI:1为自动结束中断方式,0为非自动结束中断方式;,BUF:1为缓冲方式,0为非缓冲方式;,M/S:1为主片,0为从片。,例7.1 试按
14、照如下要求对8259A设置初始化命令字:系统中仅 用一片8259A,中断请求信号采用边沿触发方式;中断类型 码为08H0FH;用全嵌套、缓冲、非自动结束中断方式。8259A的端口地址为20H和21H。该片8259A的初始化设置的程序段如下:,MOV AL,13H ;ICW1:边沿触发,单片,设置IC4OUT 20H,ALMOV AL, 8 ;ICW2:中断类型码为8FHOUT 21H, ALMOV AL, 0DH ;ICW4:全嵌套、缓冲、非自动结束中断方式OUT 21H, AL,例7.2 试对一个主从式8259A进行初始化命令字的设置。从片的 INT与主片的IR2相连。从片的中断类型码为70
15、H77H,端口地 址为A0H和A1H;主片的中断类型码为08H0FH,端口地址为 20H和21H。中断请求信号采用边沿触发,采用全嵌套、缓冲、 非自动结束中断方式。,主片初始化程序段:MOV AL, 11H ; ICW1OUT 20H, ALMOV AL, 8 ;ICW2 :中断类型码为08H0FHOUT 21H, ALMOV AL, 4 ; ICW3: IR2上连接从片OUT 21H, AL MOV AL, 0DH ; ICW4OUT 21H, AL,从片初始化程序段:MOV AL, 11HOUT 0A0H, ALMOV AL, 70H ; ICW2: 中断类型码为70H77HOUT 0A1
16、H, ALMOV AL, 2 ;ICW3:从片的识别地址,即主片的IR2OUT 0A1H, ALMOV AL, 9OUT 0A1H, AL,80x86 PC在上电初始化期间,BIOS已设定8259A的 初始化命令字,用户不必设定。,操作命令字OCW是操作过程中给出的命令,初始设定 结束后的命令字都是OCW。OCW包括 OCW1OCW3 3个命令 字,如下图所示。,7.2.4 8259A的命令字,OCW1是对IMR置位、复位的命令,置位位对应的中断被 屏蔽。以A0=1读/写OCW1命令字,即读/写IMR。,OCW2是中断结束(EOI)的命令字,用于复位ISR及改变优 先级。以A0=0写OCW2命
17、令字。EOI 命令有2个,一个是一般 EOI,对正在服务的ISR复位,其命令字是20H。另一个是指 定EOI,对L2L0指定的ISR复位,对8259A的IR7IR0对应 的ISR复位的命令字分别是67H60H。,OCW3是读ISR和IRR以及指定设置特殊屏蔽方式的命令。 以A0=0进行写入,由 D4D3 两位特征位来区别,00为OCW2, 01为OCW3(注意,只要命令字的D4位为“1”,地址位A0为 “0”,就是ICW1命令字。所以,特征位若为1则是ICW1)。 以A0=0来读ISR和IRR及中断状态。,在通常方式的中断服务过程中,ISR设置期间对优先级 更低的中断请求不响应。特殊屏蔽方式是
18、可以解除这种禁止中断状态的方式。在这种方式时,除了由ISR设置的位和由IMR 屏蔽的位 对应的中断外,其它所有级别的中断均可响应。,7.1,7.2,中断和中断系统,中断控制器8259A,中断系统和中断指令,第七章 中断技术,7.4,实地址方式下的可屏蔽中断服务程序的设计,7.3,它可以处理256种不同类型的中断,其中每一种中断都 规定了一个唯一的中断类型编码,即中断向量。CPU根据中断类型编码来识别中断源。80x86有两类中断:内部(软件)中断,即由指令的执行所引起的中断;外部(硬件)中断,即由外部(主要是外设)的请求引起 的中断。,PC机中断系统的功能极强,其结构简单而且灵活。,7.3 中断
19、系统和中断指令,80x86设置的中断指令和中断返回指令如下:指定类型中断指令 INT N溢出中断指令 INTO中断返回指令 IRET /IRETD,当程序需要转移到某一指定的中断服务程序时,可 以设置一条中断指令,使程序转移到所指定的中断服务 程序,通过中断指令实现的中断称为软件中断。,7.3.1 中断指令,(1) INT N指令中断类型N中断。 这条指令的执行引起中断,而且中断类型由指令中的N加以指定。,(2) INTO指令中断类型4中断。 若上一条指令执行的结果,使溢出标志位OF=1,则INTO指令引起类型为4的内部中断。否则,此指令不起作用,程序执行下一条指令。,IRET是中断返回指令,
20、它的作用与RET指令类似,都是使控制返回主程序。但是IRET是远返回,且除了从堆栈中弹出偏移地址(给IP)和段地址(给CS)外,还弹出中断时进栈保护的标志寄存器的内容(给F)。IRETD是32位的中断返回指令,它的作用与IRET指令类似,不同的仅是从堆栈中弹出的偏移地址是给EIP。,7.3.1 中断指令,80x86微处理器芯片均有两条外部中断请求线:NMI(non maskable interrupt 非屏蔽中断)INTR(可屏蔽中断)。,7.3.2 外部中断,出现在INTR线上的中断请求,CPU 是否响应要取决于 标志位IF的状态:若IF=1,则CPU就响应,此时CPU是处在开中断状态;若I
21、F=0,则CPU就不响应,此时CPU是处在关中断状态。而IF标志位的状态,可以用指令STI使其置位,即开 中断;也可以用CLI指令来使其复位,即关中断。,7.3.2 外部中断,要注意:在系统复位以后,标志位IF=0;另外,任一种中断(内部中断、NMI、INTR)被响应后, IF=0。所以,若允许中断嵌套,就必须在中断服务程序中用 STI指令开中断。,7.3.2 外部中断,CPU是在当前指令周期的最后一个T状态采样中断请求 线,若发现有可屏蔽中断请求,且中断是开放的(IF标志为 “1”),则CPU转入中断响应周期。80x86 CPU进入两个连 续的中断响应周期,每个响应周期都由4个T状态组成,而
22、 且都发出有效的中断响应信号。请求中断的外设,必须在 第二个中断响应周期的T3状态,把中断向量(类型码)送到 数据总线(通常通过8259A传送)CPU在T4状态的前沿采样数 据总线,获取中断向量,接着就进入了中断处理程序。,7.3.2 外部中断,出现在NMI线上的中断请求,不受标志位IF的影响,在当前指令执行完以后,CPU就响应。NMI线上的中断请求信号是边沿触发的,它的出现是异步的,由内部把它锁存。要求NMI上的中断请求脉冲的有效宽度(高电平的持续时间)要大于两个时钟周期。,7.3.2 外部中断,非屏蔽中断的优先权高于可屏蔽中断。CPU采样到有非屏蔽中断请求时,自动给出中断向量类型码2,而不
23、经过上述的可屏蔽中断那样的中断响应周期。,NMI、INTR这两条中断请求线是远不能满足实际需要的。80x86微处理器用 8259A作为外设向CPU申请中断和CPU对中断进行各种控制的接口,它把80x86的一条可屏蔽中断线INTR扩展成864条中断请求线。,7.3.2 外部中断,对于某些重要的中断事件,CPU通过自己的内部逻 辑,调用相应的中断服务程序,而不是由外部的中断请 求来调用。这种由CPU自己启动的中断处理过程,称为内部中断。,内部中断有如下3类:,7.3.3 内部中断,故障是指某条指令在启动之后,真正执行之前,就被检测到异常而产生的一种中断。出现故障时,CPU将产生异常操作指令的地址保
24、存到堆栈中,然后进入故障处理程序并排除该故障,从故障处理程序返回后,再执行曾经产生异常的指令,使程序正常地继续执行下去。,7.3.3 内部中断,陷阱是在指令执行过程中引起的中断。这类异常主要是由执行除法指令或中断调用指令(INT N)引起的设置陷阱指令的下一条指令的地址就是断点。出现陷阱中断时,把(E)IP和CS即断点推入堆栈保存后就进入该陷阱处理程序。陷阱中断处理完后,返回到该断点处继续执行,7.3.3 内部中断,异常中止通常是由硬件错误或非法的系统调用引起的。一般无法确定造成异常指令的准确位置,程序无法继续执行,系统也无法恢复原操作,必须重新启动系统,7.3.3 内部中断,7.3.4 中断
25、类型码及中断种类,7.3.5 中断向量表和中断描述符表,中断向量表中前5个中断向量(或中断类型)由Intel专用,系统又保留了若干个中断向量,余下的就可以由用户用,可作为外部中断源的向量。,外部中断源,只要先将中断服务程序的入口地址填入中断向量表,在第二个中断响应周期,向数据总线送出一个字节的中断类型码N,即可以转至该中断源的中断服务程序。,例7.3 若80x86系统采用的8259A的中断类型码为88H,试问:这个中断源的中断请求信号应连向8259A的哪个中断输 入端?中断服务程序的段地址和偏移地址应分别填入哪两个 字单元?,根据 ICW2可知,中断类型码的低3位即是8259A IRi 的i值
26、,而88H的低3位为000,故中断源的中断请求信号连 接到8259A的IR0输入端。中断服务程序的偏移地址和段地址分别填入4n和4n+2 两个字单元,而488H=220H,故段地址填入00222H字单元 (即00222H和00223H两个字节单元),偏移地址填入00220H 字单元(即00220H和00221H两个字节单元)。,7.3.5 中断向量表和中断描述符表,在保护方式下,为每一个中断定义了一个中断描述符来说明中断服务程序的入口地址和属性。所有的中断描述符都集中存放在中断描述符表中,由中断描述符表取代了实地址方式下的中断向量表,中断描述符包含3个内容,一是描述符索引DI,由此可以获得段基
27、址等;二是32位的偏移地址;三是相关段的参数,这些参数指示引起中断的原因属于哪一类。,80x86对各种中断的响应和处理过程是不相同的,其主 要区别在于如何获取相应的中断类型码(向量)。,对于硬件(外部)中断,CPU是在当前指令周期的最后一个 T状态采样中断请求输入信号。如果有可屏蔽中断请求,且 CPU处在开中断状态(IF标志 为1),则CPU转入两个连续的中断响应周期,在第二个中断响应 周期的T4状态前沿,读取数据线获取由外设输入的中断类型码。若是非屏蔽中断请求,则CPU不经过上述的两个中断响应 周期,而在内部自动产生中断类型码2。,7.3.6 中断响应和处理过程,80x86 CPU在响应中断
28、请求后,由硬件自动完成如下操作:,获取中断类型码,生成中断向量表或中断描述符表 的位移量,(2) 把CPU的标志寄存器进栈,保护各个标志位,(3) 清除IF和TF标志,屏蔽INTR中断和单步中断;,(4) 保存被中断程序的断点推入堆栈保护;,(5) 从中断向量表或中断描述符表获取中断服务程序的 入口地址,进入被响应中断的中断服务程序,7.3.6 中断响应和处理过程,中断响应过程:,7.3.6 中断响应和处理过程,7.1,7.3,中断和中断系统,中断控制器8259A,中断系统和中断指令,第七章 中断技术,7.2,实地址方式下的可屏蔽中断服务程序的设计,7.4,外部设备的中断请求信号是由中断控制器
29、8259A转发 给CPU的,转发过程为:外部设备的中断请求信号由8259A的中断输入线 IR7IR0进入8259A的中断请求寄存器IRR寄存,经过8259A 的优先权分析器和中断屏蔽寄存器的分析处理,由8259A的中 断输出线INT输出给80x86的INTR线,向80x86 CPU申请中断。CPU响应中断后,向8259A发回中断响应信号 并读取 8259A送出的中断类型码。,7.4 实地址方式下的可屏蔽中断服务程序的设计,所以 80x86 PC机的可屏蔽中断服务程序的设计主要 有两个方面。第一、根据8259A中断输入线对应的中断类型码,将 中断服务程序的入口地址填入中断向量表;第二、向8259
30、A写入操作命令字(初始化命令字系统 已设置),对中断屏蔽与中断结束进行处理。,7.4 实地址方式下的可屏蔽中断服务程序的设计,根据中断类型码将其中断服务程序入口地址装入中断 向量表中,有直接装入和调用系统功能调用装入两种方法。,下面以PC XT机为例说明装入的方法:PC XT 微机系统仅使用1片8259A,它的8个中断输入端 IR0IR7分别定义为IRQ0IRQ7。PC XT机留给用户使用的可屏蔽中断为IRQ2,从其总线 插座的B4引出。PC XT机初始化8259A时写入的中断类型码为08H0FH, 分别对应IRQ0IRQ7,所以IRQ2的中断类型码为0AH。,7.4.1 中断服务程序入口地址
31、的装入,假定中断服务程序为INT-SUB,直接装入程序段为:SUB AX,AXMOV ES,AX ;中断向量表的段地址为0MOV AX,OFFSET INT-SUBMOV ES:28H,AX ;IRQ2的中断类型码为0AH,MOV AX,SEG INT-SUB ;0AH4=28HMOV ES:2AH,AX,7.4.1 中断服务程序入口地址的装入,功能调用号为25H;入口参数为AL置中断类型码, DS:DX置入口地址。 装入程序段如下:MOV AX,SEG INT-SUBMOV DS,AXMOV DX,OFFSET INT-SUBMOV AX,250AHINT 21H,7.4.1 中断服务程序入
32、口地址的装入,8259A内有一个中断屏蔽寄存器IMR,它的每一位对应 着一个中断输入线,即Mi与IRi对应。当Mi1就屏蔽对应的IRi,禁止它的输入信号产生中 断输出信号INT,Mi0则允许对应的IRi 的中断输入信号产生中断输 出信号INT,向CPU申请中断。,7.4.2 中断屏蔽与中断结束的处理,80x86 PC机为了系统的工作稳定,在初始化8259A即送 完ICW后,写入了中断屏蔽操作控制字OCW1,将它自身没有 用的8259A 的中断输入线全部屏蔽。,因此在中断前后要修改80x86 PC机系统设置的中断屏 蔽字,中断后应恢复系统原来设置的中断屏蔽字。,修改和恢复的方法是用奇地址读取中断
33、屏蔽寄存器IMR 的内容,将所用的中断输入线IRi的对应位Mi置0(修改) 或者置(恢复)后,再用奇地址写入中断屏蔽寄存器。,修改和恢复时,不要改变IMR其他位的状态,故只能用 与操作置0,用或操作置1。,例7.4 时钟程序,该程序将IMB PC XT机转变成一台式时钟,显示格式为 HH:MM:SS。启动程序后,提示用户输入当前的时间,键 入的格式与显示格式相同,即时、分、秒三者间要用“:” 分隔。,本程序使用系统的时钟18.2Hz,即8253计数器0的输出, 因此每秒钟会发生18次IRQ0中断,中断类型码为8。修改中 断向量表,使该中断服务程序TIMER得到该类中断的控制权。 该中断服务程序
34、使用一软件计数器,其计数值保存在字节变 量COUNT中,其初值为18,每中断一次其值减1,当该变量的 值减为0时,再将其置为18,并调整一次时钟。,7.4.3 中断服务程序设计举例,其程序如下:,stack segment stack stackdw 32 dup(0) stack ends data segment COUNT DB 18 ECT DB ENTER CURRENT TIEM:$ BUFFER DB 9,0 TENHO DB 0 HOUR DB 0: TENMIN DB 0 MINUTE DB 0: TENSEC DW 0 SECOND DB 0,0DH,$ STORE DW
35、0,0 data ends code segment main proc farassume cs:code,ds:data,ss:stackpush dsmov ax,0push axMOV ES,AXmov ax,datamov ds,ax,MOV DI,OFFSET STORE ;保存系统时钟的中断服务程序MOV AX,ES:20H ;入口地址MOV DI,AXINC DIINC DIMOV AX,ES:22HMOV DI,AXMOV DX,OFFSET ECT ;显示“ENTER CURRENT TIME:”MOV AH,9INT 21HMOV DX,OFFSET BUFFER ;键入
36、当前时间MOV AH,0AHINT 21HMOV BH,70H ;清屏(显示器的软中断服务程序)MOV CH,0MOV CL,0MOV DH,24MOV DL,79MOV AL,0MOV AH,7INT 10HMOV DI,20H ;中断程序入口地址送中断向量表MOV AX,OFFSET TIMERXMOV DI,AXINC DIINC DI,MOV AX,CSMOV DI,AX FOREVE:MOV AH,2 ;置光标位置(显示器的软中断服务程序)MOV BH,0 MOV DH,12MOV DL,24INT 10HMOV AH,9 ;显示时:分:秒MOV DX,OFFSET TENHOINT
37、 21HMOV AL,SECOND ;等待1秒钟HERE:CMP AL,SECONDJE HERE MOV AH,0BH ;检查键盘,若有键入则返回INT 21H INC ALJNZ FOREVEMOV DI,20H ;恢复系统时钟的中断向量表MOV AX,STORE MOV DI,AXINC DIINC DI MOV AX,STORE+2MOV DI,AXret main endp,TIMERX PROC FARDEC COUNT ;软件计数器减1JNZ TIMER ;不到1秒,退出中断MOV COUNT,18 ;已到1秒,恢复软件计数器INC SECOND ;秒加1CMP SECOND,9
38、 ;十秒位是否增1?JLE TIMER ;否,退出中断MOV SECOND,0 ;秒位置0INC TENSEC ;十秒位加1CMP TENSEC,6 ;满1分否?JL TIMER ;否,退回中断MOV TENSEC,0 ;满,分加1INC MINUTECMP MINUTE,9JLE TIMERMOV MINUTE,0INC TENMINCMP TENMIN,6 ;是否满1小时? JL TIMERMOV TENMIN,0 ;满,小时加1INC HOUR,CMP HOUR,9JA ADJHOCMP HOUR,3JNZ TIMERCMP TENHO,1JNZ TIMERMOV HOUR,1MOV T
39、ENHO,0JMP TIMERADJHO:INC TENHOMOV HOUR,0TIMER:MOV AL,20H ;中断结束命令OUT 20H,ALIRETTIMERX ENDPcode endsend main,例7.5 由PC XT机外部产生中断请求的简单中断程序。,系统将8259A的中断输入线IR0IR7初始化为由低变高 的边沿触发,通过一开关(单稳、防抖)将中断请求信号接到 PC XT总线的引脚B4,即IRQ2上。该开关先输出低电平,运 行程序显示提示信息“WAIT INTERRUPT”后再将开关输出高 电平,使IRQ2的电平由低变高,于是向8259A的中断输入线 发出了中断请求信号。
40、成功后再将开关返回到低电平。,该程序可以用到任何可以产生中断请求信号的外设接 口的电路上。,如前所述,PC XT机已对8259A进行了初始化操作,故 只需进行操作命令字的设定,8259A的端口地址为20H和21H。 要使用的命令字有屏蔽字OCW1和中断结束命令字OCW2。程序中用JMP $ 指令来等待中断,若程序中不改变屏 蔽字开放IRQ2中断,则扳动开关后,程序总处于等待状态, 不进入中断。因为JMP $ 指令执行之后才响应中断,所以响应中断 时进入堆栈保护的断点地址仍是JMP $ 指令的地址。故中 断返回前应修改返回地址,以便返回后跳过该指令,执行 JMP $ 指令的下一条指令。JMP $
41、 指令是近跳转的2字节指令 (指令的机器码为 EBFEH),故修改返址是将返回地址加2。,其程序如下:,stack segment stack stackdw 32 dup(0)stack endsdata segmentDA1 DB WAIT INTERRUPT,0AH,0DH,$DA2 DB INTERRUPT PROCESSING,0AH,0DH,$DA3 DB PROGRAM TERMINATED NORMALLY,0AH,0DH,$data endscode segmentbegin proc farassume ss:stack,cs:code,ds:datapush dssub
42、ax,axpush axMOV AX,SEG IRQ2IS ;中断程序入口地址送中断MOV DS,AX ;向量表MOV DX,OFFSET IRQ2ISMOV AX,250AH,INT 21Hmov ax,datamov ds,axMOV DX,OFFSET DA1MOV AH,9INT 21HIN AL,21H ;读屏蔽字AND AL,0FBH ;改变屏蔽字,允许IRQ2中断OUT 21H,ALJMP $ ;等中断JMP $=HERE: JMP HEREMOV DX,OFFSET DA3MOV AH,9INT 21HRETIRQ2IS:MOV DX,OFFSET DA2MOV AH,9INT
43、 21HMOV AL,20H ;一般中断结束命令OUT 20H,AL,IN AL,21H ;恢复屏蔽字,禁止IRQ2中断OR AL,04HOUT 21H,ALPOP AX ;修改返址INC AXINC AXPUSH AXIRET begin endp code endsend begin,例7.6 80x86微型机的外部中断程序。,片8259A的级联连接如下图所示。片8259A中,主 片的端口地址和中断类型码与XT微机系统相同,分别为20H、 21H和08H0FH;从片的端口地址为A0H和A1H,中断类型码 为70H77H。在ISA总线B4引脚上连接的是IRQ9。,stack segment
44、stack stackdw 32 dup(0) stack ends data segment DA1 DB WAIT INTERRUPT,0AH,0DH,$ DA2 DB INTERRUPT PROCESSING,0AH,0DH,$ DA3 DB PROGRAM TERMINATED NORMALLY,0AH,0DH,$ data ends code segment begin proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axMOV ES,AXmov ax,datamov ds,axMOV AX,SEG IRQ9IS
45、 ;中断服务程序入口地址送中断向量表MOV ES:1C6H,AX,在286、386、486、Pentium PC机上与XT机(例7.5)上相同功能的程序如下:,MOV AX,OFFSET IRQ9ISMOV ES:1C4H,AXMOV DX,OFFSET DA1MOV AH,9INT 21HIN AL,0A1H ;读屏蔽字AND AL,0FDH ;改变屏蔽字,允许IRQ9中断OUT 0A1H,ALJMP $ ;等中断(请见例7.5的说明)MOV DX,OFFSET DA3MOV AH,9INT 21Hret IRQ9IS: MOV DX,OFFSET DA2MOV AH,9INT 21HMOV AL,61 H ;指定中断结束命令OUT 0A0H, ALMOV AL,62HOUT 20H,AL,IN AL,0A1H ;恢复屏蔽字,禁止IRQ9中断OR AL,2OUT 0A1H,ALPOP AX ;修改返址INC AXINC AXPUSH AXIRET begin endp code endsend begin,