################################################################################
##
## LSU EE 4720 Spring 2003 Homework 1 Problem 4 Solution
##
##

# Assignment:http://www.ece.lsu.edu/ee4720/2003/hw01.pdf
# Solution:http://www.ece.lsu.edu/ee4720/2003/hw01_sol.pdf

################################################################################

# The solution, the complete lookup routine, appears further below.
# The code immediately below calls the lookup routine with a sample
# array and displays the count that lookup returns.


        .data
array:
        .word 1 6 4 8 3 1 6 4 5 1 3 1
array_end:
msg:
        .asciiz "The array holds %/t0/d elements equal to %/a2/d."

        .text
        
        .globl __start
__start:

        la $a0, array
        la $a1, array_end
        sub $a1, $a1, $a0
        srl $a1, $a1, 2
        jal lookup 
        addi $a2, $0, 1
        add $t0, $v0, $0
        addi $v0, $0, 11
        la $a0, msg
        syscall
        addi $v0, $0, 10
        syscall
        

################################################################################
## Problem 4 Solution

lookup:
        # Call Arguments
        #
        # $a0: Address of first element of array.  Array holds 32-bit integers.
        # $a1: Number of elements in array.
        # $a2: Element to count.
        #
        # Return Value
        #
        # $v0: Number of times $a2 appears in the array starting at $a0

        # [ ] Fill as many delay slots as possible.
        # [ ] Avoid using too many instructions.
        # [ ] Avoid obviously unnecessary instructions.

        # Solution

        addi $v0, $0, 0
        sll $t0, $a1, 2
        add $t1, $t0, $a0
LOOP:
        beq $a0, $t1, DONE
        lw $s0,0($a0)
        bne $s0,$a2 LOOP
        addi $a0, $a0, 4
        j LOOP
        addi $v0, $v0, 1
                
DONE:
        jr $ra
        nop