-
Notifications
You must be signed in to change notification settings - Fork 0
/
Labaoc2.asm
174 lines (137 loc) · 4.35 KB
/
Labaoc2.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# Implemente um programa em linguagem assembly que leia como entrada um
# texto terminado no caractere ascii correspondente à tecla enter. Depois, o
# programa deve gerar as seguintes saídas nesta ordem:
# Número total de caracteres:
# Número total de palavras:
# Palavras repetidas:
# A primeira linha deve imprimir a quantidade total de caracteres, sem contar o
# último enter. Os espaços e outros caracteres especiais também são contados.
# A segunda linha deve imprimir a quantidade de palavras. Números e símbolos
# não contam como palavras. As palavras devem aparecer separadas por espaços
# e pela pontuação das frases.
# A terceira linha deve imprimir as palavras que se repetem pelo menos duas
# vezes no texto separadas por espaços.
# Exemplo:
# Oi, desculpe por não te ligar hoje às 8:00. Estava muito frio e não te
# encontrei em casa.
# Saída:
# Número total de caracteres: 89
# Número total de palavras: 17
# Palavras repetidas: não te
# Cada uma das saídas deve ser implementada em uma chamada de
# procedimento separada.
.data
mensagem: .asciiz "Insira o texto: "
mensagem1: .asciiz "Número total de caracteres: "
mensagem2: .asciiz "Número total de palavras: "
mensagem3: .asciiz "Palavras repetidas: "
palavrasrep: .asciiz " "
enter: .asciiz "\n"
texto: .space 500
.text
li $v0, 4 #Imprime a primeira mensagem
la $a0, mensagem
syscall
li $v0, 8 #Faz a leitura do texto inicial
la $a0, texto
la $a1, 500
syscall
move $t0, $a0
li $t6, -1 #inicia um ponteiro que indica a ultima posição dos caracteres inseridos que possivelmente repetem
li $t7, -1 #inicia um ponteiro que indica a primeira posição dos caracteres inseridos que possivelmente repetem
caracteres:
lb $a0, ($t0) #passa a primeira posição do texto
beq $a0, 10, fimC #analisa se está no final da string
addi $t1, $t1, 1 #contador de caracteres
add $t0, $t0, 1 #avança uma posição na string
j caracteres
fimC:
sub $t0, $t0, $t1 #retorna a posição inicial do texto
palavras: #conta o número de palavras
lb $a0, ($t0)
beq $a0, 10, fimP
beq $a0, 0, fimP
bgt $a0, 64, acrescenta
passo: #parte para a próxima posição do texto
add $t0,$t0,1
j palavras
acrescenta: #soma um ao contador e atualiza os ponteiros
addi $t2, $t2, 1
addi $t6, $t6, 1
addi $t7, $t7, 1
espaco:
lb $t3, ($t0)
sb $t3, palavrasrep($t6) #copia a palavra encontrada no texto
lb $a0, ($t0)
beq $a0, 10, limpa #limpa a variavel com essa palavra encontrada
beq $a0, 32, repeticao #analisa se a palavra se repete
add $t0, $t0, 1
add $t6, $t6, 1
j espaco
repeticao: #atualiza a posição referente às palavras
la $t4, ($t0) #obtém a posição seguinte a palavra no texto
retorna:
la $t3, palavrasrep($t7) #passa a primeira posição da palavra presente na variável
lb $a0, ($t3)
repeticao1: #analisa se o caracter presente na variavel e no texto são iguais
lb $t5, ($t4)
beq $t5, 10, limpa
beq $t5, 32, repeticao2
addi $t4, $t4, 1
j repeticao1
repeticao2: #caso os caracteres sejam iguais, analisa se o caracter anterior no texto foi um espaço
addi $t4, $t4, 1
lb $t5, ($t4)
bne $a0, $t5, repeticao1
analisa: #analisa se os demais caracteres são iguais para então poder concluir que são as mesmas palavras
addi $t3, $t3, 1
addi $t4, $t4, 1
lb $a0, ($t3)
lb $t5, ($t4)
beq $t5, 32, atualiza
beq $t5, 10, atualiza
bne $a0, $t5, retorna
j analisa
atualiza: #atualiza o ponteiro referente a primeira posição da palavra a ser inserida
move $t7, $t6
j passo
limpa: #obtém a posição do primeiro caracter da palavra na variável a ser removida
move $s1, $t7
li $s0, 32
limpa1: #limpa a palavra inserida
sb $s0, palavrasrep($s1)
add $s1, $s1, 1
lb $t3, palavrasrep($s1)
beq $t3, 32, limpa2
j limpa1
limpa2: #atualiza o ponteiro refenrete a primeira posição da palavra inserida
subi $t7, $t7, 1
move $t6, $t7
j passo
fimP:
li $s0, 10
sb $s0, palavrasrep($t6) #adiciona um \n no final da variável com as palavras repetidas
#imprime o resultado
li $v0, 4
la $a0, mensagem1
syscall
li $v0, 1
move $a0, $t1
syscall
li $v0, 4
la $a0, enter
syscall
li $v0, 4
la $a0, mensagem2
syscall
li $v0, 1
move $a0, $t2
syscall
li $v0, 4
la $a0, enter
syscall
li $v0, 4
la $a0, mensagem3
syscall
la $a0, palavrasrep
syscall