You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:27:55