8086汇编中调用int 33h后BX寄存器始终为1的问题
问题分析与解决方案
你的问题根源在两个核心操作上:
- 重复重置鼠标:每次调用
mouse_click都执行mov ax,0h; int 33h重置鼠标,这完全没必要——鼠标初始化只需要在程序启动时做一次,反复重置会打乱驱动的状态记录,直接导致第二次调用时错误报告按键按下。 - 未处理按键释放:第一次检测到左键按下后,没有等待用户释放按键,鼠标驱动会一直保留“按键按下”的状态,下次调用检测时自然直接返回
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,提问作者ניר עוז
相关产品推荐
相关产品推荐

