## LSU EE 3755 -- Spring 2002 -- Computer Organization # ## Example used in class 22 April 2002. ## Collect a histogram of letter usage and print bar graph. .data doi: .ascii "We hold these truths to be self-evident that all men " .ascii "are created equal, that they are endowed by their " .ascii "Creator with certain unalienable Rights, that among " .ascii "these are Life, Liberty, and the pursuit of " .ascii "Happiness. That to secure these rights, Governments " .ascii "are instituted among Men, deriving their just powers " .ascii "from the consent of the governed. That whenever any " .ascii "Form of Government becomes destructive of these ends, " .ascii "it is the Right of the People to alter or to abolish " .ascii "it, and to institute new Government, laying its " .ascii "foundation on such principles and organizing its " .ascii "powers in such form, as to them shall seem most likely " .asciiz "to effect their Safety and Happiness " 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