MIPS汇编实现Craps骰子游戏beq分支同时触发双提示问题咨询
MIPS Craps骰子游戏问题排查及修复
核心故障原因
- 执行流穿透:触发获胜分支跳转到
WIN标签后,打印完获胜提示没有跳转指令跳过失败分支,CPU会按地址顺序顺次执行下方的LOSE逻辑,导致两个提示同时打印。 - 获胜条件不完整:仅实现了和为7的获胜判断,和为11的逻辑只写了
li $t2,11加载立即数,没有配套的beq跳转判断,等于11的获胜规则完全未生效。 - 分支返回逻辑缺失:输赢判断结束后没有跳转回主循环的逻辑,执行完分支后会跑出循环控制流程。
- 冗余错误代码:第二个随机数生成后多了一个无意义的
syscall,存在多处多余的.text伪指令(同一代码段无需重复声明)。
修复方案
1. 完善输赢判断逻辑
替换原有和值判断部分的代码:
add $t3, $t1, $t2 # 计算两个骰子和存在$t3 # 原有打印和值的代码保留 li $v0, 4 la $a0, combined syscall li $v0, 1 move $a0, $t3 syscall # 新增完整判断逻辑 li $t0, 7 beq $t3, $t0, WIN # 和为7跳获胜分支 li $t0, 11 beq $t3, $t0, WIN # 和为11跳获胜分支 # 可根据Craps规则补充2/3/12直接判负的逻辑,此处示例直接跳失败 j LOSE
2. 修正分支跳转逻辑
修改输赢分支及循环收尾逻辑:
# 原有循环结束标识end保留 end: li $v0, 10 syscall WIN: li $v0, 4 la $a0, winString syscall j AFTER_RESULT # 跳过失败分支直接回到循环收尾 LOSE: li $v0, 4 la $a0, loseString syscall AFTER_RESULT: addi $t5, $t5, 1 # 循环计数器+1 j loop # 跳回循环开头执行下一轮掷骰
3. 清理冗余代码
删除第二个随机数生成后多余的syscall,删除所有重复的.text伪指令声明。
内容的提问来源于stack exchange,提问作者nbulgarides
相关产品推荐
相关产品推荐

