.data mainNumStrings: .word 5 mainStrings: .word mainStr1 .word mainStr2 .word mainStr3 .word mainStr4 .word mainStr5 mainStr1: .asciiz "One here With some CapitALS" mainStr2: .asciiz "in various Places WithIn the line" mainStr3: .asciiz "AND ONE THAT IS ALL CAPS" mainStr4: .asciiz "and one that is all lower" mainStr5: .asciiz " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" mainNewline: .asciiz "\n" .text main: # Function prologue -- even main has one subu $sp, $sp, 24 # allocate stack space -- default of 24 sw $fp, 0($sp) # save caller's frame pointer sw $ra, 4($sp) # save return address addiu $fp, $sp, 24 # setup main's frame pointer # for (i = 0; i < mainNumStrings; i++ ) # load address of string into $a0 # call processString # $s0 = i addi $s0, $zero, 0 # $s1 = mainNumStrings la $t0, mainNumStrings lw $s1, 0($t0) # $s2 = address of mainStrings la $s2, mainStrings MainLoopBegin: slt $t0, $s0, $s1 # $t0 = $s0 < $s1 beq $t0, $zero, MainLoopEnd lw $a0, 0($s2) # $a0 = addr of a string jal processString la $a0, mainNewline li $v0, 4 syscall addi $s0, $s0, 1 # i++ addi $s2, $s2, 4 # $s2 += 4, to get addr of next string j MainLoopBegin MainLoopEnd: MainDone: # Epilogue for main -- restore stack & frame pointers and return lw $ra, 4($sp) # get return address from stack lw $fp, 0($sp) # restore the caller's frame pointer addiu $sp, $sp, 24 # restore the caller's stack pointer jr $ra # return to caller countLower: # Function prologue subu $sp, $sp, 24 # allocate stack space -- default of 24 here sw $fp, 0($sp) # save caller's frame pointer sw $ra, 4($sp) # save return address sw $a0, 8($sp) # preserve $a0 addiu $fp, $sp, 24 # setup countLower's frame pointer # count = 0 # for (i = 0; buf[i] != '\0'; i++) # if ( buf[i] >= 'a' && buf[i] <= 'z' ) # count++ addi $t0, $zero, 0 # $t0 = i = 0 addi $t1, $zero, 0 # $t1 = count = 0 addi $t2, $zero, 0x61 # $t2 = 'a' addi $t3, $zero, 0x7a # $t3 = 'z' countLowerLoopBegin: lb $t4, 0($a0) # $t4 = buf[i] beq $t4, $zero, countLowerLoopEnd # is the character < 'a'? slt $t6, $t4, $t2 # $t6 = $t4 < $t2, $t6 = buf[i] < 'a' bne $t6, $zero, countLowerLoopBottom # is the character <= 'z'? addi $t5, $t3, 1 # want 'z' + 1 for comparison slt $t6, $t4, $t5 # $t6 = $t4 < $t5, $t6 = buf[i] <= 'z' beq $t6, $zero, countLowerLoopBottom addi $t1, $t1, 1 # count++ countLowerLoopBottom: addi $t0, $t0, 1 # i++ addi $a0, $a0, 1 j countLowerLoopBegin countLowerLoopEnd: addi $v0, $t1, 0 # $v0 = count # Epilogue for countLower -- restore stack & frame pointers lw $a0, 8($sp) # restore $a0 lw $ra, 4($sp) # get return address from stack lw $fp, 0($sp) # restore the caller's frame pointer addiu $sp, $sp, 24 # restore the caller's stack pointer jr $ra # return to caller # Your code goes below this line countUpper: # Prologue subu $sp, $sp, 24 sw $fp, 0($sp) sw $ra, 4($sp) sw $a0, 8($sp) addiu $fp, $sp, 24 # set up $t0 as counter, $t1 as upperCaseCounter,and $t2 and $t3 as A and Z add $t0, $zero, $zero # counter add $t1, $zero, $zero # upperCaseCounter add $t2, $zero, 0x41 # 'A' add $t3, $zero, 0x5a # 'Z' countUpperLoopBegin: lb $t4, 0($a0) # load byte into $t4 beq $t4, $zero, countUpperLoopEnd # is the character < 'A'? slt $t6, $t4, $t2 # $t6 = $t4 < $t2, $t6 = buf[i] < 'A' bne $t6, $zero, countUpperLoopBottom # is the character <= 'Z'? addi $t5, $t3, 1 # want 'Z' + 1 for comparison slt $t6, $t4, $t5 # $t6 = $t4 < $t5, $t6 = buf[i] <= 'Z' beq $t6, $zero, countUpperLoopBottom addi $t1, $t1, 1 # count++ countUpperLoopBottom: addi $t0, $t0, 1 # i++ addi $a0, $a0, 1 j countUpperLoopBegin countUpperLoopEnd: addi $v0, $t1, 0 # $v0 = count # Epilogue for countUpper -- restore stack & frame pointers lw $a0, 8($sp) # restore $a0 lw $ra, 4($sp) # get return address from stack lw $fp, 0($sp) # restore the caller's frame pointer addiu $sp, $sp, 24 # restore the caller's stack pointer jr $ra # return to caller .data countLowerText: .asciiz "Count of lower-case letters is " countUpperText: .asciiz "Count of upper-case letters is " .text processString: # Prologue subu $sp, $sp, 24 sw $fp, 0($sp) sw $ra, 4($sp) sw $a0, 8($sp) addiu $fp, $sp, 24 # load $a0 into $t6 and $t7 la $t6, 0($a0) # write text la $t7, 0($a0) # read text # $t0 = current character in $a0 lb $t0, 0($t7) # $t1 = 'A', $t2 = 'Z', $t3 = 'a', $t4 = 'z' add $t1, $zero, 0x41 add $t2, $zero, 0x5b add $t3, $zero, 0x61 add $t4, $zero, 0x7b # loop through the text until $t0 = 0 ProcessStringLoopBegin: beq $t0, $zero, ProcessStringEnd # end processString when the nul character is found # check if character is greater than 0x41 slt $t5, $t0, $t1 bne $t5, $zero, ProcessStringLoopBottom # if character is less than 0x5a, then it is upper case slt $t5, $t2, $t0 beq $t5, $zero, ProcessStringAddLetter # if character is less than 0x61, go to the bottom of the loop slt $t5, $t0, $t3 bne $t5, $zero, ProcessStringLoopBottom # epilogue lw $a0, 8($sp) # restore $a0 lw $ra, 4($sp) # get return address from stack lw $fp, 0($sp) # restore the caller's frame pointer addiu $sp, $sp, 24 # restore the caller's stack pointer jr $ra # return to caller