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