| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
安装一个新的int 9 中断例程, 功能:在DOS下,按“A”键后,除非不在松开如果松开,就显示满屏幕的“A”;其他的键照常处理。 
提示, 按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。断码=通码 + 80h。 
 
- assume cs:code, ss:stack
 
  
- stack segment
 
 -                 db 128 dup (0)
 
 - stack ends
 
  
 
- code segment
 
 - start:                                        ;把int 9h里的地址传到0000:0200-0000:0204中,这样可以不占用
 
 -                 mov ax, stack
 
 -                 mov ss, ax
 
 -                 mov sp, 128
 
 -                 
 
 -                 mov ax, cs
 
 -                 mov ds, ax
 
 -                 mov si, offset int_9
 
 -                 
 
 -                 mov ax, 0
 
 -                 mov es, ax
 
 -                 mov di, 204h
 
 -                 
 
 -                 mov cx, offset int_end - offset int_9
 
 -                 
 
 -                 cld
 
 -                 rep movsb
 
 -                 
 
 -                 push word ptr es:[ 9 * 4]
 
 -                 pop word ptr ds:[200h]
 
 -                 
 
 -                 push word ptr es:[9 * 4 + 2]
 
 -                 pop  word ptr ds:[200h + 2]
 
 -                 
 
 -                 
 
 -                 ;安装到中断限量表中
 
 -                 
 
 -                 cli
 
 -                 mov word ptr es:[9 * 4], 204h
 
 -                 mov word ptr es:[9 * 4 + 2], 0h
 
 -                 sti
 
  
-                 
 
 -                 mov ax, 4c00h
 
 -                 int 21h
 
 -                 
 
 - int_9:
 
 -                 push ax
 
 -                 push bx
 
 -                 push cx
 
 -                 push es
 
 -                 
 
 -                 mov bx, 0                        ;因为怕bx中有数据所以先归零
 
 -                 
 
 -                 pushf
 
 -                 call dword ptr cs:[200h]
 
 -                 
 
 -                 in al, 60h
 
 -                 
 
 -                 ;判断是否是a键的断码如果不是那就跳转如果是就向下执行
 
 -                 cmp al, 1eh + 80h
 
 -                 jne loop_2
 
 -                 
 
 -                 mov ax, 0b800h
 
 -                 mov es, ax
 
 -                 
 
 -                 mov cx, 2000
 
 - loop_1:
 
 -                 mov byte ptr es:[bx], 'a'  
 
 -                 add bx, 2
 
 -                 loop loop_1
 
 -                 
 
 - loop_2:
 
 -                 
 
 -                 pop es
 
 -                 pop cx
 
 -                 pop bx
 
 -                 pop ax
 
 -                 iret
 
 - int_end:
 
 -                 nop
 
 -                 
 
 -                 
 
 - code ends
 
 - end start
 
  复制代码 
 
 |   
 
 
 
 |