sorting array in mips (assembly)

前端 未结 3 1541
忘了有多久
忘了有多久 2021-01-07 13:25

im in a class learning assembly using mips. I am working on sorting an array of numbers and i think that I have the method working correctly, but just a bit of trouble. I do

3条回答
  •  暖寄归人
    2021-01-07 14:12

    This link explains how to print to the screen in a MIPS simulator like QTSPIM or MARS.

    As for the code, there were a few bugs. The line li $a0, 0 is overwriting the work done by the initial la $a0, Array instruction because the li is setting the base address of your array to 0. Instead, you should move the la instruction into the loop so that $a0 is properly reset to the base address of Array after iterating over the entire array, and remove the li instruction. You also will need to add in a condition for when your program has completed the sort. I would suggest the following revisions (tested with SPIM):

    main:
        la  $t0, Array      # Copy the base address of your array into $t1
        add $t0, $t0, 40    # 4 bytes per int * 10 ints = 40 bytes                              
    outterLoop:             # Used to determine when we are done iterating over the Array
        add $t1, $0, $0     # $t1 holds a flag to determine when the list is sorted
        la  $a0, Array      # Set $a0 to the base address of the Array
    innerLoop:                  # The inner loop will iterate over the Array checking if a swap is needed
        lw  $t2, 0($a0)         # sets $t0 to the current element in array
        lw  $t3, 4($a0)         # sets $t1 to the next element in array
        slt $t5, $t2, $t3       # $t5 = 1 if $t0 < $t1
        beq $t5, $0, continue   # if $t5 = 1, then swap them
        add $t1, $0, 1          # if we need to swap, we need to check the list again
        sw  $t2, 4($a0)         # store the greater numbers contents in the higher position in array (swap)
        sw  $t3, 0($a0)         # store the lesser numbers contents in the lower position in array (swap)
    continue:
        addi $a0, $a0, 4            # advance the array to start at the next location from last time
        bne  $a0, $t0, innerLoop    # If $a0 != the end of Array, jump back to innerLoop
        bne  $t1, $0, outterLoop    # $t1 = 1, another pass is needed, jump back to outterLoop
    

    Be sure to check out this link for additional examples and explanations on what each MIPS instruction does.

提交回复
热议问题