题目:安装一个新的int9中断例程,功能:在dos下,按下‘A'键后,除非不再松开,如果松开,就显示满屏的'A';其他键照常处理。 源代码: assume cs:codesg stacksg segment db 128 dup(0) stacksg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,128 ;;;;;;;复制int9的中段程序到0000:0204h处 mov ax,0 mov es,ax mov di,204h;设置es:[di]指向0000:0204h处 mov ax,cs mov ds,ax mov si,offset int9;设置ds:[si]指向行的int9中断程序的开始处 mov cx,offset int9end-offset int9;设置cx的循环次数 cld ;设置si、di递增 rep movsb;复制程序到0000:0204开始的地址处 push es:[9*4] pop es:[200h] push es:[9*4+2] pop es:[202h];把原来的int9中断例程的入口地址保存到0000:[0200h]开始的两个字单元 cli;屏蔽掉键盘中断,免得引起错误 mov word ptr es:[9*4],204h mov word ptr es:[9*4+2],0;设置int9的中断向量表项指向新的int9中断程序 sti mov ax,4c00h int 21h ;;;;;;;;;;;;;;;;;;新的int9中断程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; int9: push ax push bx push cx push es mov ax,0 mov es,ax;设置es的值为0000h in al,60h;读取所输入的键值 pushf call dword ptr es:[200h];调用原来的int9中断例程 cmp al,9eh;判断按下的是否是a键 jne int9ret;不是则结束该中断例程 mov ax,0b800h mov es,ax mov bx,0;设置es:[bx]指向显存段地址 mov cx,2000 show: mov byte ptr es:[bx],41h mov byte ptr es:[bx+1],2h add bx,2 loop show;显示满屏的A int9ret: pop es pop cx pop bx pop ax iret int9end:nop codesg ends end start