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

# Time-stamp: <21 September 2005, 15:06:31 CDT, koppel@nested>

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

################################################################################
## Data Section

.data
doi:
.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

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

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

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

jal strlen
nop
mtc1 \$v0, \$f2
cvt.d.w \$f2, \$f2
addi \$v0, \$0, 100
mtc1 \$v0, \$f4
cvt.d.w \$f4, \$f4
div.d \$f2, \$f4, \$f2

jal histo
nop
add \$t0, \$0, \$0
addi \$t3, \$0, 64
addi \$t4, \$t3, 26
la \$s1, histogram_data
addi \$v0, \$0, 11
la \$s2, stars
addi \$s2, \$s2, 41
L2:
lw \$t1, 0(\$s1)
addi \$s1, \$s1, 4
beq \$t1, \$0, TEST
addi \$t3, \$t3, 1
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

addi \$v0, \$0, 10
syscall

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

histo:
## Register Usage
#
# Call: \$a0  String to analyze.
#       \$a1  Address of table.  Each element is an integer.

add \$s1, \$ra, \$0
jal upper
add \$s0, \$a0, \$0
add \$a0, \$0, \$s0

LOOP:
lb \$t0,0(\$a0)
addi \$a0, \$a0, 1
LOOP2:
addi \$t0, \$t0, -65
sll \$t0, \$t0, 2
add \$t2, \$a1, \$t0
lw \$t1, 0(\$t2)
addi \$t1, \$t1, 1
sw \$t1, 0(\$t2)
lb \$t0,0(\$a0)
bne \$t0, \$0, LOOP2
addi \$a0, \$a0, 1

DONE:
jr \$s1
nop

################################################################################
## 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.
ULOOP:
lbu \$t1, 0(\$a0)
addi \$a0, \$a0, 1
beq \$t1, \$0, UDONE
slti \$t2, \$t1, 97 # < 'a'
bne \$t2, \$0 ULOOP
slti \$t2, \$t1, 123 # 'z' + 1
beq \$t2, \$0, ULOOP
addi \$t1, \$t1, -32
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.
#
addi \$t1, \$a0, 0
SLOOP:
lbu \$t0, 0(\$t1)
bne \$t0, \$0, SLOOP
addi \$t1, \$t1, 1

addi \$t1, \$t1, -1
jr \$ra
sub \$v0, \$t1, \$a0
```