@[TOC](《汇编实验(第三版)》王爽著 实验15 安装新的int 9中断例程)
# 书本p285,实验项目:安装一个新的INT 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,如果松开,就显示满屏幕的“A”,其他的键照常处理。
## 分析
1. 显示满屏幕的“A”
结合课本P187实验9可知,显存的一页中可以显示80*25(2000)个字符,一个字符占两个字节的存储空间(一个字),低位为字符ASCⅡ值,高位为字符属性(闪烁、前、背景、高亮)。因此,要显示满屏幕的A,就要将字符‘A’写入显存对应的存储位置上。程序如下
mov ax,0b800h
mov es,ax
mov cx,2000
mov bx,0
s3: mov byte ptr es:[bx],41h
inc byte ptr es:[bx+1] ; 更改颜色 add bx,2 loop s3
2.其他部分参考书P282 15.5
3.完整程序如下:
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
;初始化movsb相关寄存器
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],0h
sti
mov ax,4c00h
int 21h
int9:
push es
push cx
push bx
push ax
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,9eh;A的通码为1eh,加上80h后为其断码
jne int9ret
mov ax,0b800h
mov es,ax
mov cx,2000
mov bx,0
s3: mov byte ptr es:[bx],41h
inc byte ptr es:[bx+1] ; 更改颜色
add bx,2
loop s3
;mov bx,0
;mov si,0
;mov cx,25
;s1: push cx
;mov cx,80
;mov al,'A'
;s0: mov es:[160*bx+si*2],al
;inc si
;loop s0
;pop cx
;inc bx
;loop s1
int9ret:
pop ax
pop bx
pop cx
pop es
iret
int9end: nop
code ends
end start