为何我的汇编代码无法识别屏幕上第二个按钮的点击操作?
问题分析与修复方案
你的第二个按钮点击无响应的核心问题是代码逻辑顺序错误,导致第二个按钮的检查代码永远无法被执行到,具体问题和修复方法如下:
1. 核心逻辑缺陷
当前代码的执行流程存在致命问题:
- 获取鼠标状态后,先严格校验第一个按钮的坐标范围(cx 112-452,dx 81-153)
- 只要鼠标坐标不在这个范围内(比如第二个按钮的dx是157-198,远大于153),就会通过
ja waitforpress直接跳回循环开头,根本碰不到第二个按钮的检查代码check_second_button - 即便鼠标在第一个区域内但未点击(bx≠1),此时dx也处于81-153区间,和第二个按钮要求的dx 157-198完全不重叠,第二个按钮的检查也不可能通过
2. 修复后的代码
调整检查顺序,让两个按钮的逻辑互不阻塞,修改后的代码如下:
proc whatPress pusha call setUpMagicNumbers call startscreen mov ax,00 int 33h ; 初始化鼠标 mov ax,01 int 33h ; 显示鼠标光标 waitforpress: ;call Esc_end mov ax, 3 int 33h ; 获取鼠标状态和位置 ; 检查第一个按钮区域 cmp cx, 112 jb check_second_button ; cx过小,跳过第一个按钮检查 cmp cx, 452 ja check_second_button ; cx过大,跳过第一个按钮检查 cmp dx, 81 jb check_second_button ; dx过小,跳过第一个按钮检查 cmp dx, 153 ja check_second_button ; dx过大,跳过第一个按钮检查 cmp bx, 1h je startt ; 触发第一个按钮逻辑 check_second_button: ; 检查第二个按钮区域 cmp cx, 336 jb waitforpress ; cx过小,回到循环 cmp cx, 624 ja waitforpress ; cx过大,回到循环 cmp dx, 157 jb waitforpress ; dx过小,回到循环 cmp dx, 198 ja waitforpress ; dx过大,回到循环 cmp bx, 1h je Rulejump ; 触发第二个按钮逻辑 jmp waitforpress ; 未触发任何按钮,回到循环 startt: mov ax,02 int 33h ; 隐藏鼠标 call clean call GamePlay popa ret Rulejump: call RuleWaitPress popa ret endp whatPress
3. 关键修改点
- 当鼠标不在第一个按钮区域时,不再直接跳回循环,而是跳转至第二个按钮的检查逻辑
- 调整跳转分支,确保两个按钮的检查逻辑都能被执行到
- 统一处理未触发任何按钮的情况,跳回循环等待下一次输入
内容的提问来源于stack exchange,提问作者steven FM
相关产品推荐
相关产品推荐

