《微机原理与接口技术》辅助教学电子课件第五章中断系统5.1中断的基本概念中断处理器暂停执行现行的程序,转而处理随机事件,处理完毕后再返回被中断的程序处继续执行,这一全过程称为中断。中断源能够引发处理器中断的信息源称为中断源。常见的中断源•一般输入/输出设备,如图像管终端,打印机等。•数据通道,如磁盘、磁带等。•实时时钟,如定时器芯片8253产生的定时中断请求信号。•故障信号,如电源掉电等。•软件中断,如为调试程序而设置的中断。中断系统•系统为实现中断而采用的硬件和软件措施。•计算机采用中断系统的目的•维持系统的正常工作,提高系统效率。•实时处理。•为故障处理作准备。中断系统应具备的基本功能•对于硬设备的中断请求,要具备屏蔽和开放功能,使得程序员能灵活控制。•能实现“中断判优”,即中断源排队,当有多个中断源提出请求时,高级别的中断请求能被优先响应。•能实现中断嵌套,即高级别的中断源能够中断低级别的中断服务程序。•系统响应中断后,能自动转入中断处理中断处理结束,能自动返回。5.28086中断系统•8086系统共有256种类型的中断,对应的中断类型号为:0~255(0~0FFH)可分为软件中断和硬件中断两大类。1.8086系统的中断分类图示软件中断•由处理器执行某些指令引起的中断称为软件中断(亦称内部中断),它包括:①除法出错中断-0类型中断当除数为0或商超出了有关寄存器能表示的数值范围,则产生除法出错中断。例如movbl,0idivbl;除数=0,产生除法错中断movax,200hmovbl,1divbl;商=200H,不能用AL表达;产生除法错中断②单步中断-1类型中断•在单步标志TF=1,每执行一条指令就引起一次中断。③断点中断-3类型中断•主要用在除错调试程序中,利用INT3设置断点,目的是显示断点前程序执行结果。•当溢出标志OF=1时,执行指令INTO则产生溢出中断。④溢出中断-4类型中断例如MOVAX,2000HADDAX,7000HINTO;2000H+7000H=9000H,溢出:OF=1;因为OF=1,所以产生溢出中断•INTN是中断指令•N是中断类型号(0~0FFH)•DOS系统功能,基本输入输出系统(BIOS)的功能即是用INTN指令中断调用。⑤中断指令INTN硬件中断•由处理器外部引脚NMI和INTR引起的中断称为硬件中断(亦称为外部中断)•通过处理器的NMI(非屏蔽中断)引脚进入,NMI被响应时,自动产生2号类型中断。非屏蔽中断•它不受中断允许标志的屏蔽,微处理器无法禁止,将在当前指令执行结束予以响应;•8086的非屏蔽中断的类型号为2;•非屏蔽中断主要用于处理系统的意外或故障例如:电源调电前的数据保护存储器读写错误的处理•中断请求信号通过CPU的INTR引脚进入;•中断响应信号从INTA引脚发出;•IF=1时,CPU响应中断;IF=0,中断请求被屏蔽•通常可屏蔽中断源经过中断控制器8259A管理再向CPU发INTR请求。可屏蔽中断中断标志IF的状态•指令CLI使IF=0•关中断,禁止中断,中断屏蔽统复位,使IF=0•任何一个中断被响应,使IF=0•指令STI使IF=1•开中断、允许中断、中断开放执行,IF=12.中断处理过程中断请求过程•中断源向处理器发出请求中断信号;•中断信号将被锁存,一直保持;•直到处理器响应中断后,中断请求信号才被能清除中断过程•处理器在执行每条指令的最后一个时钟周期检测中断请求信号若发现中断请求信号有效,在允许中断的条件下,处理器响应中断。中断响应过程处理器会自动完成3项任务①关闭中断,以禁止其它中断请求;②断点(IP和CS)和标志寄存器内容入栈保护;③获得中断服务程序入口地址,转中断服务程序。中断处理过程①保护现场相关工作寄存器的内容压栈保护。②开中断若要响应高级别的中断,则需要打开中断。③执行中断服务程序④关中断使得不被中断,可顺利恢复现场。⑤恢复现场⑥将压栈保护的内容顺序出栈给相关寄存器⑥中断返回中断服务子程序的最后是一条中断返回指令IRET,执行后IRET后处理器自动从堆栈中弹出IP、CS和FLAGS的内容,返回主程序继续执行。形成中断类型号n形成中断类型号2形成中断类型号1NMIN软件中断INTRTF=1中断响应周期读中断向量号下条指令现行指令IF=1NNNNYYYYY查询中断的顺序,决定了各种中断源的优先权软件中断•除法错中断•指令中断•溢出中断非屏蔽中断可屏蔽中断单步中断高低Y还有NMITEMP=1标志寄存器入栈TEMP=TF,IF=TF=0CS:IP入栈获取中断向量执行服务程序弹出CS:IP弹出标志寄存器返回被中断程序(1)(2)(3)(4)(5)NNY(6)8086各种中断源的优先权,实际上是指被识别出来的先后;多种中断同时请求时,最先响应的则可能是单步中断或NMI中断。中断响应过程执行不可屏蔽中断执行单步中断3.中断向量①中断服务子程序所在段的段基址(2个字节)②中断服务子程序入口的偏移地址(2个字节)中断向量•中断服务子程序的入口地址亦称中断向量它由两部分组成图示中断向量表•一种类型的中断向量为4个字节,256种中断的中断向量总共占用1K字节。•在8086系统中,所有的中断向量按类型顺序存放于内存的最低地址(00000H~003FFH)的1K单元中。•存放中断向量的这1K单元称为中断向量表图示•地址=N×4~(N×4+3)•N×4字单元存放偏移地址•N×4+2的字单元存放段基址中断向量在中断向量表中的位置:•5×4~5×4+3=14H~17H的4个单元中•14H、15H单元存放中断服务子程序入口的偏移地址•16H、17H单元存放中断服务子程序入口的段基址例5.15型中断向量存放在:•21H型服务程序被放在地址为:XX:YY开始的内存区;•中断向量XX:YY存放在4×21H~4×21H+3的单元中;•处理器取出INT21H指令后,CS:IP等于下一指令(标号NEXT:)存放单元的物理地址。例5.2处理器执行INT21H指令时,中断向量的引导过程。图示处理器执行INT21H之后:•FAGS、CS、IP的当前值被压栈保护。•CPU从4×21H~4×21H+3的单元中取得中断向量并写入IP,CS之中。•CPU根据CS:IP值转向21H型中断服务程序。中断程序执行完毕,执行IRET指令,退出中断•CPU从栈顶顺序弹出保护的断点给IP、CS、FLAGS;•根据CS:IP返回断点(NEXT:),继续执行主程序。中断向量表的初始化•由基本输出入系统提供的服务程序,其中断向量是在系统加电后由基本输出入系统负责设置。•由操作系统提供的服务程序,其中断向量是在启动操作系统时由操作系统负责设置。•用户开发的中断服务程序,需要设置中断向量。设置中断向量的方法直接指令装入例5.3设置类型N的中断向量,其中断服务程序名为:INTHAND。例5.3设置中断向量,其中断服务程序名为INTHANDMOVAX,0MOVES,AX;settobaseofinterruptvectorMOVBX,N﹡4;offsetoftypeNinterruptMOVAX,OFFSETINTHANDMOVES:WORDPTR[BX],AX;setaddrofMOVAX,SEGINTHAND;INTHANDMOVES:WORDPTR[BX+2],AXINTHAND:;interruptprocessingroutineIRET用DOS系统功能调用(INT21H)设置中断向量•25H功能:设置中断向量预置:AH=25HAL=中断类型号(N)DS:DX=中断向量执行:INT21H•35H功能:取中断向量预置:AH=35HAL=中断类型号(N)执行:INT21H返回:ES:BX=中断向量例5.4使用DOS功能调用存取中断向量。MOVAL,N;typeNinterruptMOVAH,35H;getinterruptvectorINT21HPUSHES;savetheoldbaseandPUSHBX;offsetofinterruptNMOVAX,SEGINTHANDMOVDS,AX;baseofINTHANDinDSMOVDX,OFFSETINTHANDMOVAL,N;typeNMOVAH,25H;setinterruptvectorINT21HPOPDX;restoretheoldoffsetPOPDS;andbaseofinterruptMOVAL,N;typeNMOVAH,25H;setinterruptvectorINT21HRET;returninterruptprocessingroutineINTHAND:IRET例5.5实际中断程序结构。实际应用中,为了运行某个应用程序,通常采用替代原来的中断服务程序的办法。为此,应先保存原中断向量的内容,然后接管中断向量使其指向编制的新中断服务程序。最后,在应用程序终止退出前,从变量中获取原中断向量恢复到中断向量表中。具体程序如下:;堆栈段STACKSEGMENTSTACK'STACK’DW128DUP(0)STACKENDS;数据段DATASEGMENT'DATA'INT_SEGDW?;定义变量,以保存中断向量段址INT_OFFDW?;定义变量,以保存中断向量偏移量DATAENDS;代码段CODESEGMENT'CODE'ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;建立数据段址MOVDS,AXMOVAL,N;N为指定中断号MOVAH,35H;获取中断向量INT21HMOVINT_SEG,ES;保存中断向量段址MOVINT_OFF,BX;保存中断向量偏移量CLIMOVAL,N;N为指定中断号MOVAH,25H;设置中断向量MOVDX,SEGINT_PRMOVDS,DX;DS指向新中断向量段址MOVDX,OFFSETINT_PR;DX指向新中断INT21H;向量偏移量MOVAX,DATAMOVDS,AX;恢复数据段寻址STI;开中断;主程序主体(略)CLI;恢复中断向量前关中断MOVAL,N;N为指定中断号MOVAH,25H;恢复原中断向量MOVDX,INT_OFF;DX指向原中断向量偏移量MOVBX,INT_SEGMOVDS,BX;DS指向原中断向量段址INT21HSTI;开中断MOVAX,4C00H;主程序终止退出INT21H;返回DOS中断子程序INT_PRPROCFAR;新中断服务程序STI;入口处开中断PUSH…;保存用到的寄存器PUSH…中断服务程序主体(略)POP…;恢复入口寄存器POP…MOVAL,020H;发中断结束命令(EOI)OUT020H,ALIRET;中断返回INT_PRENDP;中断程序结束CODEENDS;主程序结束ENDSTART4.内部中断服务程序的编写编写内部中断服务程序与编写子程序类似•利用过程定义伪指令PROC/ENDP•第1条指令通常为开中断指令STI•最后用中断返回指令IRET•通常采用寄存器传递参数主程序需写的语句•主程序需要调用中断服务程序•调用前,需要设置中断向量•利用INTn指令调用中断服务程序例5.6内部中断服务程序•编写80H号中断服务程序•功能:显示以“0”结尾字符串的功能•利用显示器功能调用INT10H(显示一个字符)•字符串缓冲区首地址为入口参数•DS:DX(段地址:偏移地址)传递参数数据段intoffdw?intsegdw?intmsgdb‘AInstructionInterrupt!’db0dh,0ah,0例5.6以“0”结尾回车、换行保存中断向量movax,3580hint21hmovintoff,bx;保存偏移地址movintseg,es;保存段基地址例5.6获取中断向量(DOS功能调用INT21H)功能号:AH=35H入口参数:AL=中断向量号出口参数:ES:BX=中断向量(段地址:偏移地址)设置中断向量pushdsmovdx,offsetnew80hmovax,segnew80h