汇编语言中如何检测CapsLock大小写锁定键状态
INT 16h 02h功能不兼容问题解决方案
直接读取内存地址获取CapsLock状态
你提到的0:0417h是实模式下BIOS实时维护的键盘状态标志存储地址,其中CapsLock状态对应该字节的第6位,位值为40h时代表CapsLock处于开启状态。该读取方式不依赖BIOS中断支持,在Emu8086、MASM编译的程序中都可以直接运行,示例代码如下:
xor ax, ax mov es, ax ; 将附加段寄存器指向0段 mov al, es:[0417h] ; 读取键盘状态字节到al寄存器 test al, 40h ; 检测CapsLock对应标志位 jnz caps_on ; 标志位置1则跳转到CapsLock开启的处理分支 ; 此处编写CapsLock关闭时的业务逻辑 jmp check_end caps_on: ; 此处编写CapsLock开启时的业务逻辑 check_end:
该地址的状态字节同时存储Shift、Ctrl、Alt、NumLock、ScrollLock等按键的实时状态,所有标志位定义和INT 16h 02h功能返回的状态值完全一致。
支持INT 16h 02h功能的运行环境说明
首先需要明确:INT 16h是主板BIOS提供的底层中断服务,和你使用的汇编器(MASM/Emu8086内置汇编器/TASM等)没有关系,调用失败的核心原因是你运行程序的模拟环境没有完整实现该BIOS子功能。
以下环境可完整支持INT 16h 02h功能调用:
- DOSBox:最常用的16位DOS程序运行模拟器,完整兼容标准BIOS键盘中断,用MASM/TASM编译生成COM/EXE文件后挂载到DOSBox中运行,即可正常调用该中断
- 原生DOS实模式环境:在纯DOS系统下直接运行编译后的程序,可调用所有标准BIOS中断服务
- Bochs x86模拟器:默认配置下搭载了完整的开源BIOS实现,对实模式中断的兼容度很高,适合汇编调试场景
INT 16h 02h功能的标准调用代码如下:
mov ah, 02h int 16h ; 中断返回后,键盘状态字节直接存储在AL寄存器中 test al, 40h ; 后续状态判断逻辑和直接读内存的写法完全一致
内容的提问来源于stack exchange,提问作者PandoraLH
相关产品推荐
相关产品推荐

