. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第十五章,代码的疑惑!  [已解决] 回复[ 2次 ]   点击[ 312次 ]  
gift925
[帖 主]   [ 发表时间:2009-09-04 13:17 ]   [引用]   [回复]   [ top ] 
荣誉值:22
信誉值:12
注册日期:2009-08-28 00:17
第一版,第十五章,270页和271页:
        int9:
                push ax
                push bx
                push es
                
                ;first step:read scan code 
                in al,60h
                
                ;second step:save flag register
                pushf
                
                ;third step:make tf if to zero
                pushf
                pop bx
                and bh,11111100b
                push bx
                popf
                
                ;fourth step:call the orignial int 9h to deal with the basic things
                call dword ptr ds:[0]
                
                ;if the key is 'ESC'
                cmp al,1
                jne int9ret;if not,do nothing.
                
                mov ax,0b800h
                mov es,ax
                inc byte ptr es:[160*12+40*2+1]
                
        int9ret:
                ;****!it should be popf front of pop es!
                pop es                
                pop bx
                pop ax
                iret

他压入了两次pushf,第一次是为了标记寄存器进栈,第二次是为了修改TF,IF,可是在退出的时候居然少了一次popf,那不乱套了么,本来应该是标志寄存器的值,却进了es
gift925
[第1楼]   [ 回复时间:2009-09-04 13:44 ]   [引用]   [回复]   [ top ] 
荣誉值:22
信誉值:12
注册日期:2009-08-28 00:17
啊,是我错了!我忏悔。。。
是在自己的INT9处理程序中,去模拟CPU来调用本来的INT 9,所以,在原本的INT 9 IRET返回的时候,就已经POPF了。
gift925
[第2楼]   [ 回复时间:2009-09-04 13:44 ]   [引用]   [回复]   [ top ] 
荣誉值:22
信誉值:12
注册日期:2009-08-28 00:17
此贴由 贴主 于 [ 2009-09-04 13:44 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved