【汇编】自定义9号中断(键盘输入处理中断)

在屏幕上交替显示a~z,按ESC字体变绿色

 

[plain] view plain copy
  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     dw 0,0;存放原9号中断的偏移和段地址  
  5. data ends  
  6.   
  7. code segment  
  8. ;;;;;;;;;;;;;;;;;;;;;;  
  9. ;主程序  
  10. ;;;;;;;;;;;;;;;;;;;;;;  
  11. start:  
  12.     ;安装9号中断  
  13.     mov bx,data  
  14.     mov ds,bx  
  15.     mov bx,0  
  16.     mov es,bx  
  17.     mov ax,es:[9*4]  
  18.     mov ds:[0],ax  
  19.     mov ax,es:[9*4+2]  
  20.     mov ds:[2],ax  
  21.     mov word ptr es:[9*4],offset int9  
  22.     mov es:[9*4+2],cs  
  23.       
  24.     mov bx,0b800h  
  25.     mov es,bx  
  26.     jmp restore  
  27. s:  mov es:[160*12+2*70],al  
  28.     call delay  
  29.     cmp al,'z'  
  30.     je restore  
  31.     inc al  
  32.     jmp s  
  33.       
  34.     mov ax,4c00h  
  35.     int 21h  
  36.       
  37. restore:  
  38.     mov al,'a'  
  39.     jmp s  
  40.   
  41. delay:  
  42.     push ax  
  43.     push bx  
  44.     mov ax,2000h  
  45.     mov bx,0  
  46. s1: sub bx,1  
  47.     sbb ax,0  
  48.     cmp ax,0  
  49.     jne s1  
  50.     cmp bx,0  
  51.     jne s1   
  52.     pop bx  
  53.     pop ax  
  54.     ret  
  55.   
  56. ;;;;;;;;;;;;;;;;;  
  57. ;9号中断  
  58. ;;;;;;;;;;;;;;;;;     
  59. int9:  
  60.     push ax  
  61.     in al,60h  
  62.     cmp al,1  
  63.     jne int9_rtn  
  64.     mov byte ptr es:[160*12+2*70+1],00000010b  
  65.       
  66. int9_rtn:  
  67.     ;模拟中断发生过程  
  68.     pushf;保存标志寄存器内容  
  69.       
  70.     ;设置标志寄存器的IF,TF为0  
  71.     pushf  
  72.     pop ax  
  73.     and ah,1100b  
  74.     push ax  
  75.     popf  
  76.     call dword ptr ds:[0];完成push cs,push ip  
  77.       
  78.     pop ax  
  79.     iret  
  80.   
  81. code ends  
  82.   
  83. end start 

需要注意的是es的值是0,因为中断向量表就起始于0地址处,我们知道,中断向量处理例程是在中断向量号乘以4,(相对于0这个基址的偏移),就是中断处理例程的地址,该

地址是16位的,同时在改地址之后的16位,则是改处理例程的段基址,所以在保存中断向量处理例程的时候不但要保存中断处理例程的地址,还要有其段基址,同样在安装钩

子,更换该处理例程的时候也要注意更换基址!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值