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

8086汇编中调用int 33h后BX寄存器始终为1的问题

问题分析与解决方案

你的问题根源在两个核心操作上:

  1. 重复重置鼠标:每次调用mouse_click都执行mov ax,0h; int 33h重置鼠标,这完全没必要——鼠标初始化只需要在程序启动时做一次,反复重置会打乱驱动的状态记录,直接导致第二次调用时错误报告按键按下。
  2. 未处理按键释放:第一次检测到左键按下后,没有等待用户释放按键,鼠标驱动会一直保留“按键按下”的状态,下次调用检测时自然直接返回BX=1。

修改后的代码

; 鼠标初始化移到程序启动阶段,仅执行一次
init_mouse:
    mov ax,0h 
    int 33h       ; 重置鼠标(程序启动时做一次即可)
    mov ax,1h 
    int 33h       ; 显示鼠标,后续保持显示状态
    ret

proc mouse_click
not_pressed:
    mov ax,3h 
    int 33h 
    
    cmp bx, 01h    ; 检查左键是否按下
    jne not_pressed 

    ; 记录鼠标点击坐标
    shr cx, 1   
    mov [left_pressed_x], cx    
    mov [left_pressed_y], dx    
    
    ; 等待左键释放,避免下次检测误判状态
wait_release:
    mov ax,3h
    int 33h
    cmp bx, 01h
    je wait_release
    
    mov ax, 2h  
    int 33h       ; 隐藏鼠标
    
    mov bh, 0   
    mov ah, 0Dh  
    int 010h      ; 获取点击位置的像素颜色
    
    mov [left_pressed_color], al   
    add [left_pressed_color], '0'   ; 将颜色值转为ASCII
    
    mov ax, 1h 
    int 33h       ; 重新显示鼠标
    ret
endp mouse_click

关键修改说明

  • 移除过程内的鼠标重置:把鼠标初始化和显示逻辑放到程序启动时的单独过程,仅执行一次,避免驱动状态混乱。
  • 添加释放等待循环:记录坐标后循环检测,直到左键释放,确保驱动状态更新,下次调用时不会误报按键按下。
  • 简化冗余操作:去掉过程内重复的鼠标显示初始化,让逻辑更简洁清晰。

内容的提问来源于stack exchange,提问作者ניר עוז

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:17:31