diff options
Diffstat (limited to 'HW2/CS424_HW2_P3_Carpenter_Adam.asm')
-rw-r--r-- | HW2/CS424_HW2_P3_Carpenter_Adam.asm | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/HW2/CS424_HW2_P3_Carpenter_Adam.asm b/HW2/CS424_HW2_P3_Carpenter_Adam.asm new file mode 100644 index 0000000..fda28ff --- /dev/null +++ b/HW2/CS424_HW2_P3_Carpenter_Adam.asm @@ -0,0 +1,123 @@ +# CSCI 424, Homework 2 +# Adam Carpenter - username acarpent - acarpenter@email.wm.edu + .text + + .globl main +main: + # Get the string to test and store it. + jal Input_string + la $s0, ($a0) + + # ---Make a reversed copy of the string--- + la $a0, buffer2 # set aside space for new string + la $s1, ($a0) # set s1 to space for new string + la $t0, ($s0) # create address pointer + add $t1, $zero, 10 # create index +copier: + add $t0, $s0, $t1 # point to character at index + lb $t2, ($t0) # load byte located at index + beq $t2, 0, skipJunk # Skip null characters + beq $t2, 10, skipJunk # Skip new lines + sb $t2, ($a0) # store byte in reversed string + addi $a0, $a0, 1 # increment reversed string pointer +skipJunk: + addi $t1, $t1, -1 # decrement string pointer + bne $t1, -1, copier # if $t1 != -1, repeat the process + + # Now s0 points to the original string and + # s1 points to the reverse of the original + # string, which has been stripped of + # whitespace and null characters + # ---------------------------------------- + + # Start printing out the response + la $a0, str1 + jal Print_string + + la $a0, ($s0) + jal Print_string + + la $a0, str2 + jal Print_string + + # ---Loop to check if strings match--- + add $t0, $zero, $zero # flag marks whether string is palindrome + add $t1, $zero, $zero # create index +checkPalindrome: + add $t2, $s0, $t1 # point to character at next index + lb $s2, ($t2) # load character into t2 + beq $s2, 10, endLoop # end loop if newline + add $t3, $s1, $t1 # point to character at same index + lb $s3, ($t3) # load character into t3 + sub $t0, $s2, $s3 # if the two characters match, flag will remain 0 + bne $t0, $zero, notPalindrome # if flag is not zero, it's not a palindrome + addi $t1, $t1, 1 # increment index + jal checkPalindrome +endLoop: + beq $t0, $zero, isPalindrome + # This loop determines if the string is a + # palindrome by comparing it to the + # reversed duplicate string. The loop terminates + # when it finds the carriage return in the + # original string and jumps based on + # how the flag was set. + # ------------------------------------ + +notPalindrome: # The string is NOT a palindrome + la $a0, str3 + jal Print_string + jal Exit + +isPalindrome: # The string is a palindrome + la $a0, str4 + jal Print_string + jal Exit + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + .data + .align 0 +str1: + .asciiz "\nThe string " +str2: + .asciiz "is " +str3: + .asciiz "not a palindrome!\n" +str4: + .asciiz "a palindrome!\n" +buffer: + .space 12 +buffer2: + .space 12 + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Wrapper functions around some of the system calls +# From P&H COD, Fig. A.9.1 + .text + + .globl Input_string +Input_string: # take in a string from keyboard. String is in $a0 and length is in $a1 + la $a0, buffer # Place result in location of myString + li $a1, 12 # Maximum length for string + addi $v0, $zero, 8 + syscall + jr $ra + + .globl Print_string +Print_string: # print the string whose starting address is in register a0 + addi $v0, $zero, 4 + syscall + jr $ra + + .globl Exit +Exit: # end the program, no explicit return status + addi $v0, $zero, 10 + syscall + jr $ra + + .globl Exit2 +Exit2: # end the program, with return status from register a0 + addi $v0, $zero, 17 + syscall + jr $ra |