我正在用x86汇编器编写程序,以在DOS下以16位实模式运行。
.model small
.stack 100h
.code
start:
mov dl, 4bh
loop1:
mov ah, 2h
int 21h
mov ah, 1h
int 16h
cmp al, 6bh
jne loop1
mov ah, 4ch
int 21h
end start
end
程序需要一直写入“ K”,并且在键盘上按下“ k”时,该程序应停止。
[一切正常,程序一直都写“ K”,当我在键盘上按“ k”时,我的程序停止了,但是,当我按键盘上的另一个按钮时(什么也不会发生),以及稍后再按“ k”按钮时, ,程序不会停止,而是一直打印“ K”。
我认为这是因为另一个按钮已填满缓冲区,但我不知道如何重设缓冲区或仅从缓冲区中取出最后按下了代码的缓冲区的最后一部分。
您是对的,键盘缓冲区不为空,并且DOS函数Int 16/AH=01h KEYBOARD - CHECK FOR KEYSTROKE不断返回第一个(非'k')键。如果支票检测到某些按键,则应用Int 16/AH=00h KEYBOARD - GET KEYSTROKE吞下它。代替
mov ah, 1h
int 16h
cmp al, 6bh
jne loop1
尝试
mov ah, 1h ; CHECK FOR KEYSTROKE
int 16h
jz loop1 ; Jump if none pressed.
mov ah, 0h ; GET KEYSTROKE
int 16h
cmp al, 6bh ; Check if it is 'k'.
jne loop1 ; If not, continue. Keybuffer is now empty.
当您在SO上发布一些源代码时,它应附带有关如何编译和链接的信息,还应选择适当的tags。