Add palidrome detection exercice.
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 26 Jun 2017 11:56:29 +0000 (13:56 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 26 Jun 2017 11:56:29 +0000 (13:56 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TD4/mips3.asm [new file with mode: 0644]

diff --git a/TD4/mips3.asm b/TD4/mips3.asm
new file mode 100644 (file)
index 0000000..889258c
--- /dev/null
@@ -0,0 +1,111 @@
+.data
+input:                 .space  20
+input_string:          .asciiz "Saisir un mot ? "
+msg_palindrome_part_1: .asciiz "Le mot "
+msg_palindrome_part_2: .asciiz " un palindrome"
+msg_is_palindrome:     .asciiz "est"
+msg_is_not_palindrome: .asciiz "n'est pas"
+newline:               .asciiz "\n"
+.text
+main:
+    jal input_word
+    jal clean_and_length_word
+    jal isPalindrome
+    li  $v0, 10
+    syscall
+   
+input_word:
+    la  $a0, input_string
+    li  $v0, 4
+    syscall
+    li  $v0, 8
+    la  $a0, input
+    li  $a1, 20
+    syscall
+    jr  $ra
+
+clean_and_length_word:
+    la   $s4, ($zero)
+    la   $s0, input    # $s0 contains base address of the string buffer
+    addi $s3, $0, '\n' # $s3 = '\n'
+loop1:
+    lb   $s1, 0($s0)   # load character into $s1
+    beq  $s1, $s3, end1        # break if byte is newline
+    addi $s0, $s0, 1   # increment buffer address
+    addi $s4, $s4, 1
+    j    loop1
+end1:
+    la   $a2, ($s4)
+    jr   $ra
+    
+isPalindrome:
+    # Check base case
+    slti $t0, $a2, 2
+    bne         $t0, $zero, returnTrue
+
+    # Make sure first and last are equal
+    lb  $t0, 0($a0)
+    addi $t1, $a2, -1
+    add         $t1, $t1, $a0
+    lb  $t1, 0($t1)
+    bne         $t0, $t1, returnFalse
+    
+    # Shift pointer, length, recurse
+    addi $a2, $a2, -2
+    addi $a0, $a0, 1
+    j   isPalindrome
+returnFalse:
+    addi $v0, $zero, 0
+    addi $sp, $sp, -4
+    sw   $ra, 0($sp)
+    jal  display_not_palindrome
+    lw   $ra, 0($sp)
+    addi $sp, $sp, 4
+    jr  $ra
+
+returnTrue:
+    addi $v0, $zero, 1
+    addi $sp, $sp, -4
+    sw   $ra, 0($sp)
+    jal  display_palindrome
+    lw   $ra, 0($sp)
+    addi $sp, $sp, 4
+    jr  $ra
+display_palindrome:
+    la   $a0, msg_palindrome_part_1
+    li   $v0, 4
+    syscall
+    la   $a0, input
+    li   $v0, 4
+    syscall
+    la   $a0, msg_is_palindrome
+    li   $v0, 4
+    syscall 
+    la   $a0, msg_palindrome_part_2
+    li   $v0, 4
+    syscall
+    la   $a0, newline
+    li   $v0, 4
+    syscall
+    jr   $ra   
+          
+display_not_palindrome:
+    la   $a0, msg_palindrome_part_1
+    li   $v0, 4
+    syscall
+    la   $a0, input
+    li   $v0, 4
+    syscall
+    la   $a0, msg_is_not_palindrome
+    li   $v0, 4
+    syscall 
+    la   $a0, msg_palindrome_part_2
+    li   $v0, 4
+    syscall
+    la   $a0, newline
+    li   $v0, 4
+    syscall
+    jr   $ra
\ No newline at end of file