下面这个程序就是一个新编的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系统为方便用户编制中断服务程序所提供的一些功能调用。