注册 登录
编程论坛 汇编论坛

关于delete,home等键输入问题

wingfeng 发布于 2009-10-22 12:59, 1515 次点击
程序代码:

code segment
assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax   
   
    mov ah,1    ;输入
    int 21h

    mov ah,2
    mov dl,al
    int 21h


    mov ah,1
    int 21h
    mov ah,4ch
    int 21h

code ends
end start


程序代码如上所示,当我输入g,它会输出g,但是当我输入delete,及home等特殊键的时候就出现奇怪的事了,请问是怎么回事??
15 回复
#2
wingfeng2009-10-22 21:25
啊,,,没有人碰到过这个情况吗??还是说这个情况很特殊啊???
#3
东海一鱼2009-10-22 22:04
没什莫特殊的,很正常啊。如果你知道它们(delete、Home、PageUp、PageDown)的扫描码的话。
#4
wingfeng2009-10-23 07:41
貌似有点明白了,那请问它们的扫描码是多少啊?
#5
东海一鱼2009-10-23 08:46
Delete          E0 53
HOME            E0 47
Page Down       E0 51
Page Up         E0 49
Left Windows    E0 5B
PrtSc           E0 37
......................

如果你有够细心,你能发现在你输入Delete键,你的程序退出的同时屏幕回显了一个S。而S的ASCII码正是53h。其他雷同。
#6
wingfeng2009-10-23 09:04
的确退出的时候显示了个S,但在S前还有个空格,请问这个是怎么回事?还有delete的ASCII值是多少(我被搞糊涂了)?
#7
东海一鱼2009-10-23 17:44
code segment
assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax     
     
    mov ah,1    ;输入
    int 21h
 
    mov ah,2
    mov dl,al
    or  dl,50h         ;加一句这个,你运行一下就明白了。
    int 21h
 
 
    mov ah,1
    int 21h
    mov ah,4ch
    int 21h
 
code ends
end start




[ 本帖最后由 东海一鱼 于 2009-10-23 17:45 编辑 ]
#8
wingfeng2009-10-23 19:09
我调试过了,但是还是没有明白什么,能不能说明白点啊???
#9
东海一鱼2009-10-23 20:55
01h功能是过滤控制码并回显,因为delete是双字节扫描码。所以过滤后变成了00h 53h,00h是不可显示字符。所以被02h功能显示为空格。

但是输入缓冲区内还存在一个53h,所以被第二个01功能捕获回显为S.

这个程序的特殊之处就在于用单步跟踪时,单步中断会影响到输入缓冲区。所以看不出产生的影响。

正因为如此,我上面加入or  dl,50h 这句就是要把原来不可见的00h空格给显示出来(P)。这样你就看明白了。        
#10
wingfeng2009-10-24 08:15
恩,是听的差不多明白了,那是不是这些特殊键在这种程序(我上面的程序)中的这种特殊情况需不需要管它啊? 还是说不必管它??
#11
wingfeng2009-10-25 09:00
还有个重要的问题

    mov ah,1    ;输入
    int 21h
执行上面语句,然后我再按下delete,照理说mov ah,1功能键是将delet的ascii值放入al中的,如果al中存放的是delet的扫描码,
那请问,我该如何计算del它的ascii中一的个数啊??
#12
东海一鱼2009-10-25 10:30
不跟你解释了,自己看。搞清楚概念最重要。

01H、07H和08H —从标准输入设备输入字符
02H —字符输出
03H —辅助设备的输入
04H —辅助设备的输出
05H —打印输出
06H —控制台输入/输出
09H —显示字符串
0AH — 键盘缓冲输入
0BH —检测输入状态
0CH —清输入缓冲区的输入功能
(1)、功能01H、07H和08H  
功能描述:从标准输入设备(如:键盘)读入一个字符。该中断在处理过程中将一直处于等待状态直到有字符可读为止。该输入还可被重定向,如果这样做,则无法判断文件是否已到文件尾
入口参数:AH=01H,过滤掉控制字符,并回显
 =07H,不过滤掉控制字符,不回显
 =08H,过滤掉控制字符,不回显
出口参数:AL=输入字符的ASCII码
(2)、功能02H
功能描述:向标准输出设备(如:屏幕)输出一个字符。该输出还可被重定向,如果这样做,则将无法判断磁盘是否满
入口参数:AH=02H
DL=待输出字符的ASCII码
出口参数:无
8)、功能0AH
功能描述:从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入(输入的字符在标准的输出设备上有回显)。如果该输入操作被重定向,那么,将无法判断文件是否已到文件尾
入口参数:AH=0AH
DS:DX=存放输入字符的起始地址
接受输入字符串缓冲区的定义说明:
  1、第一个字节为缓冲区的最大容量,可认为是入口参数;
  2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
  3、从第三个字节开始存放实际输入的字符串;
  4、字符串以回车键结束,回车符是接受的最后一个字符;
  5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并发出响铃,直到输入“回车”键才结束输入。  
例如:
  BUFF 80, ?, 80 DUP(?)   ;最多接受80个字符
出口参数:无
(9)、功能0BH
功能描述:检查标准输入设备上是否有字符可读。该输入操作可被重定向
入口参数:AH=0BH
出口参数:AL=00H——无字符可读;FFH——有字符可读
(10)、功能0CH
功能描述:清空当前的标准输入缓冲区,再读入字符。其输入操作可被重定向
入口参数:AH=0CH
AL=01H、06H、07H、08H或0AH
出口参数:若入口参数AL为0AH,则DS:DX=存放输入字符的起始地址,否则,出口参数AL=输入字符的ASCII码
#13
wingfeng2009-10-25 11:32
回复 12楼 东海一鱼
回答一下我这个问题吧(急,帮下,谢谢!)

我想按下delete,然后计算出delete的ascii值的二进制中1的个数!!
但是我用如下代码输入不行
    mov ah,1    ;输入
    int 21h
那请问,我该如何计算del它的ascii值的二进制中1的个数啊??
#14
东海一鱼2009-10-25 20:19
普通键输入的是扫描码,返回在al中的是ascii值。

delete这类的键没有ascii值,返回的就是双字节扫描码。第一字节是0,第二字节是53h。

所以你可以判断一下,如果收到0就调用2号功能再读一次。

过去DOS下可以写TSR程序直接截获int21的1号功能,以满足自己的特殊需求。
#15
wingfeng2009-10-26 08:01
那就是说我不能通过按下delete来计算1的个数了?那ASCII表中的del的值有什么用?
#16
wingfeng2009-10-27 11:51
最后一个问题怎么没人回我一下?
1