Você está na página 1de 3

1 .

data
2 INFO1: .asciiz "Digite um numero de 9 algarismos para gerar um CPF: "
3 INFO2: .asciiz "O CPF gerado e: "
4 CPF: .word 0,0,0,0,0,0,0,0,0,0,0
5 .text
6 .globl main
7 main:
8
9 #IMPRIMIR STRING #
10 li $v0,4 # Codigo da instrucao
11 la $a0, INFO1
12 syscall
13
14 # LER UM NUMERO #
15 li $v0, 5 # O numero vai ser lido e armazenado em $v0
16 syscall
17
18 # ---- GUARDA O CPF DIGITADO NO VETOR --- #
19 addi $a0, $v0, 0
20 jal ARMAZENAR_CPF
21
22
23 # ----- CALCULAR DIGITO J ----- #
24 li $a0, 10 # PASSANDO O NUMERO DE REPETICOES DO WHILE
25 jal CALCULAR_DIGITO # CHAMAR FUNCAO
26
27 # ADICIONANDO VERIFICADOR J NO CPF #
28 li $s0, 9
29 li $s1, 4
30 mul $s0,$s0,$s1
31 sw $v0, CPF($s0) # PASSANDO CPF COM DIGITO J PRO CPF
32
33 # ----- CALCULAR DIGITO K ----- #
34 li $a0, 11 # PASSANDO O NUMERO DE REPETICOES DO WHILE
35 jal CALCULAR_DIGITO
36
37 # ADICIONANDO VERIFICADOR K NO CPF #
38 li $s0, 10 # POSICAO NO VETOR
39 mul $s0,$s0,$s1 # DESLOCAMENTO
40 sw $v0, CPF($s0) # PASSANDO CPF COM DIGITO K PRO CPF
41
42
43 # ----- IMPRIMIR STRING ----- #
44 li $v0,4 # Codigo da instrucao
45 la $a0, INFO2
46 syscall
47
48 # ----- IMPRIMIR VETOR ----- #
49 li $t1, 0
50 li $t3, 11
51 WHILE3:
52 beq $t1, $t3, FIM_WHILE3
53 li $v0,1 # Codigo da instrucao
54 mul $t0, $s1, $t1
55 lw $a0, CPF($t0)
56 syscall
57 addi $t1, $t1, 1
58
59 j WHILE3
60 FIM_WHILE3:
61
62 j end
63
64
65 # a0 = Cpf (ARGUMENTO)
66 # s0 = Cpf
67 # s1 = Algarismo do cpf
68 # t0 = Indice
69 # t1 = Valor 10 para operacoes
70 # t2 = Constante do vetor
71 # t3 = Deslocamento
72 ARMAZENAR_CPF: # GUARDA O CPF NA MEMORIA
73
74 # EMPILHAR #
75
76 addi $sp, $sp, -24
77 sw $t0, 0($sp)
78 sw $t1, 4($sp)
79 sw $t2, 8($sp)
80 sw $t3, 12($sp)
81 sw $s0, 16($sp)
82 sw $s1, 20($sp)
83
84 # --------- #
85
86 li $t0, 8
87 li $t1, 10
88 li $t2, 4
89 addi $s0, $a0, 0
90 WHILE2:
91 beq $s0, $zero, FIM_WHILE2
92 rem $s1, $s0, $t1
93 div $s0, $s0, $t1
94 mul $t3, $t0, $t2
95 sw $s1, CPF($t3)
96 addi $t0, $t0, -1
97 j WHILE2
98 FIM_WHILE2:
99
100 # DESEMPILHAR #
101
102 lw $s1, 20($sp)
103 lw $s0, 16($sp)
104 lw $t3, 12($sp)
105 lw $t2, 8($sp)
106 lw $t1, 4($sp)
107 lw $t0, 0($sp)
108 addi $sp, $sp, 24
109
110 # --------- #
111
112 jr $ra
113
114
115
116
117 # a0 = tamanho use 10 para digito J e 11 para digito K
118 # t0 = somatorio
119 # t1 = algarismo
120 # t2 = produto do algarismo pela constante
121 # t3 = resto
122 # t4 = numero de repeticoes do while
123 # t5 = tamanho 10 ou 11
124 # s0 = i indice da estrutura de repetica
125 # s1 = Registrador com valor 10 para operacoes
126 # s2 = Registrador com valor 11 para operacoes
127 # s3 = Registrador para resultado de operacao relacional
128 # s4 = Registrador com valor 1 para operacoes
129 # s5 = Deslocamento do vetor
130 # s6 = Registrador com valor 4 para operacoes
131 # v0 = digito verificador
132 CALCULAR_DIGITO:
133
134 # EMPILHAR #
135
136 addi $sp, $sp, -52
137 sw $t0, 0($sp)
138 sw $t1, 4($sp)
139 sw $t2, 8($sp)
140 sw $t3, 12($sp)
141 sw $s0, 16($sp)
142 sw $s1, 20($sp)
143 sw $s2, 24($sp)
144 sw $s3, 28($sp)
145 sw $s4, 32($sp)
146 sw $s5, 36($sp)
147 sw $t4, 40($sp)
148 sw $t5, 44($sp)
149 sw $s6, 48($sp)
150
151 # --------- #
152
153
154 li $t0, 0 # somatorio = 0
155 li $s0, 0 # i = 2
156 li $s1, 10 # Valor para operacoes com 10
157 li $s2, 11 # Valor para operacoes com 11
158 li $s4, 1 # Serve pra comparacao no final da funcao
159 li $s6, 4 # Valor para operacoes com 4
160 addi $t4, $a0, -1 # Tamanho no reg t4 para comparacao
161 addi $t5, $a0, 0 # Tamanho no reg t5 para calculo do somatorio
162
163
164 WHILE: # While(i<tam-1)
165 slt $s3, $s0, $t4
166 beq $s3, $zero, FIM_WHILE
167 mul $s5, $s0, $s6 # i
168 lw $t1, CPF($s5) # cpf[i]
169 mul $t2, $t1, $t5 # produto = cpf[i] * tam
170 add $t0, $t0, $t2 # somatorio+= produto
171 addi $t5, $t5, -1 # tam--
172 addi $s0, $s0, 1 # i++
173 j WHILE
174 FIM_WHILE:
175
176 rem $t3, $t0, $s2
177
178 IF:
179 bne $t3, $zero, ELSE # if (resto == 0)
180 bne $t3, $s4, ELSE # if (resto == 1)
181 li $v0, 0 # return 0
182 j FIM_IF
183 ELSE:
184 sub $v0, $s2, $t3 # return 11 - resto
185 FIM_IF:
186
187
188 # DESEMPILHAR #
189
190 lw $s6, 48($sp)
191 lw $t5, 44($sp)
192 lw $t4, 40($sp)
193 lw $s5, 36($sp)
194 lw $s4, 32($sp)
195 lw $s3, 28($sp)
196 lw $s2, 24($sp)
197 lw $s1, 20($sp)
198 lw $s0, 16($sp)
199 lw $t3, 12($sp)
200 lw $t2, 8($sp)
201 lw $t1, 4($sp)
202 lw $t0, 0($sp)
203 addi $sp, $sp, 52
204
205 # --------- #
206
207
208 jr $ra
209
210 end:

Você também pode gostar