首页 > 汇编语言 > 汇编语言MS-Windows编程
阅读:1,781
汇编语言单字符输入简述
控制台模式下的单字符输入有些复杂。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 链接库由两个相关过程:
如果 ReadKey 过程中的 AL 等于 0,那么用户可能按下了特殊键(功能键、光标箭头等)。AH 寄存器为键盘扫描码。DX 为虚拟键码,EBX 为键盘控制键状态信息。
下表为控制键值列表。调用 ReadKey 之后,可以用 TEST 指令检查各种键值。
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