Fixlets to palindrome example
[TD_IML.git] / TD4 / mips3.asm
1 .data
2 input: .space 50
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: .asciiz " est"
7 msg_is_not: .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, 50
25 syscall
26 jr $ra
27
28 clean_and_length_word:
29 la $s4, ($zero) # word length
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 sb $0, 0($s0) # replace newline with 0
40 la $a2, ($s4)
41 jr $ra
42
43 isPalindrome:
44 # Check base case
45 slti $t0, $a2, 2
46 bne $t0, $zero, returnTrue
47
48 # Make sure first and last are equal
49 lb $t0, 0($a0)
50 addi $t1, $a2, -1
51 add $t1, $t1, $a0
52 lb $t1, 0($t1)
53 bne $t0, $t1, returnFalse
54
55 # Shift pointer, length, recurse
56 addi $a2, $a2, -2
57 addi $a0, $a0, 1
58 j isPalindrome
59
60 returnFalse:
61 addi $v0, $zero, 0
62 addi $sp, $sp, -4
63 sw $ra, 0($sp)
64 jal display_not_palindrome
65 lw $ra, 0($sp)
66 addi $sp, $sp, 4
67 jr $ra
68
69 returnTrue:
70 addi $v0, $zero, 1
71 addi $sp, $sp, -4
72 sw $ra, 0($sp)
73 jal display_palindrome
74 lw $ra, 0($sp)
75 addi $sp, $sp, 4
76 jr $ra
77
78 display_palindrome:
79 la $a0, msg_palindrome_part_1
80 li $v0, 4
81 syscall
82 la $a0, input
83 li $v0, 4
84 syscall
85 la $a0, msg_is
86 li $v0, 4
87 syscall
88 la $a0, msg_palindrome_part_2
89 li $v0, 4
90 syscall
91 la $a0, newline
92 li $v0, 4
93 syscall
94 jr $ra
95
96 display_not_palindrome:
97 la $a0, msg_palindrome_part_1
98 li $v0, 4
99 syscall
100 la $a0, input
101 li $v0, 4
102 syscall
103 la $a0, msg_is_not
104 li $v0, 4
105 syscall
106 la $a0, msg_palindrome_part_2
107 li $v0, 4
108 syscall
109 la $a0, newline
110 li $v0, 4
111 syscall
112 jr $ra