为什么按下ctrl时MASM会保存数据


这是我的第一个问题。该程序的本质是逐字符读取行,并禁止外来字符,如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:

最新更新