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

ukxgm1gy  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(148)

这是我的第一个问题。该程序的本质是逐字符读取行,并禁止无关字符,如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沿着按下的所有按钮

gab6jxml

gab6jxml1#

cmp al, 0       ;check ASCII
jne ASCII
mov ah, 00h
int 16h

在收到0后再询问一次是典型的DOS键盘相关功能的操作方式。BIOS键盘功能不是这样工作的!
不允许特殊键干扰结果的更实际的解决方案是只接受ASCII码为32或更大的键。当然,Enter键是个例外。

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:

相关问题