彙編語言單字符輸入簡述

控制檯模式下的單字符輸入有些複雜。MS-Windows 爲當前安裝的鍵盤提供了驅動器。當一個鍵被按下時,一個 8 位的掃描碼 (scan code) 就被傳遞到計算機的鍵盤端口。當這個鍵被釋放時,就會傳遞第二個掃描碼。

MS-Windows 利用設備驅動程序將掃描碼轉換爲 16 位的虛擬鍵碼 (virtual-key code),即 MS-Windows 定義的用於標識按鍵用途的與設備無關數值。MS-Windows 生成含有掃描碼、虛擬鍵碼和其他信息的消息。這個消息放在 MS-Windows 消息隊列中,並最終進入當前執行程序線程(由控制檯輸入句柄標識)。

如果想要進一步瞭解鍵盤輸入過程,請參閱 Platform SDK 文檔中的 About Keyboard Input 主題。虛擬鍵常數列表位於本教程 \Examples\chll 目錄下的 VirtualKeys.inc 文件中。

Irvine32 鍵盤過程 Irvine32 鏈接庫由兩個相關過程:






  • ReadChar:等待鍵盤輸入一個 ASCII 字符,並用 AL 返回該字符。

  • ReadKey:過程執行無等待鍵盤檢查。如果控制檯輸入緩衝區中沒有等待的按鍵,則零標誌位置 1。如果發現有按鍵,則零標誌位清零且 AL 等於零或 ASCII 碼。EAX 和 EDX 的高 16 位被覆蓋。


如果 ReadKey 過程中的 AL 等於 0,那麼用戶可能按下了特殊鍵(功能鍵、光標箭頭等)。AH 寄存器爲鍵盤掃描碼。DX 爲虛擬鍵碼,EBX 爲鍵盤控制鍵狀態信息。

下表爲控制鍵值列表。調用 ReadKey 之後,可以用 TEST 指令檢查各種鍵值。





含義 含義
CAPSLOCK_ON CAPSLOCK 指示燈亮 RIGHT_ALT_PRESSED 右 ALT 鍵被按下
ENHANCED_KEY 被按下增強的 RIGHT_CTRL_PRESSED 右 CTRL 鍵被按下
LEFT_ALT_PRESSED 該鍵是左 ALT 鍵 SCROLLLOCL_ON SCROLLLOCK 指示燈亮
LEFT_CTRL_PRESSED 左 CTRL 鍵被按下 SHIFT_PRESSED SHIFT 鍵被按下
NUMLOCK_ON NUMLOCK 指示燈亮

ReadKey 測試程序

下面是 ReadKey 測試程序:等待一個按鍵,然後報告按下的是否爲 CapsLock 鍵。程序應考慮延遲因素,以便在調用 ReadKey 時留出時間讓 MS-Windows 處理其消息循環:


; 測試 ReadKey    ( TestReadkey. asm)INCLUDE Irvine32.incINCLUDE Macros.inc.codemain PROCL1: mov    eax,10             ; 消息處理帶來的延遲    call    Delay    call    ReadKey           ; 等待按鍵    jz    L1    test    ebx,CAPSLOCK_ON       jz    L2    mWrite <"CapsLock is ON",0dh,0ah>    jmp    L3L2:    mWrite <"CapsLock is OFF",0dh,0ah>L3:    exitmain ENDPEND main



圖片


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章