如果没有按下键盘键,如何跳转

时间:2014-11-30 06:58:09

标签: assembly keyboard interrupt bios tasm

当没有按下按键时,是否有任何值或代码可用于跳转到另一个程序?

cmp ah,(value of no pressed key)
je (next procedure)

或者是否有任何我可以使用的中断,以便如果它看到没有按下键盘键,它将会进入下一个程序?

3 个答案:

答案 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。