# Programmer: Mark Fienup # MIPS Insertion sort of an array. # Insertion sort High-Level Algorithm # integer firstUnsortedIndex, testIndex, elementToInsert; # # for firstUnsortedIndex = 1 to (length-1) do # testIndex = firstUnsortedIndex-1; # elementToInsert = numbers[firstUnsortedIndex]; # while (testIndex >=0) AND (numbers[testIndex] > elementToInsert ) do # numbers[ testIndex + 1 ] = numbers[ testIndex ]; # testIndex = testIndex - 1; # end while # numbers[ testIndex + 1 ] = elementToInsert; # end for .data numbers: .word 20, 30, 10, 40, 50, 60, 30, 25, 10, 5 length: .word 10 # NOTE: On an old version of PCSpim I needed to use "__start" label instead of "main" # NOTE: I needed to place the constant 4 in $4 for the mul instruction with MARS .text .globl main main: # .globl __start #__start: # Register usage: # $10 = value of (length-1) # $7 = firstUnsortedIndex # $8 = testIndex # $9 = elementToInsert # $13 = address of element numbers[] # $11 = base address of numbers # $12 = value of numbers[testIndex] # $4 = value of 4 (so it will run in MARS) for_init: li $7, 1 li $4, 4 # used so mul by 4 works in MARS lw $10, length addi $10, $10, -1 la $11, numbers for_compare: bgt $7, $10, end_for addi $8, $7, -1 mul $13, $7, $4 add $13, $11, $13 lw $9, 0($13) while: blt $8, 0, end_while mul $13, $8, $4 add $13, $11, $13 lw $12, 0($13) ble $12, $9, end_while sw $12, 4($13) addi $8, $8, -1 j while end_while: mul $13, $8, $4 add $13, $11, $13 sw $9, 4($13) addi $7, $7, 1 j for_compare end_for: li $v0, 10 # exit system call syscall endMain: