MIPS中beq指令无法正确跳转至对应函数问题求助
MIPS温度转换程序错误排查
你的问题核心原因出在输入字符的读取处理上:
- 在最初的代码中,调用syscall 8(读取字符串)后,
$a0存储的是缓冲区str1的内存地址,而非你输入的字符本身。你直接拿这个地址和'c'/'C'/'f'/'F'的ASCII值做比较,两者数值完全不匹配,所以无论输入什么都会跳转到error分支。
你添加的lb $a0, ($a0)指令是正确的解决方案:这条指令会把str1指向的第一个字节(即你输入的第一个字符)加载到$a0寄存器中,让后续的beq指令能正确匹配字符。
如果添加该指令后仍有问题,排查方向:
- 检查输入是否有多余字符:比如输入时不小心在字母前加了空格,导致第一个字符不是目标字母
- 添加调试代码验证
$a0的值:在lb指令后插入以下代码,打印输入的字符串和字符的ASCII值,确认是否正确读取:move $t1, $a0 # 暂存读取到的字符 la $a0, str1 # 打印输入的完整字符串 li $v0, 4 syscall move $a0, $t1 # 打印字符的ASCII值 li $v0, 1 syscall la $a0, endl # 换行 li $v0,4 syscall
修正后的核心代码片段:
#reading user input la $a0, str1 li $a1, 80 li $v0, 8 syscall lb $a0, ($a0) # 加载输入的第一个字符到$a0 #if 'c' or 'C' branch to convertC2F beq $a0 , 'c', convertC2F beq $a0 , 'C', convertC2F #if 'f' or 'F' branch to convertf2C beq $a0 , 'f' , convertf2C beq $a0, 'F' , convertf2C #else go to error j error
测试时注意:输入单个字母(c/C/f/F)后直接回车,再输入温度数值即可正常执行转换逻辑。
内容的提问来源于stack exchange,提问作者Googly Goof
相关产品推荐
相关产品推荐

