Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如果没有按下键盘键,如何跳转_Assembly_Keyboard_Interrupt_Bios_Tasm - Fatal编程技术网

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

Assembly 如果没有按下键盘键,如何跳转,assembly,keyboard,interrupt,bios,tasm,Assembly,Keyboard,Interrupt,Bios,Tasm,没有按键时,是否有任何值或代码可用于跳转到另一个过程 cmp ah,(value of no pressed key) je (next procedure) 或者我是否可以使用任何中断,以便如果它看到没有按下键盘键,它将跳转到下一个过程?轮询键盘控制器状态寄存器的示例: in al,64h ; get status register test al,1 ; output buffer je NOKEY ;----------- ;----------- NOKEY: 编辑

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

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

或者我是否可以使用任何中断,以便如果它看到没有按下键盘键,它将跳转到下一个过程?

轮询键盘控制器状态寄存器的示例:

in   al,64h  ; get status register
test al,1    ; output buffer
je  NOKEY
;-----------

;-----------
NOKEY:

编辑:在本例中,我们只检查状态字节的第一位,如果设置了,输出缓冲区将填充一个或多个字节,我们可以使用以下端口指令从数据端口(60h)获取这些字节

另外,如果字节来自PS2鼠标(移动或鼠标单击),我们可以检查状态字节:

编辑2:我们可以从数据端口60h接收的字节称为“扫描代码”,它们可以分为按键时的生成代码、按键释放时的制动代码和附加通信协议代码

键盘中断服务程序(ISR)可用于IRQ1,如果出现IRQ1,则只需从IO端口60h读取(无需首先检查状态寄存器中的位0,因为我们知道,如果接收到IRQ1,数据来自第一个PS/2)、转换和回显ASCII或其他内容,向中断控制器发送EOI,最后从中断处理程序返回

但上面的示例仅用于演示如何轮询键盘端口。为此,我们必须在之前禁用IRQ1,以防止正在运行的键盘ISR在我们执行操作之前获取数据端口60h的输出缓冲区字节。

替换:

test al, 1
je nokey
作者:

这样,您的程序将检查寄存器是否实际为零。
使用“test al,1”只能检查您的号码是否为奇数。

您可以从端口60h读取输入。如果此时按下某个键,端口将包含该键的数字(而不是ascii码)。否则是零。 另一种方法是使用BIOS中断16h的函数ah=1。如果按下了未读取的键,则ascii码为al,扫描码为ah。如果已按下某个键,如果未按下任何键,则不会设置ZeroFlag设置ZeroFlag。如果未按下任何键,则ax不包含任何有用的值。调用此函数后,缓冲区将不会刷新。如果用户按下两个键,则首先读取第一个键。
另一种方式是DOS中断21h的函数ah=0bh。如果未按下任何键,Al将为0。如果按下某个键,al将为255。

。。。但是,这仅在禁用键盘中断时有效。否则,状态寄存器将始终指示“无按键数据存在”,因为键盘中断将从控制器中删除所有按键数据。cli mov al,2 out 21h,al STITH这不是问题的答案,作为对德克答案的评论是错误的<代码>测试al,1检查位0<代码>或al,al检查所有位。请看位的含义。什么是60h中断?它不是60h中断,而是60h端口。使用“in al,60h”,您可以读取此时按下的键的扫描码(扫描码不是ascii码)。端口60h似乎包含最后按下或释放的键的代码;如果未按下任何键,则该值不是0(根据osdev wiki上的信息)。也不可能通过简单读取端口60h来检查当前是否按下了键;“make”和“break”代码必须解释以检查是否按下了键!
test al, 1
je nokey
or al, al
jz nokey