-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathprint_matrix_loop_ult.s
134 lines (101 loc) · 4.41 KB
/
print_matrix_loop_ult.s
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
.data
format_msg: .asciiz "Hello %s\n"
matrixA: .word32 1,2,3,4
matrix: .space 64
my_msg: .asciiz "Hello people!!!"
params_format: .space 8
params_sys5: .space 8
.code
main: ADD $s0, $zero, $zero ; i = 0
ADDI $s2, $zero, 0x4
ADDI $s4, $zero, 0x2 ; ordem = 2
ADDI $t5, $zero, 0x4 ; ordem*ordem
SLT $t0, $s0, $s4 ; i < ordem
start_loop_1: BEQZ $t0, finalLoop
ADD $s3, $zero, $s0
start_loop_2: SLT $t0, $s3, $t5 ; i < ordem
BEQZ $t0, final_loop_2
MULT $s3, $s2
MFLO $t0
LB $s1, matrixA($t0)
JAL conv_for_ascii
JAL func_add_wd
JAL verify_is_full
XOR $v0, $v0,$v0
XOR $v1, $v1,$v1
ADDI $v0, $zero, 0x20
ADDI $v1, $zero, 0x8
JAL func_add_wd
JAL verify_is_full
ADDI $s3, $s3, 0x2
B start_loop_2
final_loop_2:
ADDI $s0, $s0, 0x1
XOR $v0, $v0,$v0
XOR $v1, $v1,$v1
ADDI $v0, $zero, 0xa
ADDI $v1, $zero, 0x8
JAL func_add_wd
JAL verify_is_full
B start_loop_1
finalLoop: JAL func_add_wd
JAL move_restante
daddi $a3, $zero, matrix
sw $a3, params_sys5($zero)
daddi $t6, $zero, params_sys5
syscall 5
syscall 0
move_restante: SD $s6, matrix($s5)
XOR $s6,$s6,$s6
XOR $s7,$s7,$s7
JALR $ra
; guarda em $s5 o index do vetor de caracteres
verify_is_full: SLTI $t0, $s7, 0x40
BNEZ $t0, end_the_func
SD $s6, matrix($s5)
ADDI $s5, $s5, 0x8
XOR $s6,$s6,$s6
XOR $s7,$s7,$s7
end_the_func: JALR $ra
; A funcao usa o registrador $s7 para manter o tamanho da palavra e $s6 para a palavra
; E pega o valor de $v0 e $v1
func_add_wd: ADDI $t0, $zero, 0x40 ; maximo de uma palavra
DSUB $t1, $t0, $s7
SLT $t2, $v1, $t1
BEQZ $t2, nao_tem_spaco
DSLLV $v0, $v0, $s7
DADD $s6, $s6, $v0
DADD $s7, $s7, $v1
JALR $ra
nao_tem_spaco: DSUB $t3, $v1, $t1
DADD $t4, $zero, $v0
DSLLV $t4, $v0, $s7
DADD $s6, $s6, $t4
DADD $v1, $zero, $t3
DSRLV $v0, $v0, $t1
DADD $s7, $zero, $t0
JALR $ra
; convert o que estar em $s1 para codigo asciiz
conv_for_ascii: ADDI $t0, $zero, 0xa
DADDI $v1, $zero, 0x0
DADD $v0, $zero, $zero
ANDI $a1, $s1, 0x80
ADDI $t7, $zero, 0x0 ; numero positivo
BEQZ $a1, eh_positivo
ADDI $a1, $zero, -1
MULT $s1, $a1
MFLO $s1
ADDI $t7, $zero, 0x1 ; numero negativo
eh_positivo: DSLL $v0, $v0, 0x8
DADDI $v1, $v1, 0x8
DIV $s1, $t0
MFHI $a2
DADDI $a2, $a2, 0x30
DADD $v0, $v0, $a2
MFLO $s1
BNEZ $s1, eh_positivo
BEQZ $t7, final_func
DSLL $v0, $v0, 0x8
DADDI $v1, $v1, 0x8
DADDI $v0, $v0, 0x2d
final_func: JALR $ra