我想学习如何防止键盘在DOS下向屏幕和scanf
发送多个字符。我正在使用内联汇编的Turbo-C。
如果键盘输入的字符是:
mmmmmmmmyyyyy nnnnnaaaaammmmmmeeeeee iiiiiissss HHHHaaaaiiiimmmm
则在控制台上看到并由scanf
处理的字符应为:
my name is Haim
基本的输出来自我不能触摸的C代码。我必须实现eliminate_multiple_press
和uneliminate_multiple_press
,而不触碰中间的代码。
到目前为止,我写的Turbo-C代码如下:
#include <stdio.h>
#include <dos.h>
#include <string.h>
volatile char key;
volatile int i=0;
void interrupt (*Int9save) (void);
void interrupt kill_multiple_press()
{
asm{
MOV AL, 0
MOV AH,1
INT 16h
PUSHF
CALL DWORD PTR Int9save
MOV AX,0
}
asm{
JZ notSet
MOV key, AL
MOV AH, 04H
INT 16H
}
notSet:
//I am not sure what to do from here...............
I also know that it should be related to the zero flag, but what I
wrote so far didn`t effect on multiple characters.
}
void eliminate_multiple_press()
{
Int9save=getvect(9);
setvect(9,kill_multiple_press);
}
void uneliminate_multiple_press()
{
setvect(9,Int9save);
}
void main()
{
char str[10000]="";
clrscr();
eliminate_multiple_press();
printf("Enter your string: ");
scanf("%s",&str);
printf("\n%s",str);
uneliminate_multiple_press();
}
我得到的与解决方案相关的信息是可以在这个链接中找到的键盘BIOS例程:
我遇到的问题可能与不知道在标签notSet
处该怎么做有关。解决方案似乎与使用缓冲区和寄存器AX(特别是AL)有关,但我真的不知道如何使scanf
获取我需要的结果。有人有任何想法如何完成这段代码以达到期望的效果吗?
16h
函数01h
是一个BIOS调用,用于读取键盘状态。如果按下了键,该函数将会返回扫描码和其ASCII字符分别在AH
和AL
寄存器中,并且Z
标志位清零。这或多或少相当于MS C函数库中的kbhit()
函数。但它并不会读取键盘,状态会一直保持,直到通过中断16h
函数00h
读取按键,这或多或少相当于MS C函数库中的getch()
函数。这可能解释了为什么您从您认为的一个按键中收到多个值。 - Weather Vane