summaryrefslogtreecommitdiff
path: root/HW2/CS424_HW2_P3_Carpenter_Adam.asm
diff options
context:
space:
mode:
Diffstat (limited to 'HW2/CS424_HW2_P3_Carpenter_Adam.asm')
-rw-r--r--HW2/CS424_HW2_P3_Carpenter_Adam.asm123
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