ITEEDU

   下面这个程序就是一个新编的09H中断服务程序,运行这个程序后它会驻留内存,当按下[F11]功能键时屏幕上所有字符的颜色都被改成绿色,按下[F12]功能键后所有字符都是红色:

NEW09.ASM
        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系统为方便用户编制中断服务程序所提供的一些功能调用。