MIPS翻译C条件判断时beq指令始终跳转输出True问题求助
问题原因及修正方案
核心问题梳理
你遇到的问题主要来自分支逻辑设计错误,具体问题点如下:
- 分支落空漏洞:当
A≠2且B≠3时,你写的两条beq指令都不会触发跳转,程序会直接顺序执行到下方的outputT标签,这就是无论输入如何都打印True的核心原因。 - 冗余代码:读取C值的
move $t5, $v0后多了一行无效的syscall,可直接删除。 - 冗余判断:
checkT分支是只有B==3才会进入的,不需要在该分支内再次判断B是否等于3。 - 逻辑优先级处理不到位:C语言中
&&优先级高于||,原条件等价于A == 2 || (B == 3 && C != 4),你的代码没有处理B不等于3时直接走False分支的逻辑。
修正后的MIPS代码
.data varA: .word 2 A: .asciiz "A: " B: .asciiz "B: " C: .asciiz "C: " outputTrue: .asciiz "\nTrue" outputFalse: .asciiz "\nFalse" .text addi $t0, $zero, 2 addi $t1, $zero, 3 addi $t2, $zero, 4 .globl main main: # 读取A li $v0, 4 la $a0, A syscall li $v0, 5 syscall move $t3, $v0 # 读取B li $v0, 4 la $a0, B syscall li $v0, 5 syscall move $t4, $v0 # 读取C li $v0, 4 la $a0, C syscall li $v0, 5 syscall move $t5, $v0 # 条件判断逻辑 # 先判断A==2,满足直接输出True beq $t3, $t0, outputT # A不等于2,判断B是否不等于3,如果B≠3直接输出False bne $t4, $t1, outputF # 到这里说明B==3,判断C是否等于4,等于的话输出False beq $t5, $t2, outputF # 剩下的情况:A≠2,B==3,C≠4,满足条件输出True outputT: li $v0, 4 la $a0, outputTrue syscall j EXIT outputF: li $v0, 4 la $a0, outputFalse syscall j EXIT EXIT: li $v0, 10 syscall
逻辑说明
修正后的逻辑完全匹配原C代码的条件优先级:
- 若
A == 2,直接满足||条件,输出True - 若
A != 2,需要判断后面的&&条件:- 若
B != 3,&&条件直接不成立,输出False - 若
B == 3,再判断C != 4:如果C等于4则不满足,输出False;否则输出True
- 若
内容的提问来源于stack exchange,提问作者Tacio Oliveira
相关产品推荐
相关产品推荐

