当没有按下按键时,是否有任何值或代码可用于跳转到另一个程序?
cmp ah,(value of no pressed key)
je (next procedure)
或者是否有任何我可以使用的中断,以便如果它看到没有按下键盘键,它将会进入下一个程序?
答案 0 :(得分:1)
轮询键盘控制器状态寄存器的示例:
in al,64h ; get status register
test al,1 ; output buffer
je NOKEY
;-----------
;-----------
NOKEY:
http://wiki.osdev.org/%228042%22_PS/2_Controller
编辑:在这个例子中,我们只检查状态字节的第一位,如果设置了,输出缓冲区就会填充一个或多个字节,我们可以通过以下端口从数据端口(60h)获取(诸)指令。
如果字节来自PS2鼠标(移动或鼠标点击),我们可以检查状态字节:
test al,20h
jne NOKEY
编辑2:我们可以从数据端口60h接收的字节称为“扫描码”,如果按下某个键,它们可以分为生成代码,如果释放密钥则可以分为制动代码和其他通信协议码。
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html#ss1.1
键盘中断服务程序(ISR)可以使用IRQ1,如果发生IRQ1,则只需从IO端口60h读取(不需要首先检查状态寄存器中的位0,因为我们知道如果我们收到IRQ1,则数据来自第一个PS / 2,转换并回显ASCII或其他东西,将EOI发送到中断控制器,最后从中断处理程序返回。
但上面的示例仅用于展示如何轮询键盘端口。为此,我们必须先解除IRQ1,以防止正在运行的键盘ISR在我们可以执行之前获取数据端口60h的输出缓冲区的字节。
答案 1 :(得分:0)
替换:
test al, 1
je nokey
由:
or al, al
jz nokey
这样,程序会检查寄存器是否实际为零。 使用“test al,1”只会检查你的号码是否为奇数。
答案 2 :(得分:0)
您可以从端口60h读取输入。如果按下按键,则端口将包含密钥的编号(不是ascii代码)。否则就是零。 另一种方法是使用功能啊= 1的BIOS中断16h。如果按下了一个未读取的密钥,则ascii代码在al中,扫描代码在ah中。如果按下某个键,如果没有按任何键,则不设置ZeroFlag ZeroFlag已设置。如果没有按下任何键,则ax不包含任何有用的值。调用此函数后,不会刷新缓冲区。如果用户按下两个键,则首先读取第一个键。 另一种方法是DOS-interrupt 21h的函数啊= 0bh。如果没有按下任何键,则A1将为0。如果按下某个键,则al将为255。