这是我的第一个问题。该程序的本质是逐字符读取行,并禁止外来字符,如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
我试图用键盘移位状态标志检查ctrl是否被按下,但当我松开键时,我和ctrl一起按下的所有按钮都会打印
cmp al, 0 ;check ASCII jne ASCII mov ah, 00h int 16h
接收到0后再次询问对于某些DOS键盘相关功能的操作来说是典型的。BIOS的键盘功能不是那样工作的!
不允许特殊键干扰结果的更实用的解决方案是只接受ASCII码为32或以上的键。一个例外是当然输入。
read_loop:
mov ah, 00h
int 16h
cmp al, 13 ; ENTER?
je next
cmp al, 32 ;check ASCII
jb read_loop
mov str_record[si], al
mov ah, 02h ; display
mov dl, al
int 21h
inc si
cmp si, 40 ;check max_len
jne read_loop
next: