# main: # # InsertionSort(scores, n) # ... # end main # InsertionSort(numbers - address to integer array, length - integer) # integer firstUnsortedIndex # for firstUnsortedIndex = 1 to (length-1) do # Insert(numbers, numbers[firstUnsortedIndex], firstUnsortedIndex-1); # end for # end InsertionSort # Insert(numbers - address to integer array, elementToInsert - integer, lastSortedIndex - integer) { # integer testIndex; # testIndex = lastSortedIndex # while (testIndex >=0) AND (numbers[testIndex] > elementToInsert ) do # numbers[ testIndex+1 ] = numbers[ testIndex ]; # testIndex = testIndex - 1; # end while # end Insert .data scores: .word 20, 30, 10, 40, 50, 60, 30, 25, 10, 50 n: .word 10 .text .globl __start __start: la $a0, scores lw $a1, n jal insertionSort li $v0, 10 syscall end_main: insertionSort: addi $sp, $sp,-16 # setup call-frame sw $ra, 4($sp) # save the return addr back to main sw $s0, 8($sp) # save main's s-registers sw $s1, 12($sp) sw $s2, 16($sp) move $s0, $a0 # save address of numbers in $s0 sub $s1, $a1, 1 # save (length-1) in $s1 for_init: li $s2, 1 # save firstUnsortedIndex in $s2 for_loop: bgt $s2, $s1, end_for move $a0, $s0 # fill actual parameters mul $t0, $s2, 4 add $t0, $s0, $t0 lw $a1, 0($t0) sub $a2, $s2, 1 jal insert # call insert subpgm addi $s2, $s2, 1 j for_loop end_for: lw $ra, 4($sp) # restore return addr. and lw $s0, 8($sp) # restore main's s-registers lw $s1, 12($sp) lw $s2, 16($sp) addi $sp, $sp, 16 # remove call-frame jr $ra # 'jump register' back to main end_insertionSort: insert: # insert does not call any subpgms so we'll use $a and $t registers # nothing to save on the run-time stack move $t0, $a2 # use $t0 for testIndex li $t4, 4 while: blt $t0, 0, end_while mul $t1, $t0, $t4 add $t1, $a0, $t1 lw $t2, 0($t1) ble $t2, $a1, end_while sw $t2, 4($t1) sub $t0, $t0, 1 j while end_while: mul $t1, $t0, $t4 add $t1, $a0, $t1 sw $a1, 4($t1) jr $ra # 'jump register' back to insertionSort end_insert: