下面这个程序就是一个新编的09H中断服务程序,运行这个程序后它会驻留内存,当按下[F11]功能键时屏幕上所有字符的颜色都被改成绿色,按下[F12]功能键后所有字符都是红色:
code segment assume cs:code,ds:code org 100h start: jmp install ;转程序驻留部分 new09: ;新编的09H中断服务程序 push ax ;进入中断服务程序时首先保存寄存器 push bx push cx push di push es mov ax,0b800h ;令ES寄存器指向显示缓冲区 mov es,ax mov di,0 ;DI寄存器指向显示缓冲区首 in al,60h ;从端口60H取得键盘发来的扫描码 push ax ;暂存扫描码 in al,61h ;通过61H端口给键盘发一个应答脉冲 or al,80h out 61h,al and al,7fh out 61h,al mov al,20h ;向中断控制器发EOI命令 out 20h,al pop ax ;取回扫描码 test al,10000000b ;是通码吗? jnz exit ;若不是通码,转EXIT退出中断服务程序 mov cx,2000 ;准备改变显示缓存中字符的颜色 cmp al,57h ;是F11键的扫描码吗? jz f11 ;是,转F11键的处理程序 cmp al,58h ;是F12键吗? jz f12 ;是,转F12键的处理程序 jmp exit ;不是这两个键,转EXIT退出中断服务程序 f11: inc di ;DI寄存器指向属性字节(奇数地址) mov al,2 ;选择黑底绿色字属性 stosb ;改变屏幕字符颜色 loop f11 ;转F11继续 jmp exit ;整屏字符颜色改变后,退出中断服务程序 f12: inc di ;将整屏字符颜色改变为红色 mov al,4 stosb loop f12 exit: pop es ;恢复寄存器 pop di pop cx pop bx pop ax iret ;中断返回 install: mov ax,2509h ;设置09H中断服务程序入口 mov dx,offset new09 ;DS:DX寄存器指向新的09H中断服务程序首 int 21h mov dx,offset install ;驻留内存部分的长度 int 27h ;结束并驻留 code ends end start
这个程序看似简单,但它引出了不少有关PC原理方面的知识。第一是主机与键盘之间如何交换信息;第二是编写硬件中断服务程序应注意的一个关键问题;其三就是DOS系统为方便用户编制中断服务程序所提供的一些功能调用。