. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  键盘缓冲区的学习  [待解决] 回复[ 2次 ]   点击[ 356次 ]  
chinaljg
[帖 主]   [ 发表时间: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不知道干什么用的?
zaixuexi
[第1楼]   [ 回复时间:2011-02-15 00:00 ]   [引用]   [回复]   [ top ] 
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28
1. 写的挺有想法的,相当好
2. 0:19?中断向量表?
chinaljg
[第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.
多谢
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved