###########################################################
# Program Description
# Â CS315 Lab 8 - Â Stack
#
# Â 1. Use create_array to create a dynamic array of words
# Â Â (note: Â create_array calls read_array, main does not
# Â Â call read_array)
# Â 2. Use print_array to print the array
# Â 3. Use sum_array to calculate the sum of the array
# Â 4. Print the sum
#
# This is the last one! Thanks all for reading and following me!
#
###########################################################
# Register Usage
# $t0
# $t1
# $t2
# $t3
# $t4
# $t5
# $t6
# $t7
# $t8
# $t9
###########################################################
.data
###########################################################
.text
main:
  jal   create_array   # jumps to create_array subprogram
  jal   print_array   # jumps to print_array subprogram
  jal   sum_array    # jumps to sum_array subprogram
 Â
  lw    $a0, 0($sp)   # load sum to print
  li    $v0, 1      # system call code for print int
  syscall
 Â
  addiu  $sp, $sp, 12     # Unallocate 3 words
mainEnd:
  li    $v0, 10
  syscall   # Halt
###########################################################
###########################################################
# Subprogram Description
# Â Ask the user for an array length, dynamically alocate
# Â an array of words with the given length
# Â Call read_array to fill the array
###########################################################
# Arguments In and Out of subprogram
#
# $a0
# $a1
# $a2
# $a3
# $v0
# $v1
# $sp+0 Â Base address (OUT)
# $sp+4 Â Array length (OUT)
# $sp+8
# $sp+12
###########################################################
# Register Usage
# $t0 - Base address
# $t1 - Length
# $t2
# $t3
# $t4
# $t5
# $t6
# $t7
# $t8
# $t9
###########################################################
.data
Array_length: .asciiz "Enter a length for your array: "
###########################################################
.text
create_array:
# Ask the user for an array length
# Allocate space for the array
# Call read_array to fill the array
addiu  $sp, $sp, -4     # Allocate 1 word
sw    $ra, 0($sp)     # Store the return address
li   $v0, 4   # system call code for print string
la   $a0, Array_length # load address of Array_length into $a0
syscall     # print Array_length message
li   $v0, 5  # system call code for read integer
syscall     # read in the value of length int $v0
move   $t0, $zero   # clear $t0 to be added to
add   $t0, $v0, 0     # move $v0 to $t0 by adding
mul   $a0, $v0, 4     # set memory to allocate based on input
li   $v0, 9      # system call code to allocate memory
syscall     # allocate memory for the array
addiu  $sp, $sp, -8     # Allocate 2 words
sw    $v0, 0($sp)     # Store the array address
sw    $t0, 4($sp)     # Store the array length
jal   read_array      # jumps to read_array subprogram
lw    $t1, 4($sp)     # Load the array length
lw    $t0, 0($sp)     # Load the array address
addiu  $sp, $sp, 8     # Unallocate 2 words
lw    $ra, 0($sp)     # Load the return address
addiu  $sp, $sp, 4     # Unallocate 1 word
addiu  $sp, $sp, -8     # Allocate 2 words
sw    $t0, 0($sp)     # Store the array address
sw    $t1, 4($sp)     # Store the array length
jr    $ra         # jumps to previous program
###########################################################
###########################################################
# Subprogram Description
# Â Reads words into an array until the array is full
###########################################################
# Arguments In and Out of subprogram
#
# $a0
# $a1
# $a2
# $a3
# $v0
# $v1
# $sp+0 Â Base address (IN)
# $sp+4 Â Array length (IN)
# $sp+8
# $sp+12
###########################################################
# Register Usage
# $t0 - Array Address
# $t1 - Array Length
# $t2 - Index
# $t3 - Offset adress to store values
# $t4 - Offset for address
# $t5 - Input value
# $t6
# $t7
# $t8
# $t9
###########################################################
.data
Prompt_value: .asciiz "Please input value: "
###########################################################
.text
read_array:
# Read values into an array until the array is full
lw    $t0, 0($sp)     # Load the array address
lw    $t1, 4($sp)     # Load the array length
li   $t2, 0   # set starting index to 0
loop:
bge   $t2, $t1, end_loop # breaks loop when last index is passed
mul   $t4, $t2, 4   # sets offset to store the value
add   $t3, $t4, $t0 # sets the address to store the value
li   $v0, 4   # system call code for print string
la   $a0, Prompt_value # load address of Prompt_value into $a0
syscall     # print Prompt_value message
li   $v0, 5   # system call code for read integer
syscall     # read in the value of value int $v0
move $t5, $v0 Â Â # move value $v0 to $t5
sw   $t5, ($t3)   # store the value in the array
add   $t2, $t2, 1   # increment loop by 1
b   loop   # move to the top of the loop
end_loop:
jr    $ra         # Jumps to previous program
###########################################################
###########################################################
# Subprogram Description
# Â Prints words from an array, separated by spaces
###########################################################
# Arguments In and Out of subprogram
#
# $a0
# $a1
# $a2
# $a3
# $v0
# $v1
# $sp+0 Â Base address (IN)
# $sp+4 Â Array length (IN)
# $sp+8
# $sp+12
###########################################################
# Register Usage
# $t0 - Array Length
# $t1 - Array Address
# $t2 - Index
# $t3 - Index Address
# $t4 - Offset
# $t5 - The value to be stored
# $t6 - Last index check
# $t7
# $t8
# $t9
###########################################################
.data
Start_array: .asciiz "Your array: ["
Comma: Â Â .asciiz ", "
End_array: Â Â .asciiz "]\n"
###########################################################
.text
print_array:
# Print all values from an array
lw    $t1, 0($sp)     # Load the array address
lw    $t0, 4($sp)     # Load the array length
li   $v0, 4   # system call code for print string
la   $a0, Start_array # load address of Start_array into $a0
syscall     # print Start_array message
add   $t6, $t0, -1 # -1 from for array length for clean print
li   $t2, 0   # set starting index to 0
print_loop:
bge   $t2, $t0, end_print # breaks loop when last index is passed
mul   $t4, $t2, 4   # sets offset to laod the value
add   $t3, $t4, $t1 # sets the address to print the value from
li   $v0, 1   # system call code for print integer
lw   $a0, ($t3)   # load the value at address ($t3)
syscall     # print the value at index $t2
beq   $t2, $t6, end_print # breaks loop when last index is passed
li   $v0, 4   # system call code for print string
la   $a0, Comma   # load address of Comma into $a0
syscall     # print Commma message
add   $t2, $t2, 1   # increment loop by 1
b   print_loop   # move to the top of the loop
end_print:
li   $v0, 4   # system call code for print string
la   $a0, End_array # load address of End_array into $a0
syscall     # print End_array message
jr    $ra         # Jumps to previous program
###########################################################
###########################################################
# Subprogram Description
# Â Calculates the sum of an array
#
###########################################################
# Arguments In and Out of subprogram
#
# $a0
# $a1
# $a2
# $a3
# $v0
# $v1
# $sp+0 Â Base address (IN)
# $sp+4 Â Array length (IN)
# $sp+8 Â Array sum (OUT)
# $sp+12
###########################################################
# Register Usage
# $t0 - Array Address
# $t1 - Array Length
# $t2 - Index
# $t3 - Address of value to add
# $t4 - Offset to get value address
# $t5 - Value loaded
# $t6 - Sum
# $t7
# $t8
# $t9
###########################################################
.data
Array_sum: Â .asciiz "Sum of your array: "
###########################################################
.text
sum_array:
# Sum of all values from the array
lw    $t0, 0($sp)     # Load the array address
lw    $t1, 4($sp)     # Load the array length
li   $v0, 4   # system call code for print string
la   $a0, Array_sum   # load address of Start_array into $a0
syscall     # print Start_array message
move $t2, $0 Â Â # set starting index to 0
move $t6, $0 Â Â # set starting sum to 0
sum_loop:
bge   $t2, $t1, end_sum # breaks loop when last index is passed
mul   $t4, $t2, 4   # sets offset to load the value
add   $t3, $t4, $t0 # sets the address to add the value from
lw   $t5, ($t3)   # load the value at address ($t3)
  add   $t6, $t6, $t5    # adds loaded int to the sum
add   $t2, $t2, 1   # increment loop by 1
b   sum_loop   # move to the top of the loop
end_sum:
  addiu  $sp, $sp, -4     # Allocate 1 word
sw    $t6, 0($sp)     # Store the sum
jr    $ra         # Jumps to previous program
###########################################################