# Bubble Sort # $8 - Flag # $9 - Index # $10 - Current Address of Array # $11 - Holds A[i] # $12 - Holds A[i+1] # $13 - Holds last relevant location in array, and is used to count for input loop # $14 - Holds Base Address of Array # $15 - Temp for comparing A[i] and A[i+1] # $16 - Used for printing - holds last address in array # The I/O aint pretty # It does show a variety of ways to manipulate arrays # It also illustrated the basic address modes of MIPS .data A: .word 0:50 # This initializes 50 consecutive words to 0 # could use .space 200 also. .globl __start .text __start: # This reads up to 50 integers la $14, A li $v0, 5 syscall move $13, $v0 # holds number of values in array inp_loop: beqz $13, main_bubble li $v0, 5 syscall sw $v0, ($14) addiu $14, $14, 4 addiu $13, $13, -1 b inp_loop # Input loop finished main_bubble: addiu $13, $14, -8 # $13 stores last relevant address in array addiu $16, $14, -4 # $16 stores last address in array for printing later la $14, A # resets $14 to the start of A out_loop: li $8, 1 # flag li $9, 0 in_loop: addu $10, $14, $9 lw $11, ($10) lw $12, 4($10) sub $15, $11, $12 # could use ble $11, $12, noswap blez $15, noswap li $8, 0 sw $11, 4($10) sw $12, ($10) noswap: addiu $9, $9, 4 blt $10, $13, in_loop addiu $13, $13, -4 beq $8, $0, out_loop # could use beqz $8, outloop also output: la $9, A print: li $v0, 1 lw $a0, ($9) syscall addiu $9, $9, 4 ble $9, $16, print li $v0, 10 syscall