-
Notifications
You must be signed in to change notification settings - Fork 0
/
inicializaVetor.asm
171 lines (122 loc) · 2.88 KB
/
inicializaVetor.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
.data
vet: .word 0:39
nline: .asciiz "\n"
.text
.main:
## salva numero
li $a1, 20
#endereço de memoria do vetor
la $a0, vet
#ultimo valor
li $a2, 5
jal inicializaVetor
#copia valores de retorno
move $t0, $v0
move $t1, $v1
#soma retornos
add $t3, $t1, $t0
li $v0, 1
add $a0, $t3, $zero
syscall
la $a0, vet
li $a1, 20
jal imprimeVetor
li $v0, 10
syscall
inicializaVetor:
#prepara stack para 5 valores
addi $sp, $sp -24
sw $ra, 0($sp)
#carrega valores em registradores s
add $s0, $zero, $a0
add $s1 ,$zero, $a1
add $s2, $zero, $a2
#salva valores na stack
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
#caso trivial, tam =0
li $t3, 0
bgt $t3, $s1, end
#carrega argumentos de valorAleatorio
move $a0, $s2
li $a1, 47
li $a2, 97
li $a3, 337
li $s4, 3
#carrega quinto argumento
sw $s4, 16($sp)
jal valorAleatorio
move $t2, $v1
#subtrai tam-1
addi $s1, $s1, -1
#carrega bytes do vetor
add $t0, $zero, $s1
sll $t0, $t0, 2
#vai para o indice tam -1
add $s0, $s0, $t0
#salva valor aleatorio
sw $t2, 0($s0)
#volta o indice
sub $s0, $s0, $t0
#carrega argumentos novamente
add $a0, $zero, $s0
add $a1, $zero, $s1
add $a2, $zero, $t2
#salva novoValor
add $s5, $s5, $t2
sw $s5, 20($sp)
jal inicializaVetor
end:
#carrega caso trivial
li $v0, 0
#recupera endereço de retorno
lw $ra, 0($sp)
#recupera somatorio
add $v1, $zero, $s5
#desaloca stack
addi $sp, $sp, 24
jr $ra
valorAleatorio:
mult $a0, $a1 # a * b
mflo $t0
add $t1, $t0, $a2 # a * b + c
div $t1, $a3 # (a * b + c) % d
mfhi $t2
sub $v1, $t2, $s4 # (a * b + c) % d - e
jr $ra # retorna
# receives a vector and it's size and prints it
imprimeVetor:
# contador do for
li $t0, 0
#$t1 mantem o indice do vetor
add $t1, $zero,$a0
#tamanho do vetor em $s1
add $s1, $zero,$a1
# multiplica por 4 para a quantidade de bytes
sll $s1,$s1, 2
for:
#incrementa o indice
addi $t0, $t0, 4
#checa condicao de parada
bgt $t0, $s1, fim_for
#carrega valor localizado no vetor
lw $t2, 0($t1)
#prepara o print
li $v0,1
#carrega valor no registrador $a0
move $a0, $t2
#printa
syscall
#printa espaco em branco
li $a0, 32
li $v0, 11
syscall
#incrementa posicao do vetor
addi $t1,$t1, 4
j for
fim_for:
li $v0, 4
la $a0, nline
syscall
jr $ra