我遇到了一个问题,我想知道是否按下了右移键,因此我有了这段汇编代码:
mov ah,2
int 16h ;calling INT 16,2 - Read Keyboard Flags interrupt
mov ah,10000000b
shl al,7
and al,10000000b
cmp al,ah ;check if first bit is 1
je rshift
jmp final
rshift:
mov ah,9
lea dx,rsh ;rsh is a string that says that "right shift button has been pressed"
int 21h
jmp final
final: ; quit program
mov ax,4c00h
int 21h
为什么它不起作用?我认为问题在于 int 16,2 没有正常工作,如果是这样的话,为什么会这样呢?下面是 INT 16,2 应该做的事情:
AH = 02
on return:
AL = BIOS keyboard flags (located in BIOS Data Area 40:17)
|7|6|5|4|3|2|1|0| AL or BIOS Data Area 40:17
| | | | | | | `---- right shift key depressed
| | | | | | `----- left shift key depressed
| | | | | `------ CTRL key depressed
| | | | `------- ALT key depressed
| | | `-------- scroll-lock is active
| | `--------- num-lock is active
| `---------- caps-lock is active
`----------- insert is active
我没有看到消息,我在调试中查看了AL寄存器,在我调用INT 16,2之后它似乎没有改变。我正在运行Win 7操作系统的x86架构上,并且正在使用tasm工具。
ping -n 5 localhost && test.exe
(假设test.exe是上面的程序),并且有5秒钟的时间来按下(并保持)所需的键。 - atzzfor /L %I in (1,1,10000) do ( ping -n 2 localhost > nul & test.exe )
(抱歉,我此刻身边没有Windows,所以上面的代码未经测试) - atzz