.data
doi:
.ascii "Oh, I have slipped the surly bonds of earth"
.ascii " And danced the skies on laughter-silvered wings;"
.ascii "Sunward I've climbed, and joined the tumbling mirth"
.ascii " Of sun-split clouds -- and done a hundred things"
.ascii "You have not dreamed of -- wheeled and soared and swung"
.ascii " High in the sunlit silence. Hov'ring there,"
.ascii "I've chased the shouting wind along, and flung"
.ascii " My eager craft through footless halls of air."
.ascii "Up, up the long, delirious burning blue,"
.ascii " I've topped the windswept heights with easy grace"
.ascii "Where never lark, or even eagle flew."
.ascii " And, while with silent, lifting mind I've trod"
.ascii "The high untresspassed sanctity of space,"
.ascii " Put out my hand, and touched the face of God."
.ascii ""
.asciiz "-- RCAF Flight-Lieutenant John Gillespie Magee Jr."
msg:
.asciiz "Letter %/t3/c count: %/t1/3d (%/f4/6.2f%%) %/t5/s\n";
.align 4
histogram_data:
.space 104
stars:
.space 40
.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.
addi $s0, $ra, 0 # Make a copy of the return address.
jal upper # Convert to upper case.
addi $t0, $a0, 0 # Make a copy of string start address.
addi $ra, $s0, 0 # Restore return address.
LOOP:
lbu $t1, 0($t0) # Load a character.
addi $t0, $t0, 1 # Increment address.
beq $t1, $0, DONE # Check for null termination.
addi $t1, $t1, -65 # Set $t1 to table index. ( A->0, B->1, etc.)
sltiu $t2, $t1, 26 # If $t1 is >= 26 then it's not a letter.
beq $t2, $0, LOOP # Note that comparison above is unsigned.
sll $t1, $t1, 2 # Scale index.
add $t3, $a1, $t1 # Add index on to address of first element
lw $t4, 0($t3) # Load histogram entry.
addi $t4, $t4, 1
j LOOP
sw $t4, 0($t3) # Store the incremented value.
DONE:
jr $ra
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