-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathn09_NguyenPhucAnh.asm
248 lines (214 loc) · 7.4 KB
/
n09_NguyenPhucAnh.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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
.data
String1: .asciiz " ************* \n"
String2: .asciiz "************** *3333333333333* \n"
String3: .asciiz "*222222222222222* *33333******** \n"
String4: .asciiz "*22222******222222* *33333* \n"
String5: .asciiz "*22222* *22222* *33333******** \n"
String6: .asciiz "*22222* *22222* ************* *3333333333333* \n"
String7: .asciiz "*22222* *22222* **11111*****111* *33333******** \n"
String8: .asciiz "*22222* *22222* **1111** ** *33333* \n"
String9: .asciiz "*22222* *222222* *1111* *33333******** \n"
String10: .asciiz "*22222*******222222* *11111* *3333333333333* \n"
String11: .asciiz "*2222222222222222* *11111* ************* \n"
String12: .asciiz "*************** *11111* \n"
String13: .asciiz " --- *1111** \n"
String14: .asciiz " / o o \\ *1111**** ***** \n"
String15: .asciiz " \\ > / **111111***111* \n"
String16: .asciiz " ----- *********** \n"
String17: .asciiz "dce.hust.edu.vn \n"
Message0: .asciiz "------------PROGRAMMING-----------\n"
Request1: .asciiz "1. In ra hinh anh\n"
Request2: .asciiz "2. In ra chu khong mau\n"
Request3: .asciiz "3. Hoan doi vi tri chu\n"
Request4: .asciiz "4. Doi mau chu\n"
Thoat: .asciiz "5. Thoat\n"
Choose: .asciiz "Choose your option: "
Warning: .asciiz "Khong co option nay, hay chon lai\n"
ChuD: .asciiz "Nhap mau cho chu D(0->9): "
ChuC: .asciiz "Nhap mau cho chu C(0->9): "
ChuE: .asciiz "Nhap mau cho chu E(0->9): "
.text
li $t5 50 #t5 mau chu hien tai cua chu D ( Ma ASCII 50 ~ 2)
li $t6 49 #t6 mau chu hien tai cua chu C ( Ma ASCII 49 ~ 1)
li $t7 51 #t7 mau chu hien tai cua chu E ( Ma ASCII 51 ~ 3)
main:
la $a0, Message0
li $v0, 4
syscall
la $a0, Request1
li $v0, 4
syscall
la $a0, Request2
li $v0, 4
syscall
la $a0, Request3
li $v0, 4
syscall
la $a0, Request4
li $v0, 4
syscall
la $a0, Thoat
li $v0, 4
syscall
la $a0, Choose
li $v0, 4
syscall
li $v0, 5 #Choose option
syscall
Case1menu:
addi $v1 $0 1
bne $v0 $v1 Case2menu
j Menu1
Case2menu:
addi $v1 $0 2
bne $v0 $v1 Case3menu
j Menu2
Case3menu:
addi $v1 $0 3
bne $v0 $v1 Case4menu
j Menu3
Case4menu:
addi $v1 $0 4
bne $v0 $v1 Case5menu
j Menu4
Case5menu:
addi $v1 $0 5
bne $v0 $v1 defaultmenu
j Exit
defaultmenu:
la $a0, Warning
li $v0, 4
syscall
j main
#In chữ ra màn hình
Menu1:
addi $t0, $0, 0 #t0 = 0; biến đếm hàng
addi $t1, $0, 17 #t1= 17
la $a0,String1
Loop: beq $t1, $t0, main # if (t1=t0) -> main
li $v0, 4
syscall
addi $a0, $a0, 68 # a0 = a0 + 68 (Các string chứa tối đa 68 ký tự -> string tiếp theo)
addi $t0, $t0, 1 # t0 = t0 + 1
j Loop
#Bỏ màu của các chữ , chỉ giữ lại viền
Menu2: addi $s0, $0, 0 # s0=0 ; biến đếm hàng
addi $s1, $0, 17 # s1 = 17
la $s2,String1 #$s2 là địa chỉ của String1
Lap: beq $s1, $s0, main # if (s1 = s0 ) --> main
addi $t0, $0, 0 # $t0 = 0 ; đếm ký tự của hàng
addi $t1, $0, 68 # $t1 = 68 ; (Số ký tự tối đa của 1 hàng )
In1hang:
beq $t1, $t0, End # If (t1 = t0) --> jump End
lb $t2, 0($s2) # load byte giá trị của phần tử trong s2 vào $t2 ;
bgt $t2, 47, Label # Nếu lớn hơn -1 thì nhảy đến Lonhon0 ( 47 ~ -1 )
j Tmp
Label:
bgt $t2, 57, Tmp # Nếu lớn hơn 9 thì giữ nguyên ( 57 ~ 9 ) -> jump Tmp -> In ra ký tự
addi $t2 $0 0x20 # $t2 = 0x20 -> thay đổi $t2 thành dấu cách
j Tmp
Tmp: li $v0, 11 # In từng ký tự
addi $a0 $t2 0 #a0 = $t2 ;
syscall
addi $s2 $s2 1 # $s2 = $s2 + 1 -> sang ký tự tiếp theo
addi $t0, $t0, 1 # $t0 = $t0 +1 ; ( $t0 : biến đếm ký tự )
j In1hang
End: addi $s0 $s0 1 # $s0 = $s0+1 ; Tăng biến đếm hàng lên 1
j Lap
#Hoán đổi vị trí DCE - > ECD
Menu3: addi $s0, $0, 0 # s0=0 ; biến đếm hàng
addi $s1, $0, 17 # s1 = 17
la $s2,String1 #$s2 là địa chỉ của String1
Lap2: beq $s1, $s0, main #if ($s1 = $s0) --> main
#Chia string ban đầu thành 3 string nhỏ
sb $0 21($s2) # Danh dau ki tu nay la null => ket thuc xau
sb $0 43($s2)
sb $0 65($s2)
#Đổi vị trí
li $v0, 4
la $a0 44($s2) #In chữ E
syscall
li $v0, 4
la $a0 22($s2) #In chữ C
syscall
li $v0, 4
la $a0 0($s2) #In chữ D
syscall
li $v0, 4
la $a0 66($s2) #In ký tự "\n"
syscall
#Ghép lại thành String ban đầu
addi $t1 $0 0x20 # $t1 = 0x20 -> thay đổi $t1 thành dấu cách
sb $t1 21($s2)
sb $t1 43($s2)
sb $t1 65($s2)
addi $s0 $s0 1
addi $s2 $s2 68
j Lap2
#Đổi màu chữ
Menu4:
NhapmauD: li $v0, 4
la $a0, ChuD
syscall
li $v0, 5 # Lấy màu của ký tự D
syscall
blt $v0,0, NhapmauD # if (integer_input < 0 ) --> NhapmauD
bgt $v0,9, NhapmauD # if (integer_input > 9 ) --> NhapmauD
addi $s3 $v0 48 #$s3 = integer_input,Lưu màu chữ D (Mã ASCII của 0 ~ 48)
NhapmauC: li $v0, 4
la $a0, ChuC
syscall
li $v0, 5 #Lấy màu của ký tự C
syscall
blt $v0, 0, NhapmauC
bgt $v0, 9, NhapmauC
addi $s4 $v0 48 #$s4 Lưu màu của chữ C
NhapmauE: li $v0, 4
la $a0, ChuE
syscall
li $v0, 5 #Lấy màu của ký tự E
syscall
blt $v0, 0, NhapmauE
bgt $v0, 9, NhapmauE
addi $s5 $v0 48 #$s5 Lưu màu của chữ E
addi $s0, $0, 0 # s0 = 0 ; biến đếm hàng
addi $s1, $0, 17 # s1 = 17 ;
la $s2,String1 # $s2 là địa chỉ của String1
li $a1 48 #giá trị của số 0
li $a2 57 #giá trị của số 9
Lapdoimau: beq $s1, $s0, updatemau #if (s1 = s0) -> jump updatemau
addi $t0, $0, 0 # $t0 = 0 ; đếm ký tự của hàng
addi $t1, $0, 68 # $t1 = 68 ; (Số ký tự tối đa của 1 hàng )
In1hangdoimau:
beq $t1, $t0, Enddoimau
lb $t2, 0($s2) # load byte giá trị của phần tử trong s2 vào $t2 ;
CheckD: bgt $t0, 21, CheckC #if (t0>21) -> checkC ;Kiểm tra hết chữ D chưa
beq $t2, $t5, fixD #if (t2 = t5) -> jump fixD
j Tmpdoimau
CheckC: bgt $t0, 43, CheckE #Kiểm tra hết chữ C chưa
beq $t2, $t6, fixC
j Tmpdoimau
CheckE: beq $t2, $t7, fixE
j Tmpdoimau
fixD: sb $s3 0($s2)
j Tmpdoimau
fixC: sb $s4 0($s2)
j Tmpdoimau
fixE: sb $s5 0($s2)
j Tmpdoimau
Tmpdoimau:
addi $s2 $s2 1 #Sang ký tự tiếp theo
addi $t0, $t0, 1 # t0 = t0 + 1 ; --> sang ký tự tiếp theo
j In1hangdoimau
Enddoimau:
li $v0, 4
addi $a0 $s2 -68 #Trở về đầu hàng sau khi đổi màu
syscall
addi $s0 $s0 1 # s0 = s0 + 1 ; -> tăng biến đếm hàng lên 1
j Lapdoimau
updatemau:
move $t5 $s3 #gan gia tri s3 vao t5
move $t6 $s4 #gan gia tri s4 vao t6
move $t7 $s5 #gan gia tri s5 vao t7
j main
Exit: