Add palidrome detection exercice.
[TD_IML.git] / TD4 / mips3.asm
1 .data
2 input: .space 20
3 input_string: .asciiz "Saisir un mot ? "
4 msg_palindrome_part_1: .asciiz "Le mot "
5 msg_palindrome_part_2: .asciiz " un palindrome"
6 msg_is_palindrome: .asciiz "est"
7 msg_is_not_palindrome: .asciiz "n'est pas"
8 newline: .asciiz "\n"
9
10 .text
11 main:
12 jal input_word
13 jal clean_and_length_word
14 jal isPalindrome
15 li $v0, 10
16 syscall
17
18 input_word:
19 la $a0, input_string
20 li $v0, 4
21 syscall
22 li $v0, 8
23 la $a0, input
24 li $a1, 20
25 syscall
26 jr $ra
27
28 clean_and_length_word:
29 la $s4, ($zero)
30 la $s0, input # $s0 contains base address of the string buffer
31 addi $s3, $0, '\n' # $s3 = '\n'
32 loop1:
33 lb $s1, 0($s0) # load character into $s1
34 beq $s1, $s3, end1 # break if byte is newline
35 addi $s0, $s0, 1 # increment buffer address
36 addi $s4, $s4, 1
37 j loop1
38 end1:
39 la $a2, ($s4)
40 jr $ra
41
42 isPalindrome:
43 # Check base case
44 slti $t0, $a2, 2
45 bne $t0, $zero, returnTrue
46
47 # Make sure first and last are equal
48 lb $t0, 0($a0)
49 addi $t1, $a2, -1
50 add $t1, $t1, $a0
51 lb $t1, 0($t1)
52 bne $t0, $t1, returnFalse
53
54 # Shift pointer, length, recurse
55 addi $a2, $a2, -2
56 addi $a0, $a0, 1
57 j isPalindrome
58
59 returnFalse:
60 addi $v0, $zero, 0
61 addi $sp, $sp, -4
62 sw $ra, 0($sp)
63 jal display_not_palindrome
64 lw $ra, 0($sp)
65 addi $sp, $sp, 4
66 jr $ra
67
68 returnTrue:
69 addi $v0, $zero, 1
70 addi $sp, $sp, -4
71 sw $ra, 0($sp)
72 jal display_palindrome
73 lw $ra, 0($sp)
74 addi $sp, $sp, 4
75 jr $ra
76
77 display_palindrome:
78 la $a0, msg_palindrome_part_1
79 li $v0, 4
80 syscall
81 la $a0, input
82 li $v0, 4
83 syscall
84 la $a0, msg_is_palindrome
85 li $v0, 4
86 syscall
87 la $a0, msg_palindrome_part_2
88 li $v0, 4
89 syscall
90 la $a0, newline
91 li $v0, 4
92 syscall
93 jr $ra
94
95 display_not_palindrome:
96 la $a0, msg_palindrome_part_1
97 li $v0, 4
98 syscall
99 la $a0, input
100 li $v0, 4
101 syscall
102 la $a0, msg_is_not_palindrome
103 li $v0, 4
104 syscall
105 la $a0, msg_palindrome_part_2
106 li $v0, 4
107 syscall
108 la $a0, newline
109 li $v0, 4
110 syscall
111 jr $ra