我的排序算法有什么问题?

时间:2019-06-07 20:24:12

标签: assembly mips

我编写了一个函数max,该函数采用列表的最大值并将其地址保存在$v0中,并将值保存在$v1中。 我还编写了一个函数swap,以在两个地址之间交换值 另一个功能仅打印$a0$a1中的值。

现在,我将列表中的值从最低到最大排序。 为此,我使用了sort函数,该函数在$a0中给出了起始地址,在$a1中给出了结束地址。 我的想法是:

  1. 我使用max
  2. 我将max的地址放入了$a0
  3. 我在$a0$a1之间交换值
  4. 我再次将$a0的起始地址放入list1

这是我的问题所在。我尝试了很多不同的方法,但我不明白,我真的不明白问题出在哪里。

  1. 我想用$a1, 4内部的地址代替 然后再次排序较小的列表 直到$a0 == $a1

  2. 中的地址
  3. 跳转到排序。


    .data
list:   .word 9, 8, 7, 3, 6, -4, 3, -1
list1:  .word 2, 5, 33, 4, 77, 22, 345, 88, 7, 99
list2:  .word 3, 5, 444, -4, 357, 23452, 1, -4588, 45, 38
list3:  .word 3, 345, 33, -43, -37, -34522, 1, -88, 5, 8
n:  .asciiz "\n"
    .text


main:

    la  $a0     list
    la  $a1     list+28 

    jal     print
    jal     swap
    jal     print


#######--------------------------------Start searching biggest Value in list1 list2 list3-----------------#########################

    la  $a0     list1
    la  $a1     list1+120
    jal     max
    add     $a0 $v1 $zero
    li  $v0 1
    syscall
    la  $a0 n
    li  $v0 4
    syscall

    ###-----sort---####


    la  $a0 list1
    la  $a1 list1+36
    j   sort
sorted: 

    li  $v0     10
    syscall
swap:

    lw  $t0     ($a0)
    lw  $t1 ($a1)
    sw  $t0     ($a1)
    sw  $t1     ($a0)   
    jr  $ra





max:

    lw      $t0 ($a0)
    la  $v0 ($a0)
    lw  $v1 ($a0)

do: 

        lw  $t4 ($a0)
    slt $t1 $t0 $t4         
    bgtz    $t1 change              
    la  $a0 4($a0)          
    beq $a0 $a1 finish          
    j   do

change: 

        lw  $t0 ($a0)
    la  $v0 ($a0)
    lw  $v1 ($a0)
    la  $a0 4($a0)
    j   do

finish: 

         jr $ra





print:

    la $t0 ($a0)    
    lw $a0 ($a0)
    li $v0 1
    syscall
    la $a0 n
    li $v0 4
    syscall
    lw $a0 ($a1)
    li $v0 1
    syscall
    la $a0 n
    li $v0 4
    syscall
    la $a0 ($t0)        
    jr $ra




sort:   

    jal max
    move    $a0 $v0
    jal swap
    jal     print

    la  $a0 list1
    sub $a1 4

    beq $a0 $a1  sorted
    j   sort

0 个答案:

没有答案