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
相关产品推荐
相关产品推荐

