# 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