汇编代码ciclo循环无法退出,疑似鼠标输入读取异常
汇编代码中ciclo循环无法退出及鼠标输入读取问题
以下是你的代码中导致ciclo循环无法退出、鼠标输入未正确响应的核心问题及修复方案:
核心问题分析
- 鼠标点击未处理按键释放:当前代码仅检测左键按下状态(
bx=01h),但没有等待按键释放,导致一旦左键按下,程序会无限触发clique分支,甚至因为重复进入判断逻辑陷入死循环。 - 坐标判断逻辑顺序错误:
Jogo标签下的坐标判断逻辑颠倒,导致点击"JOGAR"区域时条件永远不满足,无法跳转到vamos_jogar。 - 冗余的DOS调用:
opcoes_iniciais中的mov ah,7; int21h是无回显读键盘调用,会卡住程序等待键盘输入,直接阻断鼠标逻辑执行,必须移除。
修复后的关键代码片段
1. 修复鼠标检测逻辑(添加按键释放等待)
ciclo: mov ax, 03h ; 获取鼠标位置及按键状态 int 33h cmp bx, 01h ; 检测左键是否按下 je clique jmp ciclo clique: ; 等待左键释放,避免重复触发 wait_release: mov ax, 03h int 33h cmp bx, 01h je wait_release Jogo: ; 正确的坐标范围判断:y在20-35之间,x在120-175之间 cmp dx, 20 jb ciclo cmp dx, 35 ja ciclo cmp cx, 120 jb ciclo cmp cx, 175 ja ciclo jmp vamos_jogar
2. 移除冗余的DOS调用
在opcoes_iniciais中删除以下两行:
mov ah, 7 ; deixar letra grande int 21h
(注:AH=7是DOS的无回显读字符功能,和设置字体大小无关,此处属于错误调用)
3. 补充其他菜单选项的判断逻辑(可选)
如果需要支持"TOP 5"、"CREDITOS"、"SAIR"的点击检测,可在Jogo分支后添加类似的坐标判断:
Top5: cmp dx, 42 jb ciclo cmp dx, 57 ja ciclo cmp cx, 120 jb ciclo cmp cx, 175 ja ciclo ; 此处添加TOP5分支逻辑 jmp ciclo Creditos: cmp dx, 67 jb ciclo cmp dx, 82 ja ciclo cmp cx, 120 jb ciclo cmp cx, 195 ja ciclo ; 此处添加CREDITOS分支逻辑 jmp ciclo Sair: cmp dx, 90 jb ciclo cmp dx, 105 ja ciclo cmp cx, 120 jb ciclo cmp cx, 175 ja ciclo mov ax, 4c00h ; 退出程序 int 21h
修复说明
- 新增
wait_release循环,确保只有在左键按下并释放后才处理点击事件,避免重复触发。 - 调整坐标判断顺序,先判断y坐标是否在目标区域范围内,再判断x坐标,确保逻辑正确。
- 移除错误的DOS调用,让鼠标初始化和检测逻辑正常执行。
内容的提问来源于stack exchange,提问作者Just do it
相关产品推荐
相关产品推荐

