汇编中int 10h ah=0Dh获取鼠标像素色始终返回0的问题求助
解决int 10h ah=0Dh始终返回像素颜色0的问题
嘿,我来帮你搞定这个问题!你的代码逻辑框架没问题,但几个关键细节没处理到位,导致读像素始终返回0,下面分点拆解原因和修复方案:
1. 核心问题:未切换到图形模式
int 10h ah=0Dh是图形模式专属的像素读取功能,如果当前系统处于文本模式,这个调用会返回无效值(通常是0)。你的代码里没有设置视频模式,系统默认大概率是文本模式,这才是根源!
修复方法:在初始化鼠标前,先切换到图形模式,比如常用的320x200 256色模式(模式号13h):
; 先设置图形模式 mov ax, 0x13 int 0x10 ; 然后初始化鼠标并显示指针 mov ax, 0 int 0x33h mov ax, 1h int 0x33h
2. 确认鼠标坐标与视频模式匹配
int 33h ax=4返回的鼠标坐标(CX=X,DX=Y)是像素级坐标,在模式13h下范围是X:0-319、Y:0-199,正好和int 10h ah=0Dh要求的坐标一致,这部分逻辑没问题。如果后续切换其他图形模式(比如640x200的0Eh模式),要注意对应坐标范围是否匹配。
3. 颜色对比逻辑的小提醒
在256色模式下,int 10h ah=0Dh返回的AL是颜色索引,不是直接的RGB值。默认调色板里索引4(二进制0100b)确实对应红色,但如果你的程序修改过调色板,这个对比会失效。如果要确保读取的是红色,也可以提前重置调色板,但默认环境下不需要额外操作。
修正后的完整代码示例
; 设置320x200 256色图形模式 mov ax, 0x13 int 0x10 ; 初始化鼠标并显示指针 mov ax, 0 int 0x33h mov ax, 1h int 0x33h check: ; 获取鼠标状态 mov ax, 3 int 0x33h cmp bx, 1 ; 检查左键是否按下 jne check ; 没按就循环等待 ; 获取鼠标当前坐标(CX=X, DX=Y) mov ax, 4 int 0x33h ; 读取当前坐标的像素颜色 mov ah, 0Dh mov bh, 0 ; 视频页号,默认0即可 int 0x10 ; 对比是否为红色(索引4,二进制0100b) cmp al, 0100b je print_white_screen ; 这里可以添加其他分支逻辑 ; ... print_white_screen: ; 实现清屏为白色的示例代码 mov ax, 0x0700 mov bh, 0x0F ; 白色属性 mov cx, 0 mov dx, 0x184F int 0x10 ; 后续业务逻辑 ; ...
额外注意事项
- 如果在DOSBox或其他模拟器中运行,确保模拟器的视频模式兼容性设置正确,部分老旧模式可能需要调整配置。
int 33h的鼠标功能依赖DOS鼠标驱动,纯实模式环境下要保证驱动已正常加载。
内容的提问来源于stack exchange,提问作者guy
相关产品推荐
相关产品推荐

