#prompt user for size of array (t0)
#set array = size t0
#prompt user for numbers and input them into array
#otput numbers
#sort numbers
#prompt user to enter a number to search for, if not there, report not found
#at some point, you'll see the point where i no longer understand how to implement it, so I'm just going to post the way I think it shoul work and hope for the best
.globl main
.data
array .byte 101:36 #fill the array with 101s so that they can be discarded during the output
entries_prompt:
.asciiz "Please input how many characters you have. Value must be between 2 and 36."
number_error:
.asciiz "The value must be between 2 and 36."
number_input:
.asciiz "Enter a number: "
array_output:
.asciiz "The array contains the following: "
array_output_sort:
.asciiz "The sorted array contains the following: "
search_prompt:
.asciiz "What number do you want to search for (-9999 to exit)? "
search_not_found:
.asciiz "Number not in array."
search_found:
.asciiz "Number found in element: "
program_complete:
.asciiz "Program complete. Exiting. "
newline:
.asciiz "\n"
.text
main:
li $v0, 4 #string output
la $a0, entries_prompt
syscall
li $v0, 5 #prep for user input
syscall
move $t0, $v0 #store in $t0, size of our array
la $a0, array
li $t1, 0 #this will be our index in the first loop and will be incremented by 4 (because we are dealing with bytes)
li $t2, 0 #this will be our counter for the first loop
li $t4, 0 #this will be our index in the output loop and will be incremented by 4 (because we are dealing with bytes)
input_loop:
#exit conditions
blt $t0, 2, input_error
bgt $t0, 36, input_error #these two are no good, give error message
beq $t0, $t2, output_loop #this is our signal to keep going, as our loop counter is now equal to our target number
li $v0, 4 #output user instruction
la $a0, number_input
syscall
li $v0, 5 #prep user input
syscall
move $t3, $v0
la $a0, array #load array back into a0
#the main body of the loop, the array has been loaded, so now we start feeding values in and incrementing the loop counter
sb $t3, ($a0) #feed the user input into the array
addi $t1, $t1, 4 #increment $t1 - our index has moved to the next byte
addi $t2, $t2, 1 #our loop counter goes up by 1
j input_loop #go back to the start of the loop
output_loop:
#output numbers unsorted
lb $t5, ($a0) #move value from array into t5
#exit conditionals
blt $t5, -100, sort_loop
bgt $t5, 100, sort_loop #either of these indicate that we are done with our output and can move on to the sort
move $v0, $t5 #move the value from t5 $v0
$v0, 1 #print what's in v0
syscall
addi $t5, $t5, 4 #move to the next byte in the array
j sort_loop
li $t6, 0 #initialize the starting point of the
sort_loop:
#just going to implement a bubble sort, because why not. since the numbers are just being compared, i'll use $s0 and $s1
#set s0 and s1 in preparation for comparison
lb $t6, ($a0) #pull the number from the address
move $s0, $t6 #store number from placeholder into $s0
addi $t6, $t6, 4 #increment the adress pointer by 4
lb $t6, ($a0) #pull the number from the address
move $s1, $t6 #store number from pointer into $s1
#compare s0 and s1. we want the smallest number up front, so we'll keep using 'ble.'
#here is the engine prototype, and i have basically no idea how to implement it
#1 initial conditions:
#2 t1 = 0
#3 s0 = byte 0
#4 t2 = t1+4
#5 s1 = byte 4
#6 compare s0 and s1
#7 if s0 <= s1 AND s1 != (-101 OR 101)
#8 increment t2 by 4
#9 s1 = byte 4 + 4x
#10 repeat
#11 else if s0 > s1 AND s1 != (-101 OR 101)
#12 swap s0 and s1
#13 go back to step 6
#14 else
#15 increment $t1 by 4
#16 go back to step 2
#
find_loop:
#1 user prompt
#2 store user entry in s2
#3 set t1 = 0
#4 point t1 at the sorted array
#5 load position t1 in array
#6 if s2 == (t1) AND s2 != -9999
#7 print "number found in byte" t1
#8 go back to step 1
#9 else if t1 < 36 AND s2 != -9999
#10 increment t1 by 4
#11 go back to step 6
#12 else if s2 != -9999
#13 print "number not found"
#14 go back to step 1
#15 else
#16 terminate program
Comments