汇编语言(第3版,王爽著):实验15 安装新的 int 9 中断例程
1. 思路:
- 如果完整的看完了第 15 章节的内容,那么题目还是很简单的
- 只需要判断 A 键松开后,向端口 60h 发送的扫描码(即 A 键的断码为 9eh)
2. 代码实现:
文件名:exp15.asm
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 ; 设置 ds:si 指向源地址
mov di, 204h ; 设置 es:di 指向目的地址
mov cx, offset int9end - offset int9 ; 设置 cx 为传输长度
cld ; 设置传输方向为正
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ; 保存原 int 9 中断例程的入口地址到 0:200 ~ 0:203
cli
mov word ptr es:[9*4], 204h
mov word ptr es:[9*4+2], 0
sti ; 在中断向量表中设置新的 int 9 中断例程的入口地址
mov ax, 4c00h
int 21h
int9:
push ax
push bx
push cx
push es
in al, 60h ; 从 60h 端口读出键盘的输入
pushf
call dword ptr cs:[200h] ; 模拟 int 指令调用原 int 9 中断例程(原 int 9 中断例程的地址在 0:200 ~ 0:203);当此中断例程执行时 (CS)=0
cmp al, 9eh ; A 键的断码为 9eh
jne int9ret
mov ax, 0b800h
mov es, ax
mov bx, 0
mov cx, 2000
s:
mov byte ptr es:[bx], 'A'
add bx, 2
loop s
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9end:
nop
code ends
end start