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

8086 DOS汇编简易绘图程序鼠标异常:绘制像素存在大量间隙

MS-DOS 8086汇编绘图像素间隙问题排查

首先明确:不是INT 10h中断被忽略——INT 10h是主动调用的BIOS显示服务,并非硬件触发的异步中断,程序只要主动调用它就能执行像素绘制,不存在"被忽略"的情况。你遇到的间隙问题,大概率是程序逻辑或鼠标交互处理的疏漏,核心原因和解决方向如下:

常见原因分析

  • 鼠标状态轮询逻辑错误
    如果你只在鼠标左键按下的瞬间(比如从松开转为按下的边缘)绘制一次像素,而非按住左键时持续跟踪鼠标位置并绘制,就会出现鼠标移动时仅能捕捉到少量位置点,导致5/6的像素间隙。
  • 轮询频率过低
    若主循环中存在不必要的延时(比如空循环等待),或者每次处理鼠标状态后执行了过多冗余操作,会导致程序无法及时跟上鼠标移动的速度,错过大部分位置点。
  • 鼠标坐标处理失误
    需确认你调用INT 33h获取的鼠标坐标是否正确匹配当前图形模式的像素坐标系:比如INT 33h 03h返回的CX是水平像素、DX是垂直像素,要确保当前已通过INT 10h切换到正确的图形模式(如04h=320x200 4色、0Dh=320x200 16色)。

修复步骤

  1. 调整主循环逻辑
    确保按住左键时持续轮询鼠标位置并绘制像素,示例核心代码:

    MAIN_LOOP:
        ; 获取鼠标状态与坐标
        mov ax, 03h
        int 33h          ; BX=按键状态, CX=X坐标, DX=Y坐标
        test bx, 01h     ; 检测左键是否按下(bit0置1)
        jz MAIN_LOOP     ; 未按下则继续等待
    
        ; 绘制当前位置像素
        mov ah, 0Ch      ; INT10h 0Ch: 绘制像素
        mov al, 0Fh      ; 像素颜色(白色,可按需修改)
        ; CX/DX直接复用鼠标返回的坐标
        int 10h
    
        jmp MAIN_LOOP    ; 立即回到循环,持续跟踪绘制
    
  2. 移除不必要的延时
    检查代码中是否存在loop空循环或其他延时操作,这类代码会大幅降低轮询频率,导致鼠标移动时无法及时捕获位置。

  3. 优化鼠标采样率(可选)
    若轮询逻辑正确但仍有间隙,可通过INT 33h 0Fh设置更高的鼠标采样率(比如100Hz),提升位置捕捉精度:

    mov ax, 0Fh
    mov cx, 100         ; 设置采样率为100次/秒
    int 33h
    

内容的提问来源于stack exchange,提问作者Balsamboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:57:40