实验要求:
安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开如果松开,就显示满屏的“A”,其他键照常处理。
提示:按下一个键时产生的扫描码称为通码,松开一个键产生的码叫做断码。断码 = 通码 + 80h。
掌握:
一、设置中断例程:
1.设置ds:si指向源地址
2.设置es:di指向目的地址
3.设置cx为传输长度
4.设置传输方向为正(cld)
5.设置中断向量表
6.中断代码内容
二、int指令执行时,CPU进行的工作
1 取中断类型码n
2 标志寄存器入栈
3 IF=0,TF=0
4 CS、IP入栈
5 IP = n4, CS = n4+2
三、键盘输入的处理过程:
1、键盘产生扫描码
2、扫描码送入60h端口
3、引发中断
4、CPU执行中断例程,处理键盘输入
思路:
将编写的 int9中断代码放在0:204处,将原来的int9中断向量保存0:200-0:204中,在调用新的int9时,做到先调用原来的int9中断用来处理其他硬件细节
中断代码中要做到先调用原来的int9
则用pushf指令和call dword ptr ds:[200]来模拟int指令
设计代码:
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
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:[4*9]
pop es:[200h]
push es:[4*9+2]
pop es:[202h]
cli
mov word ptr es:[4*9],204h
mov word ptr es:[4*9+2],0
sti
mov ax,4c00h
int 21h
int9: push ax
push bx
push cx
push es
in al,60h
pushf 模拟用来执行原int9的中断例程
call dword ptr cs:[200h] 因为此段代码在段地址0处,所以此处cs为0
cmp al,9eh A的通码为1Eh 断码+80h
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],'A'
mov byte ptr es:[bx+1],7h
add bx,2
loop s
int9ret:pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start