You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言中如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:06:22