```## LSU EE 4720 -- Fall 2019 -- Computer Architecture
#
## Histogram Example Program

# Time-stamp: <22 January 2019, 15:24:06 CST, koppel@cyc.ece.lsu.edu>

## Contents
#
# histo. (Computes the histogram)
# Data Section
# Test routine. (Calls histogram program and prints table.)
# upper. (Converts string to upper case.)
# strlen. (Computes the length of a string.)

################################################################################
## histo: Compute Character Usage Histogram

.text
histo:
## Register Usage
#
# Call: \$a0  String to analyze.
#       \$a1  Address of 26-element histogram table.
#            Each element is a 4-byte integer.
#            Initially all elements zero.
# Return:
#      Let h = \$a1.
#      h[0]: Number of A's.
#      h[1]: Number of B's.
#      ...

addi \$s1, \$ra, 0    # Make a copy of the return address.
jal upper           # Convert to upper case.
addi \$s0, \$a0, 0    # Make a copy of string start address.

LOOP:
lb \$t0, 0(\$a0)      # Load next character.
beq \$t0, \$0, DONE   # Jump out of loop if at end of string.
addi \$t0, \$t0, -65  # Set \$t0 to table index. ( A -> 0, B -> 1, etc.)
sltiu \$t3, \$t0, 26  # If \$t0 is >= 26 then it's not a letter ..
beq \$t3, \$0, LOOP   # .. and so get the next char. (Note unsigned cmp.)
sll \$t0, \$t0, 2     # Scale index based on table element size (4).
lw \$t1, 0(\$t2)      # Load table element. Value is # of times char seen.
addi \$t1, \$t1, 1    # We're seeing the char again, so add one ..
j LOOP
sw \$t1, 0(\$t2)      # .. and store the result back in the table.

DONE:
jr \$s1              # Return using the saved return address.
nop

################################################################################
## Test Routine
#
#  Calls histogram program (histo) then prints table.
#

## Input string for testing histo.
#
.data
doi:
.ascii "[]\^_`@?>={|}~\n"  # Test some out-of-range characters.
.ascii "\n"
.ascii "Do you know what it means to miss New Orleans"
.ascii "And miss it each night and day"
.ascii "I know I'm not wrong... this feeling's gettin' stronger"
.ascii "The longer, I stay away"
.ascii "Miss them moss covered vines...the tall sugar pines"
.ascii "Where mockin' birds used to sing"
.ascii "And I'd like to see that lazy Mississippi...hurryin' into spring"
.ascii ""
.ascii "The moonlight on the bayou.......a creole tune.... that fills the air"
.ascii "I dream... about magnolias in bloom......and I'm wishin I was there"
.ascii ""
.ascii "Do you know what it means to miss new orleans"
.ascii "When that's where you left your heart"
.ascii "And there's one thing more...i miss the one I care for"
.ascii "More than I miss New Orleans"
.ascii ""
.asciiz "-- Louis Armstrong"

msg:
.asciiz "Letter %/t3/c  count: %/t1/3d (%/f4/6.2f%%) %/t5/s\n";

.align 4
histogram_data:
.space 104
stars:
.space 40

TB_100:
.double 100.0  # The constant 100, used to show percents.

.text
.globl __start
__start:
la \$a0, doi
la \$a1, histogram_data
L3:
sw \$0, 0(\$t1)
bne \$t1, \$t2, L3

la \$t1, stars
addi \$t3, \$0, 42  # '*'
L4:
sb \$t3, 0(\$t1)
bne \$t1, \$t2, L4
sb \$0, 0(\$t1)

jal strlen
nop
mtc1 \$v0, \$f2
cvt.d.w \$f2, \$f2
la \$t3, TB_100
ldc1 \$f4, 0(\$t3)
div.d \$f2, \$f4, \$f2

jal histo
nop
la \$s1, histogram_data
la \$s2, stars
L2:
lw \$t1, 0(\$s1)
beq \$t1, \$0, TEST
srl \$t6, \$t1, 1
sub \$t5, \$s2, \$t6
mtc1 \$t1, \$f0
cvt.d.w \$f0, \$f0
mul.d \$f4, \$f0, \$f2
syscall
TEST:
bne \$t3, \$t4, L2
nop

syscall

################################################################################
## upper: Convert to Upper Case

upper:
## Register Usage
#
# \$a0: (Call) Address of string to convert.
#
# \$a0: Address of character being examined.
# \$t1: Character being examined.
# \$t2: Comparison result.
#
# Example:  Before: "aB."
#           After:  "AB."
ULOOP:
lbu \$t1, 0(\$a0)          # Load character from string.
beq \$t1, \$0, UDONE
slti \$t2, \$t1, 97        # < 'a'
bne \$t2, \$0 ULOOP
slti \$t2, \$t1, 123       # 'z' + 1
beq \$t2, \$0, ULOOP
j ULOOP
sb \$t1,-1(\$a0)

UDONE:
jr \$ra
nop

################################################################################
## strlen: String Length

strlen:
## Register Usage
#
# \$a0: Address of first character of string.
# \$v0: Return value, the length of the string.
#
# \$t0: Character being examined.
# \$t1: Address of current character being examined.
#