将C代码转换为高级MIPS汇编后无输出,请求原因排查
问题分析与解决
你的代码核心问题出在uppercase函数的寄存器恢复顺序上,导致返回的不是处理后的字符,甚至会破坏字符串结构,最终没有输出。
具体错误点
在uppercase函数的结尾,你先恢复了$s2寄存器(从栈中读取调用前的旧值),再将$s2赋值给返回寄存器$v0。这就把你处理后的字符值覆盖了,返回的是调用uppercase之前$s2的随机值——如果这个随机值是0,会直接把字符串的第一个字符改成结束符\0,循环提前终止,printf自然输出空内容。
修改方法
调整uppercase函数结尾的代码顺序,先把处理后的结果存入返回寄存器,再恢复栈中的寄存器值:
修改后的uppercase函数结尾部分:
L1: # 先将处理后的字符存入返回寄存器 move $v0,$s2 # return the converted character # 再恢复栈中保存的寄存器 lw $ra,0($sp) lw $s0,4($sp) lw $s1,8($sp) lw $s2,12($sp) addi $sp,$sp,16 jr $ra
额外优化(可选)
uppercase函数没有调用其他子函数,所以不需要保存$ra寄存器,可以去掉相关的栈操作,减少栈空间占用:
uppercase: # 只保存需要使用的$s寄存器,不需要保存$ra addi $sp,$sp,-12 sw $s0,0($sp) # use this for a sw $s1,4($sp) # use this for z sw $s2,8($sp) # use this for ch # ch argument move $s2,$a0 # load 'a' and 'z' lb $s0,a lb $s1,z # check if ch is a lowercase character blt $s2,$s0,L1 bgt $s2,$s1,L1 # convert ch to uppercase addi $s2,$s2,-32 L1: move $v0,$s2 # return the converted character # restores registers from the stack lw $s0,0($sp) lw $s1,4($sp) lw $s2,8($sp) addi $sp,$sp,12 jr $ra
修改后运行代码,就能正确将字符串转为大写并输出HOMEWORK-10了。
内容的提问来源于stack exchange,提问作者RiskyGadget4Life
相关产品推荐
相关产品推荐

