#1 - user inputs their number
#2 - shove it into a function
#3a - IF number is even (mod 2 = 0) then divide it by 2 and store it
#3b - else multiply by 3, add 1, and store it
#4a - output number, then a comma space, and take that number and feed it into the function again
#5 - exit condition is when the number reaches the value of 1
.globl main
.text
main:
#initiate the first number
li $v0, 4 #string output
la $a0, prompt
syscall
li $v0, 5 #prep for user input
syscall
move $t0, $v0 #store in $t0
jal hailstone #go to the main function
li $v0, 10
syscall
#just terminate the sequence with no extra words
hailstone:
#lower the stack by 4 here
rem $t1, $t0, 2 #test to see if the number is divisible by 2
beqz $t1, even #if there is no remainder, the number is divisible by 2, and we go to even
#if it's not even, it's odd and we can go ahead with the rest of the function
#output the number
move $a0, $t0
li $v0, 1 #integer output
syscall #do it
move $t0, $a0 #put the number back
li $v0, 4
la $a0, comma_space #load a ', ' behind the integer so that it's readable
syscall
#test to see if the number is our exit condition
ble $t0, 1, exit
mul $t0, $t0, 3 #if the number is odd, then we multiply by 3...
addi $t0, $t0, 1 #...then add 1 and our original number is modified
jal hailstone
#jr $ra #go back to hailstone
even:
#output the number
move $a0, $t0
li $v0, 1 #integer output
syscall #do it
move $t0, $a0 #put the number back
li $v0, 4
la $a0, comma_space #load a ', ' behind the integer so that it's readable
syscall
div $t0, $t0, 2 #divide the number by 2 and store it in the same place
jal hailstone
exit:
jr $ra
.data
prompt:
.asciiz "Please enter your initial number: "
comma_space:
.asciiz ", "
Comments