1、一 中断服务程序的编制 在IBMPC XT或AT机上由于用了8259A 需要在恢复现场前增加8259A的中断结束命令 在非自动结束中断方式时大部分应用使用此种方式 在XT机上只用了一片8259A 需要增加两条语句 MOVAL 20H 一般中断结束命令OUT20H AL在AT机上需要加三条语句MOVAL 20HOUT0A0H ALOUT20H AL这几个语句是通知8259A结束现行的中断 清除在服务寄存器中的相应位 8259A在IBMPC系列机上初始化工作都由BIOS承担了 操作控制字的使用根据具体应用需要决定 最后给出中断结束命令 二 中断服务程序的装载 现要把已编好的中断服务程序的入口地址写
2、入中断向量表中 其段地址写入4N 2处 偏移地址写入4N处 一 直接写入法设中断服务程序名为PORT INT 中断类型号为nH已经编写好了 可以用串存储指令将它的地址写入中断向量表中 方法如下 MOVAX SEGPORT INTCLI 禁止中断STOSW 写入段地址CLD 地址增量方向STIMOVAX 0 MOVES AX 表段地址MOVDI n 4H 表偏移地址MOVAX OFFSETPORT INTSTOSW 写入ISERV的偏移地址 例如一个中断服务程序需要做的事情只是向端口340H 341H送出0值 则编制如下 PORT INTPROCFARPUSHAX 保护现场XORAL AL 中断
3、处理MOVDX 340HOUTDX ALINCDXOUTDX ALMOVAL 20H 中断结束命令OUT0A0H ALOUT20H ALPOPAX 回复现场IRETPORT INTENDP 二 系统功能调用法使用25H功能调用可以将中断矢量写入中断向量表中入口参数 AH 25HAL 中断类型号DS 中断服务程序入口段地址DX 中断服务程序入口偏移地址下面是中断类型号为72H的中断服务程序装载的程序段CLIPUSHDS 保存当前数据段MOVDX SEGISERVMOVDS DX DS为ISERV的段地址MOVDX OFFSETISERV DX为ISERV的偏移地址MOVAL 72H AL中断类型
4、号MOVAH 25HINT21HPOPDS 恢复数据段STI 0 255号中断中有些已被系统使用 在系统初始化时有一部分中断例程 如DOS内核 常用设备驱动程序等 已经驻留在内存中 其相应的中断向量表也已由DOS初始化程序装载好了 一般情况下 用户不应改变 但也有例外 例如IBMPC XT中只留有一个IRQ2中断输入给用户 若用户需要用两个中断输入 如果此时系统中不用串行口1 其中断类型号为0CH 那么用户可以借用 用户为该中断编写自己的中断服务程序 在进入该接口板应用程序时 先将该中断的入口地址读出保存在两个变量中 再把自己的中断服务程序入口地址写入中断向量表中 运行完接口板应用程序后 再将
5、原来的入口地址写回去 将一个中断类型号的服务程序入口地址读出可由35H系统功能调用来完成 它的参数表与返回值如下 入口参数 AH 35HAL 中断号返回值 ES 中断服务程序入口段址BX 中断服务程序入口偏移地址下面给出借用0CH号中断的方法 用变量KEEPCS和KEEPIP保存原0CH号中断的入口地址 exm6 4keepcsdw0keepipdw0movah 35hmoval 0chint21hmovkeepip bxmovkeepcs es 保存原来中断服务程序的入口地址 clipushdsmovdx offsetnew intmovax segnew int 新服务程序名movds axmovah 25hmoval 0chint21hpopdssti 在主程序结尾处 恢复原来的中断服务程序入口地址clipushdsmovdx keepipmovax keepcsmovds axmovah 25hmoval 0chint21hpopdssti通过程序newint asm学习中断服务程序的编写 通过emu8086观察中断向量表中的入口地址变化和中断服务程序对内存数组的改写和字符串的显示