How to iterate a string in mips assembly
15,615
1 This
move $t3, $a0
should be
move $a0, $t3
2 This
lb $t3, 8($t2)
should be
lb $t3, 0($t2)
3 This
addi $t3, $zero, -30 #changes letter to lowercase
should be
addi $t3, $t3, -32 #changes letter to lowercase
Author by
Greg
Updated on June 09, 2022Comments
-
Greg almost 2 years
So I am working on a project right now where we have to take in a string and convert it to all uppercase letters and then to lowercase letters if either the toUpper or toLower byte is anything but 0. Right now I am still working on the uppercase portion (guessing the lowercase will be almost the same) but I am getting stuck either when I am going through the string to find the letters that are uppercase or when I am calling the syscall to print. Any help would be great. Here's what I have so far:
.data toUpper: .byte 1 toLower: .byte 0 string: .asciiz " A long time ago in a Galaxy far, far away...." # Your code goes below this line origString: .asciiz "Original string:\n" toUpForwardStr: .asciiz "\nConverted to upper-case:\nForward:\n" toLowerForwardStr: .asciiz "\nConverted to lower-case:\nForward:\n" backwardStr: .asciiz "Backward:" .text main: # 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 addiu $fp, $sp, 20 # setup main's frame pointer la $a0, origString #Print "Original String:" addi $v0, $zero, 4 syscall la $a0, string #Print string addi $v0, $zero, 4 syscall la $s0, toUpper sb $s1, 0($s0) #toUpper stored in $s1 la $s0, toLower sb $s2, 0($s0) #toLower stored in $s2 bne $s1, $zero, toUpperCase #Jump toUpperCase if toUpper ≠ 0 toUpperCase: la $a0, toUpForwardStr #Print "Converted to upper-case:" addi $v0, $zero, 4 # "Forward:" syscall la $s3, string #$s3 holds address to string addi $s1, $zero, 0 #$s1 = i = 0 j upperCaseLoop #Goto upperCaseLoop upperCaseLoop: # Compute address of string[i] add $t2, $s3, $s1 # $t2 = address of string[i] lb $t3, 8($t2) # $t3 = elements[i] beq $t3, $zero, upperDone # test if for loop is done addi $t6, $zero, 96 #$t6 = 96 (lowercase letters) bgt $t3, $t6, isLowercase1#If letter is lowercase goto isLowercase1 comeBackFromLowercaseIfs: move $t3, $a0 addi $v0, $zero, 11 syscall addi $s1, $s1, 1 # i++ j upperCaseLoop upperDone: bne $s2, $zero, toLowerCase #Jump toLowerCase if toLower ≠ 0 toLowerCase: la $a0, toLowerForwardStr #Print "Converted to lower-case:" addi $v0, $zero, 4 # "Forward:" syscall j done #The END!! isLowercase1: addi $t7, $zero, 123 #$t7 = 123 blt $t3, $t7, isLowercase2 #Goto isLowercase2 j comeBackFromLowercaseIfs #Go back to uppercaseLoop isLowercase2: addi $t3, $zero, -30 #changes letter to lowercase j comeBackFromLowercaseIfs #Go back to uppercaseLoop done: # 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's code
-
Greg over 11 yearsAwesome! Thanks patrik, works great now. I think I was just looking at the code for too long :) (and as you know with mips after a while it all looks the same)