一、每次都写个题记
我的电脑键盘映射对应第一个:http://www.brokenthorn.com/Resources/OSDevScanCodes.html
说了好多,其实看不太懂:http://www.brokenthorn.com/Resources/OSDev19.html
端口操作两个:0x60(数据端口) 0x64(命令端口)
注意点:1.中段结束EOI发送
2.键盘如果不读取内容,是自动添置的,下一次数据填充不进来的
3.键盘每次有两次数据的 mark break(过滤掉)
4.很蛋疼一点 每次端口读写的时候注意 xor eax,eax
键盘中断实现步骤1.前面说过的实例化中断对应的中断向量,开启键盘中断
2.通过60读取内容,查找对应的数据
3.上面的注意点,
好了一个简单的键盘中断可以工作了
二、代码
;键盘中断的处理
key_interrupt:
pushad
xor eax,eax
mov al,0x20 ;中断结束命令EOI
out 0xa0,al ;向8259A从片发送
out 0x20,al
mov al,0xAD ;关闭键盘
out 0x64,al
;获取状态
in al,0x64
test al,0x01
jz .end ;结束 输出缓冲区没有内容
in al,0x60 ;读取数据
test al,0x80
jnz .end
mov ecx,eax
;得到数据段的地址
mov eax,core_data_seg_sel
mov ds,eax
mov ebx,key_map
mov byte cl,[ebx+ecx]
call put_char
.end:
mov al,0xAE ;开启键盘
out 0x64,al
popad
iret
下面是个效果图:
![](http://static.oschina.net/uploads/space/2013/1230/145853_9Lkh_1185580.png)