Commit | Line | Data |
---|---|---|
52495eef JB |
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 |