Как очистить данные из буфера клавиатуры после того, как DOS int 16h / AH = 1 обнаружит нажатие клавиши? - PullRequest
0 голосов
/ 28 апреля 2020

Я пишу программу на ассемблере x86 для запуска в 16-битном реальном режиме под DOS.

.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 "все время.

Я думаю, это потому, что эта другая кнопка заполнила буфер, и я не знаю, как ее сбросить или взять из буфера только последнюю часть буфера, где находится код последней нажатой кнопки.

1 Ответ

3 голосов
/ 28 апреля 2020

Вы правы, буфер клавиатуры не пуст и функция 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 

try

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, он должен сопровождаться информацией о том, как он компилируется и связывается, также выберите соответствующий теги .

...