1、中断服务程序的编程,中断入口,保护现场,为中断源服务部分,发中断结束命令,恢复现场,中断返回,主程序编程,6.5中断程序设计,等待中断,串指令装入法伪指令装入法DOS调用法直接装入法,一、中断向量表的建立方法,8088的中断向量表,利用STOSW指令将中服的段基址和偏移地址送入中断向量表。STOSW: (AX)ES:DI,根据DF修改DI例:设中断类型码为n,中服名称为INT_SEV,1、串指令装入法,CLI ;关中断MOV AX,0MOV ES,AX ;置附加段基地址为0MOV DI, n*4 ;置附加段偏移地址到DIMOV AX,OFFSET INT_SEV;置中断程序首地址的 ;偏移量到
2、AXCLDSTOSW ;填偏移量到中断地址表MOV AX, SEG INT_SEV ;置中断程序的段基地址到AXSTOSW ;填段基地址到中断地址表STI ;开中断,2、伪指令装入法,例:设中断类型码为n,中服名称为INT_SEV,INT_TAB SEGMENT AT 0 ORG n*4 DW OFFSET INT _SEV DW SEG INT_SEVINT_TAB ENDS,使用DOS功能调用的25H功能,从而将中服的入口地址置入中断向量表。要求:AL中断类型号DS:DX中断服务程序首地址的段、偏移地址,3、DOS调用法,PUSH DSMOV AX,SEG INT_SEV ;段基地址送DS
3、MOV DS,AXMOV DX,OFFSET INT_SEV ;偏移地址送DXMOV AL,60H;中断类型号送AL MOV AH,25H ;(AH)功能号INT 21H;功能调用 POP DS,注意:在PC机系统初始化时,有一部分中断例程已驻留在内存中。一般情况下,用户不应改变系统对这些中断的设置。可借用:程序中进行中断矢量的替换。,3、DOS调用法(续),例:假设借用DOS系统的0CH中断,用户系统的中服入口地址为newint,则相应程序如下:,;数据段:设置内存缓冲区,用于暂存 DOS的中断矢量 intoffdw ? intsegdw ? ;主程序mov ax,350ch ;取出DOS的
4、中断矢量, int 21h ;并送ES:BX mov intoff,bx ;保存DOS的中断矢量 mov intseg,es,获取中断向量(DOS功能调用INT 21H)功能号:AH35H入口参数:AL中断向量号出口参数:ES:BX中断向量(段地址:偏移地址),设置中断向量,push ds ;保护DSmov dx,offset newint ;将DOS中断矢量用mov ax,seg newint ;用户中断矢量取代mov ds,axmov ax,250chint 21hpop ds ;恢复DOSsti ;开中断,设置中断向量(DOS功能调用INT 21H)功能号:AH25H入口参数:AL中断向
5、量号DS:DX中断向量(段地址:偏移地址),恢复原中断矢量,cli ;关中断 push ds ;保护DS mov dx,intoff ;恢复DOS的中断矢量 mov ax,intseg mov ds,ax mov ax,250ch int 21h pop ds ;恢复DS sti ;开中断,若外设的中断类型号为6BH,设中断服务程序段地址是1000H,偏移地址为2000H则此中断类型号对应的中断矢量表地址为从00lACH开始的四个存储单元。,4、直接装入法,MOV AX,0 MOV DS,AX ;置数据段段基地址为0 MOVAX,2000H MOV WORD PTR 01ACH, AX ;对偏
6、移地址为01ACH的单元MOV AX,1000H ;送双字MOV WORD PTR 01ACH+2, AX ;对01AEH的单元送双字,二、 中断程序设计,编写内部中断服务程序与编写子程序类似主程序需要调用中断服务程序调用前,需要设置中断向量利用INT n指令调用中断服务程序,例1. 内部中断服务程序,编写80H号中断服务程序功能:显示以“0”结尾字符串的功能利用显示器功能调用INT 10H字符串缓冲区首地址为入口参数DS:DX(段地址:偏移地址)传递参数,数据段,intoffdw ?intsegdw ?intmsgdb A Instruction Interrupt !db 0dh,0ah,
7、0,例1,以“0”结尾,回车、换行,保存中断向量,mov ax,3580hint 21hmov intoff,bx;保存偏移地址mov intseg,es;保存段基地址,例1,获取中断向量(DOS功能调用INT 21H)功能号:AH35H入口参数:AL中断向量号出口参数:ES:BX中断向量(段地址:偏移地址),设置中断向量,push dsmov dx,offset new80hmov ax,seg new80hmov ds,axmov ax,2580hint 21hpop ds,例1,设置中断向量(DOS功能调用INT 21H)功能号:AH25H入口参数:AL中断向量号DS:DX中断向量(段地
8、址:偏移地址),调用中断服务程序,;设置入口参数:DS段地址(已设置)DX偏移地址mov dx,offset intmsgint 80h ;调用80H中断服务程序,例1,A Instruction Interrupt !,;80H号内部中断服务程序:;显示字符串(以“0”结尾);入口参数:DS:DX缓冲器首地址new80hprocsti;开中断push ax;保护寄存器push bxpush si,例1,进入中断服务程序,A Instruction Interrupt !,显示字符串,mov si,dxnew1:mov al,sicmp al,0jz new2mov bx,0mov ah,0ehint 10hinc sijmp new1,例1,A Instruction Interrupt !,退出中断服务程序,new2:pop si;恢复寄存器pop bxpop axiret;中断返回new80hendp,例1,A Instruction Interrupt !,主程序结束,mov dx,intoffmov ax,intsegmov ds,axmov ax,2580hint 21hmov ax,4c00hint 21h,例1,A Instruction Interrupt !,