-
Notifications
You must be signed in to change notification settings - Fork 0
/
8_raid_5.asm
211 lines (182 loc) · 3.15 KB
/
8_raid_5.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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
.data
start: .asciiz " Disk1 Disk2 Disk3 \n "
string: .asciiz " -------------- -------------- -------------- \n"
a1: .asciiz "| "
a2: .asciiz " | "
b1: .asciiz "[[ "
b2: .asciiz "]] "
promt: .asciiz "Nhap chuoi ki tu : "
error: .asciiz "\ndo dai xau phai la boi cua 8"
error2:.asciiz "\nXau khong duoc rong"
digit_to_hex: .byte '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
.align 2
buffer: .space 5000
buff: .word 0
x: .byte 0
.text
la $a0, promt
li $v0,4
syscall
la $a0, buffer
li $a1, 4000
li $v0 ,8
syscall
la $s0, buffer
count:
lb $t0, 0($s0) #bien dem s0 =* buffer[i]; t0 = buffer[i]
beq $t0, $zero, end_count # if t0=0 end count loop
addi $s0,$s0,1 #increase s0++
j count
end_count:
sub $s0, $s0, $a0 #string length
addi $s0,$s0,-1 #minus "enter" character
srl $t0, $s0, 3 # divide by 8, t0 is amount of 2 block
andi $s0, $s0, 7 # kiem tra la boi cua 8 hay khong
bne $s0, $zero, print_err # neu khong thi bao loi
beq $t0, $zero, print_err2 # neu do dai = 0 cung bao loi
la $a0, start
li $v0,4
syscall #in
jal print_ # lai in
move $a0,$0
loop:
jal print_line #goi ham print_line voi tham so a0, a0 la block hien tai
addi $a0,$a0,1
bne $a0,$t0,loop
jal print_
j end
print_line: # @param $a0
addiu $sp,$sp,-8
sw $ra, 4($sp)
sw $a0, 8($sp) # push a0, ra
rem $t9,$a0,3
sll $t1, $a0, 3
la $t2,buffer
add $t2,$t2,$t1
lw $t3, 0($t2)
lw $t4, 4($t2)
xor $t5,$t3,$t4
beqz $t9,type0
beq $t9, 1, type1
j type2
type0:
move $a1,$t3
jal print_block #goi ham print_block voi tham so a1
move $a1,$t4
jal print_block
jal print_xor
j end_switch
type1:
move $a1,$t3
jal print_block
jal print_xor
move $a1,$t4
jal print_block
j end_switch
type2:
jal print_xor
move $a1,$t3
jal print_block
move $a1,$t3
jal print_block
end_switch:
li $a0,'\n'
li $v0,11
syscall
lw $a0, 8($sp)
lw $ra, 4($sp)
addiu $sp,$sp,8 #pop ra,a0
jr $ra
print_block: # @param $a1
la $a0, a1
li $v0,4
syscall
la $a0, buff
sw $a1, 0($a0)
li $v0,4
syscall
la $a0, a2
li $v0,4
syscall
jr $ra
print_xor:
la $a0, b1
li $v0,4
syscall
la $s1,digit_to_hex
srl $s0, $t5, 4
and $s0,$s0,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
and $s0,$t5,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
li $a0,','
li $v0,11
syscall
srl $s0, $t5, 12
and $s0,$s0,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
srl $s0, $t5, 8
and $s0,$s0,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
li $a0,','
li $v0,11
syscall
srl $s0, $t5, 20
and $s0,$s0,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
srl $s0, $t5, 16
and $s0,$s0,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
li $a0,','
li $v0,11
syscall
srl $s0, $t5, 28
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
srl $s0, $t5, 24
and $s0,$s0,0xf
add $s2,$s1,$s0
lb $a0,0($s2)
li $v0,11
syscall
la $a0, b2
li $v0,4
syscall
jr $ra
print_:
la $a0, string
li $v0,4
syscall
jr $ra
print_err:
la $a0,error
li $v0,4
syscall #print Error message
j end
print_err2:
la $a0,error2
li $v0,4
syscall #print Error message
end:
li $v0,10
syscall