这是我的第一个问题。该程序的本质是逐字符读取行,并禁止无关字符,如F1,F2,插入键等。或与CTRL组合(Ctrl+C =〉心形符号)
下面是我的部分代码:
main:
mov si, 0
mov ax,@data
mov ds, ax
lea dx,message
mov ah, 09h ;print message
int 21h
mov ax, 40h ; load segment into AX
mov es, ax
read_loop:
mov ah, 00h
test byte ptr es:[17h], 04h ; is CTRL pressed?
jnz read_loop
int 16h
cmp al, 0 ;check ASCII
jne ASCII
mov ah, 00h
int 16h
jmp read_loop
ASCII:
cmp ah, 14
je read_loop
cmp al, 13 ; ENTER?
je next
test byte ptr es:[17h], 04h ; is CTRL pressed?
jnz read_loop
mov str_record[si], al
mov ah, 02h ; display
mov dl, al
int 21h
inc si
cmp si, 40 ;check max_len
je next
jmp read_loop
next:
cmp str_record[0], '$'
je quit
mov al, 3
int 10h
mov di, 0
mov ax, 3
int 10h
mov ah, 02h
mov dh, 2
mov dl, 15
int 10h
我尝试使用Keyboard Shift Status Flags检查是否按下了ctrl,但当我释放该键时,将打印与CTRL沿着按下的所有按钮
1条答案
按热度按时间gab6jxml1#
在收到0后再询问一次是典型的DOS键盘相关功能的操作方式。BIOS键盘功能不是这样工作的!
不允许特殊键干扰结果的更实际的解决方案是只接受ASCII码为32或更大的键。当然,Enter键是个例外。