编写中断程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如一wenku.baidu.com中断服务程序需要做的事情只是向端口340H,341H送出0值,则编制如下: PORT_INT PROC FAR PUSH AX ;保护现场 XOR AL,AL ;中断处理 MOV DX,340H OUT DX,AL INC DX OUT DX,AL MOV AL,20H ;中断结束命令 OUT 0A0H,AL OUT 20H,AL POP AX ;回复现场 IRET PORT_INT ENDP
cli push ds mov dx, offset new_int ; 新服务程序名 mov ax, seg new_int mov ds, ax mov ah, 25h mov al, 0ch int 21h pop ds sti …
; 在主程序结尾处,恢复原来的中断服务程序入口地址 cli push ds mov dx, keepip mov ax, keepcs mov ds, ax mov ah, 25h mov al, 0ch int 21h pop ds sti 通过程序newint.asm学习中断服务程序的编写,通过emu8086观察中断向量表中的入 口地址变化和中断服务程序对内存数组的改写和字符串的显示。
将一个中断类型号的服务程序入口地址读出可由35H系统功能调用来完成。它的参 数表与返回值如下; 入口参数: AH=35H AL=中断号 返回值: ES=中断服务程序入口段址 BX=中断服务程序入口偏移地址 下面给出借用0CH号中断的方法。用变量KEEPCS和KEEPIP保存原0CH号中断的入口地 址。 ; exm6_4 keepcs dw 0 keepip dw 0 mov ah, 35h mov al, 0ch int 21h mov keepip, bx mov keepcs, es ; 保存原来中断服务程序的入口地址
0~255号中断中有些已被系统使用,在系统初始化时有一部分中断例程(如DOS内 核,常用设备驱动程序等)已经驻留在内存中,其相应的中断向量表也已由DOS初始化 程序装载好了,一般情况下,用户不应改变。 但也有例外,例如IBM PC/XT中只留有一个IRQ2中断输入给用户,若用户需要用两 个中断输入,如果此时系统中不用串行口1,(其中断类型号为0CH)那么用户可以借 用。 用户为该中断编写自己的中断服务程序,在进入该接口板应用程序时,先将该中断 的入口地址读出保存在两个变量中,再把自己的中断服务程序入口地址写入中断向量 表中。运行完接口板应用程序后,再将原来的入口地址写回去。
一、中断服务程序的编制 在IBM PC/XT或AT机上由于用了8259A,需要在恢复现场前增加8259A的中断结束命 令(在非自动结束中断方式时大部分应用使用此种方式)。在XT机上只用了一片8259A, 需要增加两条语句: MOV AL,20H ;一般中断结束命令 OUT 20H,AL 在AT机上需要加三条语句 MOV AL,20H OUT 0A0H,AL OUT 20H,AL 这几个语句是通知8259A结束现行的中断,清除在服务寄存器中的相应位。8259A 在IBM PC系列机上初始化工作都由BIOS承担了。操作控制字的使用根据具体应用需要决 定。最后给出中断结束命令。
二、中断服务程序的装载 现要把已编好的中断服务程序的入口地址写入中断向量表中。其段地址写入4N+2 处,偏移地址写入4N处。 (一)直接写入法 设中断服务程序名为PORT_INT ,中断类型号为nH已经编写好了。可以用串存储指令 将它的地址写入中断向量表中,方法如下: … MOV AX,SEG PORT_INT CLI ; 禁止中断 STOSW ; 写入段地址 CLD ; 地址增量方向 STI MOV AX,0 … MOV ES,AX ; 表段地址 MOV DI,n*4H ; 表偏移地址 MOV AX,OFFSET PORT_INT STOSW ; 写入ISERV的偏移地址
(二)系统功能调用法 使用25H功能调用可以将中断矢量写入中断向量表中 入口参数:AH=25H AL=中断类型号 DS = 中断服务程序入口段地址 DX = 中断服务程序入口偏移地址 下面是中断类型号为72H的中断服务程序装载的程序段 CLI PUSH DS ; 保存当前数据段 MOV DX,SEG ISERV MOV DS,DX ; DS为ISERV的段地址 MOV DX,OFFSET ISERV ; DX为ISERV的偏移地址 MOV AL,72H ; AL 中断类型号 MOV AH,25H INT 21H POP DS ; 恢复数据段 STI