首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

60h和64h端口有关问题,求解!

2013-08-01 
60h和64h端口问题,求解!!测试环境:win7,IntelCPU中VMWare虚拟机里,虚拟机操作系统:32位XP。请问高人下面的

60h和64h端口问题,求解!!
测试环境:win7,IntelCPU中VMWare虚拟机里,虚拟机操作系统:32位XP。
请问高人下面的代码为什么不能达到从8042微处理器修改按键信息的效果?
刚开始自学汇编不久,已经认真看完了王爽的《汇编语言》,但在写下面的汇编代码时,不能达到预期效果,特发帖求解惑!


;------------------------------主程序说明--------------------------------------
;[程序说明]
;[程序结果]
;[总结经验]
;------------------------------------------------------
datasegment

dataends


stacksegment

stackends


codesegment
assume cs:code,ds:data,ss:stack

;------------------------------主程序开始------------------------------

main:
xorax,ax

s1:inal,64h
andal,00000010b
cmpal,0

jnes1;状态寄存器bit1如果不为0就跳转.


moval,60h
out64h,al;下面通过60h端口写入的数据将送到控制寄存器
moval,46h
out60h,al;即01000110b,bit0位为0,表示关闭键盘中断,bit1为1表示允许鼠标中断
;打开时将01000111b送入控制寄存器即可.


s2:inal,64h;再次获得状态寄存器的数据
andal,00000001b
cmpal,1;bit0如果为1,说明有输出缓冲器中有数据

jnes2;bit0如果不为1,就轮询

inal,60h
movbl,al

moval,60h
out64h,al
moval,47h
out60h,al;打开键盘中断,以便让硬件自动产生中断信号

s3:inal,64h
andal,00000010b
cmpal,0

jnes3


moval,0d2h
out64h,al;接下来向60h端口写入的数据要放到输出缓冲器中,

s4:inal,64h
andal,00000010b
cmpal,0

jnes4
;,,,,如果中断允许,将产生一个中断
moval,1eh;不管按的是什么键,都作A键处理,试验性数据
out60h,al;因为中断已经打开,将产生一个硬中断


nop

movah,0
int16h

movdi,0b800h
moves,di
movdi,160*10+40*2
moves:[di],al
adddi,6
moval,ah
movah,0
calloutHax_Ex

jmps1

movah,7h;选择中断处理程序的第7号子程序
int21h;调用DOS提供的第21号中断处理程序.
;暂停,以便查看结果

movah,4ch;选择中断处理程序的第4ch号子程序
int21h;调用DOS提供的第21号中断处理程序
;退出本程序,返回DOS(即返回操作系统)

;****************函数说明****************
;[函数功能]以十六进制字符输出寄存器AX中的内容
;[函数参数]AX待输出的数据
;ES显存段地址
;DI显存位置指针
;[函数返回]AX不变
;ES不变
;DI随便输出的内容改变
;[注意事项]
;[前提函数]
;****************函数开始****************
tableExdb'0123456789ABCDEF'

outHax_Ex:pushax
pushbx
pushcx
pushdx
pushes

movbx,es
cmpbx,0b800h
jeoutHax_Ex0
movbx,0b800h
moves,bx;如果未设置显存,则先设置显存

outHax_Ex0:movdl,al;备份AX的低字节
movcx,2

outHax_Ex1:
pushcx
moval,ah;复制AX的高字节
movcl,4
shrah,cl;高字节右移4位
andal,00001111b;低字节取最右边4位

movbh,0
movbl,ah
movbl,tableEx[bx]
moves:[di],bl
adddi,2

movbl,al
movbl,tableEx[bx]


moves:[di],bl
adddi,2

movah,dl

popcx
loopoutHax_Ex1

popes
popdx
popcx
popbx
popax
ret
;****************函数结束****************


;****************函数说明****************
;[函数功能]以十六进制字符输出寄存器AX中的内容
;[函数参数]AX待输出的数据
;ES显存段地址
;DI显存位置指针
;[函数返回]AX不变
;ES不变
;DI不变
;[注意事项]
;[前提函数]
;****************函数开始****************
tabledb'0123456789ABCDEF'

outHax:pushax
pushbx
pushcx
pushdx
pushes
pushdi

movdi,160*10+2*3

movbx,es
cmpbx,0b800h
jeoutHax0
movbx,0b800h
moves,bx;如果未设置显存,则先设置显存

outHax0:movdl,al;备份AX的低字节
movcx,2

outHax1:
pushcx
moval,ah;复制AX的高字节
movcl,4
shrah,cl;高字节右移4位
andal,00001111b;低字节取最右边4位

movbh,0
movbl,ah
movbl,table[bx]
moves:[di],bl
adddi,2

movbl,al
movbl,table[bx]
moves:[di],bl
adddi,2

movah,dl

popcx
loopoutHax1

popdi
popes
popdx
popcx
popbx
popax
ret
;****************函数结束****************
codeends
endmain
;------------------------------主程序结束------------------------------

60h,64h,端口,汇编
[解决办法]
这种代码要在true dos下运行,不能在Nt下运行,因为系统有保护。

热点排行