实验15
- 编程:安装一个新的 int 9 中断例程,在DOS下,按下'A'键后,除非不再松开,如果松开,就会显示满屏幕的'A',其他键的功能照常。
运行结果
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.png
完整源码
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
; 安装int9
mov si,offset int9
mov di,204H ;将新的int9中断例程安装在0000:0204H处开始
mov cx,offset int9end - offset int9
cld
rep movsb
; 将BIOS 的 in9 入口地址放在 0000:[200H] 以及 0000:[202H]中
push es:[9*4]
pop es:[200H]
push es:[9*4+2]
pop es:[202H]
; 在中断向量表中设置新的int 9的入口地址
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 bx
push cx
push es
in al,60H
pushf
call dword ptr cs:[200H]
cmp al,1EH+80H
jne int9ret
mov ax,0B800H
mov es,ax
mov bx,0
mov al,'A'
mov cx,2000
s: mov byte ptr es:[bx],al
add bx,2
loop s
int9ret: pop es
pop cx
pop bx
pop ax
iret
int9end: nop
code ends
end start
代码参考
代码说明:完全照着 代码参考 提供的代码,只做 4处修改
【修改后的代码】
(一)第一处修改
cmp al,1EH+80H ; A键的通码是1EH,断码=通码+80H
题目要求是【松开】才全屏显示,
因此只需要检测到 【断码】 就可以了
(二)第二处修改
mov al,'A'
新增的语句,按照题意,要显示的字符是 'A'
(三)第三处修改
mov bx,0
要修改的是显存的偶地址,因此要从0开始
(四)第四次修改
在 标号s 之后 写上
mov byte ptr es:[bx],al
随着对显存偶地址的访问,写上'A'