#	Chapter 2 example
#	Uses bubble sort to sort list of signed 32-bit integers given by user
#	Demonstrates 2-level nested loops
	
	.data
vals:	.space	1024
nl:	.asciiz	"\n"
	.text
	
	# LOOP 1:  read sequence of values from user
main:	li	$s0,0		# counter
loop:	li	$v0,5
	syscall			# system call 5: read integer
	beq	$v0,9999,exit	# terminate loop if user wants to stop
	sw	$v0,vals($s0)	# store to array
	addi	$s0,$s0,4	# increment pointer
	j	loop
exit:

	beq	$s0,0,exit2	# make sure we don't have empty set (bad user behavior)

	addi	$t4,$s0,-4	# num_elements - 1, needed for bubble sort algorithm
	
	# OUTER LOOP
	li	$s1,0		# outer loop counter (i)
oloop:	beq	$s1,$t4,exit3
	
	# INNER LOOP
	li	$s2,0		# inner loop counter (j)
iloop:	beq	$s2,$t4,exit4
	
	lw	$t5,vals($s2)	# load pair of values
	lw	$t6,vals+4($s2)
	blt	$t5,$t6,skip	# compare values
	sw	$t5,vals+4($s2)	# swap values in memory
	sw	$t6,vals($s2)
skip:	addi	$s2,$s2,4	# increment j
	j	iloop

exit4:	addi	$s1,$s1,4	# increment i
	j	oloop

	# LOOP 2:  output sorted list to user
exit3:	li	$s1,0
loop2:	beq	$s0,$s1,exit2
	lw	$a0,vals($s1)
	li	$v0,1
	syscall			# system call 1:  print signed 32-bit integer
	la	$a0,nl		# need to print newline character
	li	$v0,4
	syscall			# system call 4:  print string
	addi	$s1,$s1,4
	j	loop2
exit2:
