汇编语言单字符输入简述


控制台模式下的单字符输入有些复杂。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.inc
INCLUDE Macros.inc

.code
main PROC

L1: mov    eax,10             ; 消息处理带来的延迟
    call    Delay
    call    ReadKey           ; 等待按键
    jz    L1

    test    ebx,CAPSLOCK_ON   
    jz    L2
    mWrite <"CapsLock is ON",0dh,0ah>
    jmp    L3

L2:    mWrite <"CapsLock is OFF",0dh,0ah>

L3:    exit
main ENDP
END main