代码改变世界

实验十五_安装新的int 9中断例程

2014-04-26 19:19  星星之火✨🔥  阅读(974)  评论(0编辑  收藏  举报
安装一个新的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’这样的功能添加上
去,完善起程序。