【汇编语言】by王爽 | 实验15:安装新的 int 9 中断例程

前言:本实验为王爽老师的《汇编语言》第三版中的实验15(p285)

实验环境:DOSBox 0.74-3

实验任务:

        安装一个新的 int 9 中断例程,功能:在 DOS 下,按下“A”键后,除非不再松开,如果松开, 就显示满屏幕的“A”;其他的键照常处理。

        提示,按下一个键时产生的扫描码称为通码,松开一个键时产生的扫描码称为断码断码 = 通码 + 80h

程序代码:

assume cs:code

stack segment
  db 128 dup (0)
stack ends

code segment

start: mov ax,stack
       mov ss,ax
       mov sp,128

       ;安装新的int 9中断例程到0:204h
       mov ax,cs
       mov ds,ax
       mov si,offset do9  ;ds:si指向中断例程入口
       mov ax,0
       mov es,ax
       mov di,204h
       mov cx,offset do9end - offset do9
       cld
       rep movsb

       ;先保存原始BIOS的int 9中断例程地址到0:200h
       push es:[9*4]
       pop es:[200h]
       push es:[9*4 + 2]
       pop es:[202h]

       ;设置中断向量表中int 9地址为新的do9入口
       cli
       mov word ptr es:[9*4],204h
       mov word ptr es:[9*4 + 2],0   

       mov ax,4c00h
       int 21h

  do9: push ax
       push cx
       push di
       push es
       push bx

       in al,60h  ;获取60h端口的扫描码

       ;调用BIOS的int 9中断例程,处理其它硬件细节
       pushf  
       mov bx,0
       mov es,bx
       call dword ptr es:[200h]
       cmp al,9eh  
       jne ok
       mov bx,0b800h
       mov es,bx
       mov di,0
       mov cx,2000
    s: mov byte ptr es:[di],'a'
       add di,2
       loop s

   ok: pop bx
       pop es
       pop di
       pop cx
       pop ax
       iret
do9end: nop

code ends
end start

运行结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值