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

汇编中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:27:33