只交换一次?
Only Swapping Once?
我正在尝试在 MIP 中实施 Bubblesort。我快要搞清楚了,不幸的是我的代码似乎只交换了数组中的一个元素。我的想法是交换没有链接回循环过程,所以当调用要打印的子程序时只执行一次交换。不幸的是,我在 MIP 方面经验不足,所以很可能有些我跳错了。任何见解将不胜感激。
[编辑]
添加一些示例输出:
所以 [3,4,1,2,5,6] -> [3,1,4,2,5,6] 我不知道如何在排序完成之前继续交换。
SPIM/MARS 具有调试功能,可让您单步执行代码并在此过程中观察寄存器值。我建议您学习如何使用这些功能。
我可以看出您的代码至少有两个问题。一是您的 swap
例程从不 returns,因此 CPU 将继续执行 swap
例程之后的任何内容。您应该以 jr $ra
结束 swap
。
另一个问题是您将 $a1
设置为 length_a
在调用 sort
之前,但在 sort
中你只需要执行 move $s3, $a1
这仍然会给你 length_a
的地址而不是值 6。那 move
应该改为 lw $s3, ($a1)
.
我正在尝试在 MIP 中实施 Bubblesort。我快要搞清楚了,不幸的是我的代码似乎只交换了数组中的一个元素。我的想法是交换没有链接回循环过程,所以当调用要打印的子程序时只执行一次交换。不幸的是,我在 MIP 方面经验不足,所以很可能有些我跳错了。任何见解将不胜感激。
[编辑]
添加一些示例输出:
所以 [3,4,1,2,5,6] -> [3,1,4,2,5,6] 我不知道如何在排序完成之前继续交换。
SPIM/MARS 具有调试功能,可让您单步执行代码并在此过程中观察寄存器值。我建议您学习如何使用这些功能。
我可以看出您的代码至少有两个问题。一是您的 swap
例程从不 returns,因此 CPU 将继续执行 swap
例程之后的任何内容。您应该以 jr $ra
结束 swap
。
另一个问题是您将 $a1
设置为 length_a
在调用 sort
之前,但在 sort
中你只需要执行 move $s3, $a1
这仍然会给你 length_a
的地址而不是值 6。那 move
应该改为 lw $s3, ($a1)
.