汇编语言(第3版,王爽著):实验15 安装新的 int 9 中断例程

实验15 安装新的 int 9 中断例程

1. 思路:

  1. 如果完整的看完了第 15 章节的内容,那么题目还是很简单的
  2. 只需要判断 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

3. 程序运行效果:

程序运行效果

posted @ 2022-05-26 13:22  夏夜星空晚风  阅读(92)  评论(0编辑  收藏  举报