安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开, 如果松开,就显示满屏幕的“A”;其他的键照常处理。
提示:按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。
断码 = 通码 + 80h。
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset int9;ds:si指向源地址
mov ax,0
mov es,ax
mov di,204h;es:di指向目的地址
mov cx,offset int9end - offset int9
cld
rep movsb mov ax,es:[9*4]
mov es:[200h],ax
mov ax,es:[9*4+2]
mov es:[202h],ax cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti mov ax,4c00h
int 21h
;---------------------------------------------------------------------------
int9: push ax
push es
in al,60h pushf
call dword ptr cs:[200h] cmp al,9EH;9EH是'A'的断码
jne int9ret mov ax,0b800h
mov es,ax
mov cx,2000
mov di,0
int9_s: mov byte ptr es:[di],'A'
mov byte ptr es:[di+1],0CH;高亮红
add di,2
loop int9_s int9ret:pop es
pop ax
iret int9end:nop
code ends
end start
--------------------------------------------------------------------
总结:首先搭建框架: int9中断例程安装 保存原来的int 9中断例程 设置中断向量表 int9 int9end:nop
心得:为了便于程序的调试,写程序时可以先把功能简化,就上述程序来说
可以用在屏幕中间显示一个字符来替代满屏‘A’这样的功能,如果实现了
一个字符的显示,说明程序(除了满屏‘A’部分)其他地方基本上正确
(不一定完全正确,原因很多),这样在把满屏显示‘A’这样的功能添加上
去,完善起程序。