MIPS架构中寄存器$a1为何始终输出0?字符判断代码咨询
为什么你的MIPS代码里$a1始终输出0?
嘿,我仔细看了你的MIPS代码片段,一下子就发现了导致$a1始终输出0的几个关键问题,咱们一个个说清楚:
$a1从未被显式赋值:你贴出来的代码里,从
main入口到loop循环、non_alpha分支(虽然分支内容没写完),完全没有任何指令给$a1设置具体值。MIPS寄存器的初始状态是未定义的,但如果全程没碰过$a1,它大概率会保持启动时的默认0值——这是最核心的原因。true/false常量没有被正确使用:你在
.data段定义了true: .word 1和false: .word 0,但代码里根本没有用lw指令把这些值加载到寄存器里。比如当你检测到字母时,需要执行lw $a1, true才能把1存入$a1,但你完全漏掉了这步操作。字母判断逻辑不完整且无赋值分支:你的循环里只做了“如果字符ASCII小于97(小写a)就跳去non_alpha”的判断,但既没有处理小写字母(97-122)、大写字母(65-90)的合法分支,也没有在合法分支里给$a1赋值为1的逻辑。就算
non_alpha分支里打算给$a1设0,那也只有非法字符会触发,合法字符的情况$a1还是保持初始的0。
简单修正示例
如果你的需求是检测当前字符是否为字母(每次循环更新$a1),可以补充逻辑如下:
.data str1: .asciiz "allo" str2: .asciiz "a1b2" true: .word 1 false: .word 0 .text main: la $a0, str1 move $t0, $a0 loop: lb $a0, 0($t0) # 加载当前字符 beqz $a0, end # 遇到字符串结束符则退出循环 # 先检查小写字母(97-122) blt $a0, 97, check_upper bgt $a0, 122, non_alpha lw $a1, true # 是小写字母,设$a1为1 j next_char check_upper: # 检查大写字母(65-90) blt $a0, 65, non_alpha bgt $a0, 90, non_alpha lw $a1, true # 是大写字母,设$a1为1 j next_char non_alpha: lw $a1, false # 非字母,设$a1为0 next_char: addi $t0, $t0, 1 # 指针后移,处理下一个字符 j loop end: # 这里可以添加输出$a1的指令,比如用syscall 1 li $v0, 1 move $a0, $a1 syscall li $v0, 10 syscall
如果你的需求是整个字符串全为字母才返回true,那还要调整逻辑:初始把$a1设为true,只要遇到一个非字母就把$a1设为false,之后不再修改。
内容的提问来源于stack exchange,提问作者Concorp
相关产品推荐
相关产品推荐

