I need help creating a Palindrome Checker

Abbar131313
timer Asked: Nov 5th, 2018

Question Description

The Task

In this project, you will be writing a program that receives a string of characters via the UART, checks if this string is a palindrome, and then uses a print function to print either “Yes” or “No”. A palindrome sequence of characters (typically a word or phrase) that is the same both forwards and backwards. For this project, strings will be terminated using a period (‘.’). You may assume that a string will contain at least one character in addition to a period. You will not need to handle empty strings or strings with only a period. Your program should be able to handle multiple strings sent one after another or concatenated together. For example, the string: “abba. data.” should print “Yes” followed by “No” on the next line. Spaces should be ignored when checking for a palindrome and the palindrome should not be case sensitive. For example, “A nut for a jar of Tuna.” would be considered a palindrome

Print Function

A skeleton PLP project file is available to download on Blackboard. The PLP project includes a second ASM file titled, project3_print.asm. This ASM file contains the print function used in this project. PLPTool concatenates all ASM files within a PLP project into a single location in memory (unless additional .org statements have been added to specify different location for code). No changes to project3_print.asm should be made.

When called, depending on the value in register $a0, the following string will be displayed on the simulated UART device’s output. If $a0 contains a zero then “No” will be displayed and if $a0 contains a non-zero value (e.g. one) then “Yes” will be displayed. The print function is called using the following instruction:

call project3_print

To use the print function, your PLP program needs to initialize the stack pointer ($sp) before performing the function call (or any other operations involving the stack pointer). For this reason, the skeleton project file includes an initialization that sets the stack pointer to 0x10fffffc (the last address of RAM).

Palindrome Checking Strategies

There are two strategies I would recommend for saving your string in in memory and checking to see if it is a palindrome. The first would be to use only an array and keep a pointer (a register containing a memory address) for both the first element in the array (commonly referred to as a head pointer) and last element in the array (commonly referred to as a tail pointer). As you add elements to your array, update your tail pointer so that it moves to the new last element in the array. When you have reached the end of your string (a period has been received), you can perform your palindrome check comparing the characters your head and tail pointers point to and, if they point to the same character, move them both inwards towards the center of your array. If the pointers cross and all the characters were the same, your string was a palindrome. The second strategy would be to use an array, treated as a queue, and the stack. You can traverse the array from the start (the first character saved) to the end (the last character saved) while simultaneously popping characters off the stack. The queue will give you the string forwards and the stack will give you the string backwards

For both techniques I described above, keep in mind they are simpler if you perform some conditioning to the characters you receive before saving them. For example you don’t need to save spaces in your data structure(s) since they can be ignored and the comparisons are simpler if, when first receiving character, you convert them all to the same case (either all upper or all lower) before storing them. That way you won’t need to write logic that indicates things like “A” == “a” and “A” == “a”

Unformatted Attachment Preview

Main.asm (skeleton file) .org 0x10000000 # Initializations li $sp, 0x10fffffc # Initialize any registers you will be using here. # It can be helpful to include a comment about a register's purpose # next to an initialization at the start of the program for reference. j main nop array_ptr: .space 100 # Label pointing to 100 word array main: j main nop Project3_print.asm: # Written by Christopher Mar # For use with ASU CSE 230 Project 3 only li $a0, control_message_p3 jal libplp_uart_write_string_p3 nop control_flow_trap_p3: j control_flow_trap_p3 nop string_yes_p3: .asciiz "Yes\n" string_no_p3: .asciiz " No\n" control_message_p3: .asciiz "Error:\nProgram entered project3_print.asm due to missing control flow at the end of\nmain.asm\n" project3_print: push $ra bne $a0 $0, set_ptr_yes nop li $a0, string_no_p3 j print_string_p3 nop set_ptr_yes: li $a0, string_yes_p3 print_string_p3: jal libplp_uart_write_string_p3 nop pop $ra return # From PLP UART Library libplp_uart_write_p3: lui $t0, 0xf000 #uart base address libplp_uart_write_loop_p3: lw $t1, 4($t0) #get the uart status andi $t1, $t1, 0x01 #mask for the cts bit beq $t1, $zero, libplp_uart_write_loop_p3 nop sw $a0, 12($t0) #write the data to the output buffer sw $t1, 0($t0) #send the data! jr $31 nop libplp_uart_write_string_p3: #we have a pointer to the string in a0, just loop and increment until we see a \0 move $t9, $31 #save the return address move $t8, $a0 #save the argument libplp_uart_write_string_multi_word_p3: lw $a0, 0($t8) #first 1-4 characters ori $t0, $zero, 0x00ff #reverse the word to make it big endian and $t1, $t0, $a0 #least significant byte sll $t1, $t1, 24 srl $a0, $a0, 8 and $t2, $t0, $a0 #second byte sll $t2, $t2, 16 srl $a0, $a0, 8 and $t3, $t0, $a0 #third byte sll $t3, $t3, 8 srl $a0, $a0, 8 #last byte in a0 or $a0, $t1, $a0 or $a0, $t2, $a0 or $a0, $t3, $a0 beq $a0, $zero, libplp_uart_write_string_done_p3 nop ori $t7, $zero, 4 libplp_uart_write_string_loop_p3: jal libplp_uart_write_p3 #write this byte addiu $t7, $t7, -1 srl $a0, $a0, 8 bne $a0, $zero, libplp_uart_write_string_loop_p3 nop beq $t7, $zero, libplp_uart_write_string_multi_word_p3 addiu $t8, $t8, 4 #increment for the next word libplp_uart_write_string_done_p3: jr $t9 #go home nop
User generated content is uploaded by users for the purposes of learning and should be used following Studypool's honor code & terms of service.

This question has not been answered.

Create a free account to get help with this and any other question!

Related Tags

Brown University





1271 Tutors

California Institute of Technology




2131 Tutors

Carnegie Mellon University




982 Tutors

Columbia University





1256 Tutors

Dartmouth University





2113 Tutors

Emory University





2279 Tutors

Harvard University





599 Tutors

Massachusetts Institute of Technology



2319 Tutors

New York University





1645 Tutors

Notre Dam University





1911 Tutors

Oklahoma University





2122 Tutors

Pennsylvania State University





932 Tutors

Princeton University





1211 Tutors

Stanford University





983 Tutors

University of California





1282 Tutors

Oxford University





123 Tutors

Yale University





2325 Tutors