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

MIPS数组相邻逆序元素交换代码不生效问题修复

问题根因

交换逻辑仅修改了寄存器内的临时值,未将交换结果写回内存中的数组,导致数组内容从头到尾没有发生任何改动,最终输出和输入完全一致。

具体错误点
  • 读取数组元素、比较相邻元素大小的逻辑完全正确
  • 判定需要交换时,仅在$a0、$a1、$t5三个寄存器之间来回赋值,没有执行sw存储指令把交换后的值写回数组对应的内存地址
  • 寄存器里的临时值在下一轮循环加载新数组元素时会被直接覆盖,不会对内存中存储的数组数据产生任何影响
修复方法

把loop1段中原来只操作寄存器的三行交换代码,替换为直接向对应内存地址写回交换值的指令即可,不需要额外在寄存器里做中转:
原来的错误交换代码:

add $t5, $a1, $zero       #store y in a temp variable
    add $a1, $a0, $zero       # numbers[i] = y
    add $a0, $t5, $zero       # numbers[i - 1] = x

替换为:

sw   $a1, ($t3)     # numbers[i] = y($t3本来就存着numbers[i]的地址)
    sw   $a0, ($t4)     # numbers[i-1] = x($t4本来就存着numbers[i-1]的地址)
修复后完整loop1段参考
li   $t0, 1         # i = 1

loop1:
    bge  $t0, 10, end1  #   if (i >= 10) goto end1

    mul  $t1, $t0, 4    #   calculate &numbers[i]
    la   $t2, numbers   #
    add  $t3, $t1, $t2  #
    lw   $a0, ($t3)     #   load numbers[i] into $a0 (x)

    sub $t4, $t3, 4     
    lw  $a1, ($t4)      #load numbers[i - 1] into $a1 (y)

    bge $a0, $a1, increment #if (x >= y) goto increment

    sw   $a1, ($t3)     # 交换后的值写回数组
    sw   $a0, ($t4)

increment:
    add  $t0, $t0, 1    #   i++
    j    loop1          

替换后运行即可得到预期输出,和给出的C代码逻辑完全匹配。

内容的提问来源于stack exchange,提问作者FreeAntiVirus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:54:28