1

我对 MIPS 很陌生,这是一项家庭作业,所以我真的只是在寻找一个线索来让我继续前进。:) 我四处寻找类似的问题,但没有找到我需要的任何东西,所以很抱歉之前有人问过这个问题。我正在 PCSpim 中编写冒泡排序,我认为我对代码非常擅长,除了交换。

这是伪代码:

lastUnsorted = length - 1
sortedFlag = 0
while(lastUnsorted >= 1 and sortedFlag == 0) do
   sortedFlag = 1
   for test = 0 to lastUnsorted-1 do
      if(numbers[test] > numbers[test+1] then
        temp = numbers[test]
        numbers[test] = numbers[test+1]
        numbers[test+1] = temp
        sortedFlag = 0
      end if
   end for
   lastUnsorted = lastUnsorted -1
end while

我认为它涉及获取每个元素的地址,检查第一个是否大于第二个,并通过交换函数完成交换。这是我所拥有的:

            .data
numbers:    .word 20, 30, 10, 40, 50, 40, 30, 25, 10, 5
length:     .word 10
sortedFlag: .word 0
lastUnsorted: .word 9
test:       .word 0

            .text
            .globlmain
main:
            la  $11, numbers
            lw  $12, length
            lw  $13, sortedFlag
            lw  $14, lastUnsorted
            lw  $15, test
            j while

end_main:

#####################################################################

while:
            li      $16, 1
            blt     $14, $16, end_while                     #program is completed
            li      $17, 0
            bne     $13, $17, end_while                     #program is completed
            addi    #13, 1                                  #make sortedFlag == 1
            j bubble_sort                                   #jump to the bubble sort

bubble_sort:
            bge     $15, $14, go_back                       #if test is greater than or equal to lastUnsorted, end
            ####stuff for swap

            # find address of first, then second and store each in t0 and t1
            # check the value at $t0 is greater than val at $t1; if so, call swap function
            addi    $15, $15, 1                             #add one to test after swap or no swap
            j       go_back                                 #jump out of sorting loop

go_back:
            addi    $14, $14, -1                            #subtract one from lastUnsorted
            j       while                                   #jump back to while loop to start again

swap:   
            move    $t2, $t0                                #swap with temporary registers??
            move    $t0, $t1
            move    $t1, $t2
            addi    $13, $13, -1                            #make sortedFlag == 0 IF a swap is completed

end_while:
            li  $vo, 10                                     #prog is done
            syscall

如您所见,我在中间留了一块空白,因为我不确定如何获取这两个元素并进行比较。我在网上找到了一些东西,说我可以通过移动和临时寄存器交换元素,但我看不到获取这些元素然后交换它们之间的联系。我意识到代码可能不是最优的,并且可能有捷径,但我在这方面非常初学者。

任何意见,将不胜感激!先感谢您。

4

0 回答 0