. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  INT 9子程序中的疑问,不知道理解是不是正确,请指教  [已解决] 回复[ 4次 ]   点击[ 571次 ]  
jhszcn
[帖 主]   [ 发表时间:2008-04-11 13:55 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
;INT 9子程序
;=====================================
the9: 
            push ax 
            push es 
            mov ax,0b800h 
            mov es,ax 
            pushf                    ;标志寄存器压栈 
             
              pushf 
            pop ax 
            and ah,11111100b 
            push ax 
            popf                    ;IF,TF清零 
              call dword ptr ds:[0]    ;调用原int9中断 
              in al,60h 
            cmp al,1 
            jne exit 
            inc byte ptr es:[160*12+40*2+1] 
    exit:   pop es 
            pop ax 
            iret 
codesg ends 
end start 
;===============================================
我的理解:
系统在程序运行中遇到键盘按下或松开后
1.键盘产生扫描码;
2.扫描码送入60h端口;
3.引发9号中断;
4.到中断向量表中找到9号中断的向量的位置(在我的程序中已经将9号中断位置下的IP,CS设置到了我的INT9和当前的CS),跳转到我的9号中断子程序(==JMP DWORD PTR )
;===================================================
如果在程序中,我按下了'A'
1.键盘产生扫描码;
2.扫描码送入60H端口;
3.引发9号中断,(PUSHF,IF=0,TF=0,PUSH CS,PUSH IP);
4.JMP到我在0:9*4中置的IP和0:9*4+2中置的CS(也就是我的INT9子程的地址);
5.PUSHF;
6.CALL 原来INT9中断的IP,CS(我保存在DS:[0]的位置)==PUSH CS,PUSH IP,JMP DWORD PTR DS:[0];
7.原INT9中的IRET返回;
8.读60H端口,判断,运行自己的东西
9.再用IRET返回在0:9*4处的中断在我程序中保存的位置.
=====================================================
以上理解不知道是否正解,请指教
tomato
[第1楼]   [ 回复时间:2008-04-11 22:22 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
我觉得楼主的理解很正确。
wdm
[第2楼]   [ 回复时间:2008-04-12 12:54 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
我觉得理解的很顺畅,没说的。
jhszcn
[第3楼]   [ 回复时间:2008-04-13 13:20 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
谢谢,嘎嘎
jhszcn
[第4楼]   [ 回复时间:2008-04-13 13:21 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
此贴由 贴主 于 [ 2008-04-13 13:21 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(tomato):3分   2楼(wdm):3分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved