- 如果完整的看完了第 15 章节的内容,那么题目还是很简单的
- 只需要判断 A 键松开后,向端口 60h 发送的扫描码(即 A 键的断码为 9eh)
文件名: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