如何在汇编中删除键盘缓冲区?

发布于 2025-02-07 12:13:57 字数 1594 浏览 2 评论 0原文

当我在键盘上按'h'时,我的代码会打印出“ hi”,但是当我不停地按几秒钟时,它仍会延迟打印“ hi”。我敢肯定会发生这种情况,因为当我按'H'时,它会“垃圾邮件”键盘缓冲区,并且我认为每次输入proc“键”以使其正常工作时,我需要重置或删除键盘缓冲区。我可以使用任何中断吗?这是代码:

IDEAL
MODEL small
STACK 100h


DATASEG

timeEnter dw ?
mil db ?
count db ?
hi dw ? 
message db 'hi',10,13,'$'


CODESEG


proc delaytime
push bp
mov bp, sp

push ax
push bx
push cx
push si
push dx
push di

    mov bl, [bp+4] ;offset time enter
    mov [mil],0
    mov [count],0

    mov ah, 2Ch
    int 21h
    mov [mil], dl
    jmp L1
L2:
    inc [count]
    mov [mil], dl
L1:
    mov ah, 2Ch
    int 21h
    cmp dl, [mil]
    je L1
    cmp [count],bl
    jne L2


pop di
pop dx
pop si 
pop cx
pop bx
pop ax
pop bp
ret 2
endp delaytime

proc key
push bp
mov bp,sp
push ax
push bx
push cx
push si
push dx
push di



    mov [hi],0
    mov ah, 01
    int 16h
    
    jz L3
    
    mov ah, 00h
    int 16h ;al=ascii charachter
    
    cmp al, 68h
    jne L3
    mov [hi],1
    
    
    
    
    
L3:



pop di
pop dx
pop si 
pop cx
pop bx
pop ax
pop bp
ret 
endp key

















start :
    mov ax, @data
    mov ds, ax
    
L:
    ; Graphic mode
    mov ax, 13h
    int 10h
    
    call key
    cmp [hi],1
    jne L4
    
    ;print
    mov dl, 15   ;J
    mov dh, 2    ;I
    mov bh, 0     ;Display page 0
    mov ah, 02h   ;SetCursor
    int 10h
    mov dx, offset message
    mov ah, 09h   ;DispayString
    int 21h 



L4: 

    mov [timeEnter],3
    push [timeEnter]
    call delaytime


    
    ;text mode 
    mov ah, 0
    mov al, 2
    int 10h

    jmp L
    
exit :
mov ax, 4c00h
int 21h
END start

I have this code that prints "hi" when I press 'h' on the keyboard, but when I press it non-stop for a few seconds, It still prints "hi" in a delay. I'm pretty sure it happens because when I press on 'h', it "spam" the keyboard buffer and I think I need to reset or delete the keyboard buffer every time I'm entering the proc "key" to make it work. is there any interrupt I can use for this? Here's the code:

IDEAL
MODEL small
STACK 100h


DATASEG

timeEnter dw ?
mil db ?
count db ?
hi dw ? 
message db 'hi',10,13,'



CODESEG


proc delaytime
push bp
mov bp, sp

push ax
push bx
push cx
push si
push dx
push di

    mov bl, [bp+4] ;offset time enter
    mov [mil],0
    mov [count],0

    mov ah, 2Ch
    int 21h
    mov [mil], dl
    jmp L1
L2:
    inc [count]
    mov [mil], dl
L1:
    mov ah, 2Ch
    int 21h
    cmp dl, [mil]
    je L1
    cmp [count],bl
    jne L2


pop di
pop dx
pop si 
pop cx
pop bx
pop ax
pop bp
ret 2
endp delaytime

proc key
push bp
mov bp,sp
push ax
push bx
push cx
push si
push dx
push di



    mov [hi],0
    mov ah, 01
    int 16h
    
    jz L3
    
    mov ah, 00h
    int 16h ;al=ascii charachter
    
    cmp al, 68h
    jne L3
    mov [hi],1
    
    
    
    
    
L3:



pop di
pop dx
pop si 
pop cx
pop bx
pop ax
pop bp
ret 
endp key

















start :
    mov ax, @data
    mov ds, ax
    
L:
    ; Graphic mode
    mov ax, 13h
    int 10h
    
    call key
    cmp [hi],1
    jne L4
    
    ;print
    mov dl, 15   ;J
    mov dh, 2    ;I
    mov bh, 0     ;Display page 0
    mov ah, 02h   ;SetCursor
    int 10h
    mov dx, offset message
    mov ah, 09h   ;DispayString
    int 21h 



L4: 

    mov [timeEnter],3
    push [timeEnter]
    call delaytime


    
    ;text mode 
    mov ah, 0
    mov al, 2
    int 10h

    jmp L
    
exit :
mov ax, 4c00h
int 21h
END start

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文