. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  各位有空啊,,帮我看看这程序,有关外中断的  [待解决] 回复[ 3次 ]   点击[ 271次 ]  
jackliu
[帖 主]   [ 发表时间:2008-09-15 10:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2008-09-05 11:19
各位有空啊,,帮我看看这程序,,, 
这程序主要用来搞键盘中断的,, 
程序运行作用是:当程序在以动画的形式慢慢的输出字符‘-’过程中可通过键盘中断,在任意时刻产生中断,之后在字符‘-’基础上加上中断产生的字符,如'-D‘这样输出,,, 
但不知怎么写好,,程序中好像只接受一次中断而于,之后就无效,也就是说,如果先按个’D‘那之后按什么都无效了,,, 
本人程序如下: 
CODE SEGMENT 
     ASSUME CS:CODE 
     START: MOV AL,11111101B  
            OUT 21H,AL ;开键盘中断 
            STI ;允许外中断 
            MOV SI,16H         
        L1: MOV AH,02H 
            MOV DL,'-' 
            INT 21H 

            MOV BX,0FFFH  ;延时作用 
            MOV CX,0FFFFH 
       TIME:LOOP TIME 
            DEC BX 
            JNZ TIME 

            MOV AH,01H ;读BIOS数据区中字符 
            INT 16H 
            CMP AL,'A' 
            JB PASS 
            MOV AH,02H ;输出BIOS数据区中字符 
            MOV DL, AL 
            INT 21H 
       PASS: DEC SI 
            JNZ L1 
            CLI ;屏蔽外中断 
       EXIT:MOV AH,4CH 
            INT 21H 
CODE ENDS 
     END START
younggay
[第1楼]   [ 回复时间:2008-11-06 18:35 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
你没发现你安了一个字符后,就一直重复显示这个字符么?这说明你的键盘缓冲区中一直有那个字符,每次都读缓冲区最前面那个字符,自然后面的就没法读取到了,这需要你在读取第一个字符后就要将这个字符从缓冲区中删除,所以你用
mov ah,01H
int 16h
是不行的,应该是
mov ah,0H
int 16h
这样才能让你的每个按键都显示出来。
不过,单单改掉这里,对于你的程序要求会产生一个新问题,就是那个‘-’不能自动走了。这个楼主在自己解决一下,如果再有问题,再来交流。
younggay
[第2楼]   [ 回复时间:2008-11-06 18:49 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
算了,还是吧修改后的代码给楼主贴上来吧。其实就是增加了一个删除键盘缓冲区字符的操作,否则,你只能显示第一个按键的字符,而且是重复的显示。
CODE SEGMENT  
     ASSUME CS:CODE  
     START: MOV AL,11111101B   
            OUT 21H,AL ;开键盘中断  
            STI ;允许外中断  
            MOV SI,16H          
        L1: MOV AH,02H  
            MOV DL,'-'  
            INT 21H  

            MOV BX,0FFFH  ;延时作用  
            MOV CX,0FFFFH  
       TIME:LOOP TIME  
            DEC BX  
            JNZ TIME  

            MOV AH,01H
            INT 16h    ;读BIOS数据区中字符 
            CMP AL,'A'
            JB PASS
 ;------------------------------
 ;增加一个删除键盘缓冲区功能的代码  
 ;------------------------------         
            MOV AH,0H  
            INT 16H   ;读取键盘缓冲区中的字符并删除该字符
 ;--------------------------------            
            MOV AH,02H ;输出BIOS数据区中字符  
            MOV DL, AL  
            INT 21H  
       PASS: DEC SI  
            JNZ L1  
            CLI ;屏蔽外中断  
       EXIT:MOV AH,4CH  
            INT 21H  
CODE ENDS  
     END START
younggay
[第3楼]   [ 回复时间:2008-11-06 18:50 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
建议楼主看看《汇编语言》的第17章的内容,键盘的读取和键盘缓冲区的原理了解一下。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved