前言:本实验为王爽老师的《汇编语言》第三版中的实验15(p285)
实验环境:DOSBox 0.74-3
实验任务:
安装一个新的 int 9 中断例程,功能:在 DOS 下,按下“A”键后,除非不再松开,如果松开, 就显示满屏幕的“A”;其他的键照常处理。
提示,按下一个键时产生的扫描码称为通码,松开一个键时产生的扫描码称为断码。断码 = 通码 + 80h。
程序代码:
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
;安装新的int 9中断例程到0:204h
mov ax,cs
mov ds,ax
mov si,offset do9 ;ds:si指向中断例程入口
mov ax,0
mov es,ax
mov di,204h
mov cx,offset do9end - offset do9
cld
rep movsb
;先保存原始BIOS的int 9中断例程地址到0:200h
push es:[9*4]
pop es:[200h]
push es:[9*4 + 2]
pop es:[202h]
;设置中断向量表中int 9地址为新的do9入口
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4 + 2],0
mov ax,4c00h
int 21h
do9: push ax
push cx
push di
push es
push bx
in al,60h ;获取60h端口的扫描码
;调用BIOS的int 9中断例程,处理其它硬件细节
pushf
mov bx,0
mov es,bx
call dword ptr es:[200h]
cmp al,9eh
jne ok
mov bx,0b800h
mov es,bx
mov di,0
mov cx,2000
s: mov byte ptr es:[di],'a'
add di,2
loop s
ok: pop bx
pop es
pop di
pop cx
pop ax
iret
do9end: nop
code ends
end start
运行结果: