我被困在這件事情,我想看看右shift鍵被按下,所以我有這樣的assambler代碼:8086彙編,INT 16,2
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.I'm運行Windows 7上的x86 arhitecture,和我與TASM工作
這應該是怎麼工作的?在運行程序之前,我是否必須按shift鍵,我已經測試過它,並且總是顯示結果爲零。我正在運行Win 7 x86,並且我用tasm進行了測試 – 2009-11-11 15:59:47
是的,您必須事先按shift鍵,因爲代碼沒有延遲(儘管不難添加延遲或將此代碼包裝到循環中)。在Windows下,你也可以這樣做:'ping -n 5 localhost && test.exe'(假設test.exe是上面的程序),並且在5秒鐘內按住(和保持)所需的鍵。 – atzz 2009-11-11 22:35:25
我已經開始考慮循環了......在Windows命令行中運行以下命令,您將能夠看到「交互式」更改的結果:) 'for/L%I in(1,1,10000) (ping -n 2 localhost> nul&test.exe)' (對不起,我目前沒有Windows在我附近,所以上面的行沒有經過測試) – atzz 2009-11-11 22:47:33