安装一个新的int9中断例程,功能:在DOS下,按下“A”键后,除非不再松开,如果松开,就显示满屏的“A”;其他的按键照常处理。
提示:按下一个键时产生的扫描码称为通码,松开一个键时产生的扫描码称为断码,断码 = 通码 + 80h
我把程序改了下,按c键,在屏幕上显示B字母,程序代码如下:
;程序功能:按A键,当松开的时候在屏幕的80*25的里面全部显示字母A,不松开则不作任何处理,其他的键照常处理。 assume cs:code data segment db 100 dup(0) data ends code segment start: mov ax,0 mov es,ax mov di,200h mov ds,ax mov si,[9*4] mov cx,4 cld rep movsb mov ax,offset int9 mov ds:[9*4],ax mov ax,cs mov ds:[9*4+2],ax call breakPoint ;还原int9中断向量表 mov ax,0 mov ds,ax mov si,200h mov di,9*4 mov cx,4 cld rep movsb mov ax,4c00h int 21h ;实现int9中断例程 int9: cli push ax mov ax,0b800h push es mov es,ax push bx mov bx,0 push cx mov cx,2000 in al,60h cmp al,2eh+80h jne int9ret mov ah,'B' s0: mov byte ptr es:[bx],ah add bx,2 loop s0 int9ret: int 80h pop cx pop bx pop es pop ax iret breakPoint: push ax pushf pop ax or ah,3 ;这里可以增加判断,例:当cx为100的时候再设置断点 push ax popf pop ax ret code ends end start
运行:我使用的是win7+masm6.15环境,通过编译、链接后,使用debug xxx.exe的形式运行,直接按g命令,则会执行到断点处call breakPoint,这时候你按c键盘,就可以在屏幕上显示B字母了。