|
主题 : : 键盘缓冲区的学习 [待解决] |
回复[ 2次 ]
点击[ 356次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-02-10 19:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:0
注册日期:2011-01-04 11:04 |
键盘缓冲区的学习:
当一个按键按下去之后,计算机做如下的动作:
1)键盘产生扫描码
2)扫描码送入60H端口
3)引发9号中断
4) CPU执行9号中断例程处理键盘输入
键盘状态字起始地址:0040:0017 长度为2字节即1个字
键盘缓冲区起始地址:0040:001a 长度为36字节(20H)即16个字
其中包含:
键盘缓冲区首地址 0040:001a 占2个字节
键盘缓冲区尾地址 0040:001c 占2个字节
存放15个键盘输入 0040:001e-0040:003b 占30个字节
(一个键盘输入占用2个字节,低字节存放ASCII码,高字节存放扫描码。例如:a:1e61)
保留字1个用于判断缓冲区是满还是空. 0040:003c 占2个字节
这是一个环形队列的数据结构。
例子:
下面的小程序,模拟键盘,输入DEBUG,回车,r,回车,Q,回车
代码如下:
assume cs:code
code segment
start:
mov ax, 0040h ;键盘缓冲区段地址
mov ds, ax ; 送入ds
mov word ptr ds:[001ah], 001eh ; 键盘缓冲区首指针指向扫描码和ASCII码存放的首地址
mov bx, 001eh ; bx指键盘输入缓冲区首地址
mov word ptr ds:[bx], 2044h ; D
;将字母'D'的扫描码和ASCII码放入键盘输入缓冲区首地址
mov word ptr ds:[bx+2], 1245h ; E
;接着放入字母'E'的扫描码和ASCII码
mov word ptr ds:[bx+4], 3042h ; B
mov word ptr ds:[bx+6], 1655h ; U
mov word ptr ds:[bx+8], 2247h ; G
mov word ptr ds:[bx+10], 1c0dh ; return
;送入一个回车,执行命令
mov word ptr ds:[bx+12], 1372h ; r
;送入字母'r',显示寄存器内容
mov word ptr ds:[bx+14], 1c0dh ; return
; 送入回车,执行'r'命令
mov word ptr ds:[bx+16], 1051h ; q 送入'q'
mov word ptr ds:[bx+18], 1c0dh ; return
;执行'q'命令,退出debug
add bx,20h
mov ds:[001ch], bx ;
;调整键盘缓冲区尾指针,指向最后一个键盘输入
mov ax, 4c00h
int 21h
code ends
end start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向大家学习,QQ:1250609960;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0000:0019不知道干什么用的? | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-02-15 00:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28 |
1. 写的挺有想法的,相当好
2. 0:19?中断向量表? | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-02-15 23:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:0
注册日期:2011-01-04 11:04 |
多谢朋友关注!
重读自己的程序发现新的问题,已解决!
assume cs:code
code segment
start:
mov ax, 0040h ;键盘缓冲区段地址
mov ds, ax ; 送入ds
mov word ptr ds:[001ah], 001eh ; 键盘缓冲区首指针指向扫描码和ASCII码存放的首地址
mov bx, 001eh ; bx指键盘输入缓冲区首地址
mov word ptr ds:[bx], 2044h ; D
;将字母'D'的扫描码和ASCII码放入键盘输入缓冲区首地址
mov word ptr ds:[bx+2], 1245h ; E
;接着放入字母'E'的扫描码和ASCII码
mov word ptr ds:[bx+4], 3042h ; B
mov word ptr ds:[bx+6], 1655h ; U
mov word ptr ds:[bx+8], 2247h ; G
mov word ptr ds:[bx+10], 1c0dh ; return
;送入一个回车,执行命令
mov word ptr ds:[bx+12], 1372h ; r
;送入字母'r',显示寄存器内容
mov word ptr ds:[bx+14], 1c0dh ; return
; 送入回车,执行'r'命令
mov word ptr ds:[bx+16], 1051h ; q 送入'q'
mov word ptr ds:[bx+18], 1c0dh ; return
;执行'q'命令,退出debug
add bx,16h ;此处已修改。
mov ds:[001ch], bx ;
;调整键盘缓冲区尾指针,指向最后一个键盘输入
mov ax, 4c00h
int 21h
code ends
end start
另外:0000:0019是打错的,想写0040:0019.
多谢 | | |
|