+ -
当前位置:首页 → 问答吧 → 请问:为什么不能关闭A20

请问:为什么不能关闭A20

时间:2010-11-03

来源:互联网

我写了个程序是显示0:0及以后的内容的,然后分别用四种方法
来关闭A20,并显示ffff:10h及以后的内容的,如果能关闭成功,
那么这两处的内容应该是一样的,可是我发现它们都不一样(我
分别在XP的cmd以及纯DOS下运行,结果都一样)
请看我的代码:
(1)
mov al,0  
int 15h  ;al=0,int 15h为关闭A20

(2)
in  al,92h  ;读Fast A20的端口
and al,0fdh   
out 92h,al  ;A20的bit 1为0时,关闭A20

(3)
cleara20:
         in   al,64h
         test al,2
         jnz  cleara20
         mov  al,0d1h
         out  64h,al
         jmp  $+2
cleara20_1:
         in   al,64h
         test al,2
         jnz  cleara20_1
         mov  al,0ddh
         out  60h,al  ;close A20 gate

(4)
                cli                     ;1.关闭中断
                call WaitInbufEmpty    ;2.等待8042 Input buffer为空;
                mov al, 0adh
                mov dx, 64h
                out dx, al              ;3.发送禁止键盘操作命令
                call WaitInbufEmpty    ;4.等待8042 Input buffer为空;
                mov al, 0d0h
                mov dx, 64h
                out dx, al              ;5.发送读取8042 Output Port命令;
                call WaitOutbufFull     ;6.等待8042 Output buffer有数据;
                mov dx, 60h
                in al, dx               ;7.读取8042 Output buffer
                push ax                 ;保存读取的数据
                call WaitInbufEmpty     ;8.等待8042 Input buffer为空;
                mov al, 0d1h
                mov dx, 64h
                out dx, al              ;9.发送写 8042 Output Port命令
                call WaitInbufEmpty     ;10.等待8042 Input buffer为空
                pop ax
                and al,0fdh             ;11.将从8042 Output Port得到的字节的bit 1置0
                mov dx, 60h
                out dx, al              ;写入Output Port
                call WaitInbufEmpty    ;12.等待8042 Input buffer为空
                mov al, 0aeh
                mov dx, 64h
                out dx, al              ;13.发送允许键盘操作命令
                sti                     ;开中断
WaitInbufEmpty  proc near
                mov dx, 64h
                in al, dx               ;读取Status Register
                test al, 02h
                jnz WaitInbufEmpty
                ret
WaitInbufEmpty  endp


WaitOutbufFull  proc near
                mov dx, 64h
                in al, dx
                test al, 01             ;读取Status Register
                jz WaitOutbufFull
                ret
WaitOutbufFull  endp

然后以下都一样,都是显示ffff:10h处内容的,它们四次显示的都一样,
但就是和我的另一个程序显示的0:0处的内容不一样,请问:为什么不能
关闭A20呢?要怎么做呢?

作者: netdoger   发布时间: 2010-11-03

汇编

作者: linux_of_ly   发布时间: 2010-11-03