. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于书281页,改变颜色的那个例子有点疑问  [待解决] 回复[ 2次 ]   点击[ 283次 ]  
pediyzhi
[帖 主]   [ 发表时间:2012-11-12 15:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-06-06 13:58
;------以下为新的int 9 中断例程------------------

int9:   push    ax
        push    bx
        push    es              ;用到的寄存器入栈

        in      al,60h          ;从60端口读入一个字节到al

        pushf                   ;flag入栈

        pushf                   ;flag再次入栈为了修改IF,TF置0(
        pop     bx              ;将flag赋值给bx
        and     bh,11111100b    ;将高位中的IF,TF置0(不可屏蔽中断)
        push    bx              ;将修改后的BX入栈
        popf                    ;修改当前标志位(IF,TF为0)

        call dword ptr ds:[0]   ;对int 指令进行模拟,调用原来的int 9中断例程

        cmp     al,1            ;esc的扫描码是1
        jne     int9ret         ;如果不是esc(1)就重新执行

        mov     ax,0b800h
        mov     es,ax
        inc     byte ptr es:[160*12+40*2+1]     ;将属性值加1,改变颜色

int9ret:pop     es
        pop     bx
        pop     ax
        iret


这里为什么要用 call dword ptr ds:[0]?
用了这个 call dword ptr ds:[0] 栈内不就多了 CS和IP了吗?那最后 iret返回的数据不就不对了吗?(理论上)

还有像cmp     al,1            ;esc的扫描码是1
        jne     int9ret         ;如果不是esc(1)就重新执行

        mov     ax,0b800h
        mov     es,ax
        inc     byte ptr es:[160*12+40*2+1]     ;将属性值加1,改变颜色
不应该放在call dword ptr ds:[0]前面执行吗? 求解啊..
pediyzhi
[第1楼]   [ 回复时间:2012-11-13 18:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-06-06 13:58
算了.我搞懂了...
chinatree
[第2楼]   [ 回复时间:2012-11-15 00:43 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
我来晚了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved