gpt4 book ai didi

assembly - 如何在 Assembly 中获取实时按键?

转载 作者:行者123 更新时间:2023-12-04 01:57:50 25 4
gpt4 key购买 nike

我有一个用 emu8086 编写的简单 EXE 代码,它在屏幕上移动一个字符(目前):

Preview

那个黄色的“*”用方向键移动。

问题是模拟器得到 16 个按键。我的意思是,当我如此快速地按键(或按住一个键)时,它会将按键保持在一个堆栈中,并根据它们移动“*”。例如:

Assembly Key presses

在上图中,“*”根据我之前按下的键移动了 14 次!

我不希望它在堆栈中保存我的按键操作。我怎样才能根据最后按下的键而不是堆栈做出实时 react ?

P.S.:这是我从用户那里获得按键的部分,在当前位置打印一个空字符并将“*”移动到新位置:

check_for_key:
; === check for player commands:
mov ah, 01h
int 16h
jz no_key

mov ah, 00h
int 16h

mov cur_dir, ah

; print ' ' at the location:
mov al, ' '
mov ah, 09h
mov bl, 0eh ; attribute.
mov cx, 1 ; single char.
int 10h

call move_star

最佳答案

BIOS 总是在缓冲区中处理键盘输入。您可以通过安装自己的中断处理程序来规避这种情况,但这可能有点矫枉过正。

您还可以确保您的例程比按键重复延迟更快。

但作为快速修复,您可以像这样更改输入检查:

check_for_key:
; === check for player commands:
mov ah, 01h
int 16h
jz no_key

check_for_more_keys:
mov ah, 00h
int 16h

push ax
mov ah, 01h
int 16h
jz no_more_keys
pop ax
jmp check_for_more_keys

no_more_keys:
pop ax

mov cur_dir, ah

这使得您的代码每次需要一个键时都读取整个缓冲区,因此它实际上只作用于检查时输入的最后键一个键。

关于assembly - 如何在 Assembly 中获取实时按键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com