请问:为什么不能关闭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呢?要怎么做呢?
来关闭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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28