实验15
题目
安装一个新的 int 9 中断例程,在DOS下,按下’A’键后,除非不再松开,如果松开,就会显示满屏幕的’A’,其他键的功能照常。
代码:
assume cs:code
code segment
start:
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]; 存储原本中断例程的地址
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
push si
push cx
in al,60h
pushf
call dword ptr cs:[200h]; 此时cs指向int9中断例程的段地址,先调用原本int9中断例程处理键盘输入产生的中断
;键盘输入处理过程:
;我们从键盘输入一个按键时,会到达相关芯片的60端口;60端口会向CPU发出int9中断:告诉CPU有输入到了60端口。
;int9中断处理过程,有以下三步:
;1.读取60h端口中的扫描码;
;2.如果是字符键的扫描码,将送入内存中的BIOS键盘缓冲区;如果是控制键和切换键的扫描码,则将其转换为状态字,写入;内存中存储状态字节的单元;
;3.对键盘系统进行相关控制,比如说,向相关芯片发出应答信息。
cmp al,1eh+80h; 根据扫描码确定是否为‘A‘键的断码
jne int9ret
show:
mov ax,0b800h
mov es,ax
mov si,0
mov cx,2000
shows:
mov byte ptr es:[si],'A'
add si,2
loop shows
int9ret:
pop cx
pop si
pop es
pop ax
iret
int9end:nop
code ends
end start
解析:
这里是安装中断例程,与前文的直接调用中断例程不同(按ESC改变颜色)。因为按ESC改变颜色的那个程序是在运行时调用的,程序一直在显示‘a'’z‘,故编写的中断可以直接存储在data区域内,不会被内存回收,因为并没有退出程序。本次实验一运行就结束,不存在处于运行的时刻,若中断例程采取存储在data中,一旦程序结束,内存就会被回收,中断例程也就被覆盖了。故要安装中断例程在安全的区域,也就是0:200h0:2ffh区域内。
根据题目要求,按下’A‘键后,若松开,则全屏’A‘。要想松开’A‘键,必须先按下‘A‘键,故只需检测松开‘A‘键即可,其余的正常调用中断例程即可。
标签:15,例程,mov,pop,中断,实验,int9,es From: https://www.cnblogs.com/alphadoiy/p/17588593.html