# Insertion sort split into subprograms .data numbers: .word 3, 10, 15, 1, 8, 7, 3, 6, 1, 0 length: .word 10 .text .globl main main: la $a0, numbers # $a0 contains address of array lw $a1, length # $a1 contains length of array jal InsertionSort li $v0, 10 # system code for exit syscall end_main: ########################################################################### InsertionSort: # $a0 contains address of array # $a1 contains length of array addi $sp, $sp, -20 # save room for the return address sw $ra, 4($sp) # push return address onto stack sw $s0, 8($sp) # save s-registers used sw $s1, 12($sp) sw $s2, 16($sp) move $s0, $a0 # save base address of numbers in $s0 addi $s1, $a1, -1 # save (length-1) in $s1 for: li $s2, 1 # $s2 contains firstUnsortedIndex for_compare: bgt $s2, $s1, end_for for_body: move $a0, $s0 mul $t1, $s2, 4 add $t1, $t1, $s0 lw $a1, 0($t1) # load numbers[firstUnsortedIndex] into $a1 addi $a2, $s2, -1 jal Insert addi $s2, $s2, 1 j for_compare end_for: lw $ra, 4($sp) # restore return addr. to $ra lw $s0, 8($sp) lw $s1, 12($sp) lw $s2, 16($sp) lw $s3, 20($sp) addi $sp, $sp, 20 # pop call frame from stack jr $ra end_InsertionSort: ########################################################################### Insert: # $a0 contains base addr. of numbers # $a1 contains elementToInsert # $a2 contains firstSortedIndex move $t0, $a2 # $t0 contains testIndex while: blt $t0, $zero, end_while AND: mul $t1, $t0, 4 add $t2, $a0, $t1 lw $t3, 0($t2) # load numbers[testIndex] in $t3 ble $t3, $a1, end_while while_body: sw $t3, 4($t2) addi $t0, $t0, -1 j while end_while: addi $t0, $t0, 1 # testIndex + 1 mul $t1, $t0, 4 add $t2, $a0, $t1 sw $a1, 0($t2) # store elementToInsert at numbers[testIndex+1] jr $ra end_Insert: