-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlab4_2_1.asm
410 lines (372 loc) · 5.68 KB
/
lab4_2_1.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
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
SAVE_STATE MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
ENDM
LOAD_STATE MACRO
POP DX
POP CX
POP BX
POP AX
ENDM
PUTCHAR MACRO CHAR
PUSH AX
MOV AL, CHAR
INT 29H
POP AX
ENDM
PUTSTR MACRO STR
PUSH AX
PUSH DX
MOV AH, 09H
LEA DX, STR
INT 21H
POP DX
POP AX
ENDM
PUTENDL MACRO
PUTCHAR 0DH
PUTCHAR 0AH
ENDM
GETCHAR MACRO
PUSH AX
MOV AH, 08H
INT 21H
POP AX
ENDM
GETSTR MACRO BUFF
PUSH AX
PUSH DX
LEA DX, BUFF
MOV AH, 0AH
INT 21H
PUTENDL
POP DX
POP AX
ENDM
GETLEN MACRO N, M
PUSH AX
PUSH BX
XOR AX, AX
XOR BX, BX
MOV AX, N
MOV BX, M
MUL BX
MOV ARR_LEN, AL
POP BX
POP AX
ENDM
STSEG SEGMENT PARA STACK "STACK"
DB 64 DUP ("STACK")
STSEG ENDS
DSEG SEGMENT PARA PUBLIC "DATA"
INPUT_MSG DB "Enter number:$"
ERR_INV_MSG DB "Number is invalid.$"
ERR_OF_MSG DB "Number is too big.$"
FIRST_ROW_MSG DB "Enter row #1.$"
NEW_ROW_MSG DB "Enter row #$"
EL_PROMPT DB "Enter element: $"
N_PROMPT DB "Enter the number of rows of the array:$"
M_PROMPT DB "Enter the number of columns of the array:$"
SEARCH_PROMPT DB "Enter number to search in a 2D array: $"
QUANT_ERR_N_MSG DB "There must be 2 or more element, but less than 256.$"
QUANT_ERR_M_MSG DB "You've either entered less than 1 (array can't have 0 or less elements) or number of elements has exceeded 255.$"
YOUR_2D_ARR_MSG DB "Your 2D array:$"
COORDS_MSG DB "Coordinates:$"
NOT_FOUND_MSG DB "Element was not found.$"
BUFF DB 7, ?, 7 DUP ('?')
IS_NEG DB 0
IS_ERR DB 0
IS_FOUND DB 0
NUM DW 0
ARR_LEN DB 0
N DW 0
M DW 0
NUM_TO_SEARCH DW 0
ARRAY DW 255 DUP(0)
DSEG ENDS
CSEG SEGMENT PARA PUBLIC "CODE"
ASSUME CS: CSEG, DS: DSEG, SS: STSEG
ATOI PROC NEAR
SAVE_STATE
LEA DI, BUFF + 2
MOV CL, [DI]
CMP CL, '-'
JE ATOI_NEG
CMP CL, '+'
JE ATOI_POS
ATOI_INIT:
XOR BX, BX
MOV BX, 10
XOR AX, AX
ATOI_LOOP:
XOR CX, CX
MOV CL, [DI]
CMP CL, 0DH
JE ATOI_END
CMP CL, 30H
JB ATOI_ERR_INV
CMP CL, 39H
JA ATOI_ERR_INV
SUB CL, 30H
MUL BX
JC ATOI_ERR_OF
ADD AX, CX
JC ATOI_ERR_OF
INC DI
JMP ATOI_LOOP
ATOI_NEG:
PUSH AX
MOV AL, 1
MOV IS_NEG, AL
POP AX
INC DI
JMP ATOI_INIT
ATOI_POS:
PUSH AX
MOV AL, 0
MOV IS_NEG, AL
POP AX
INC DI
JMP ATOI_INIT
ATOI_ERR_INV:
MOV AL, 1
MOV IS_ERR, AL
PUTSTR ERR_INV_MSG
PUTENDL
JMP ATOI_QUIT
ATOI_ERR_OF:
MOV AL, 1
MOV IS_ERR, AL
PUTSTR ERR_OF_MSG
PUTENDL
JMP ATOI_QUIT
ATOI_END:
CMP AX, 32768
JA ATOI_ERR_OF
MOV CL, IS_NEG
CMP CL, 1
JNZ ATOI_QUIT
NEG AX
ATOI_QUIT:
MOV NUM, AX
LOAD_STATE
RET
ATOI ENDP
ITOA PROC NEAR
SAVE_STATE
MOV BX, NUM
OR BX, BX
JNS ITOA_POS
PUTCHAR '-'
NEG BX
ITOA_POS:
MOV AX, BX
XOR CX, CX
MOV BX, 10
ITOA_PARSE_LOOP:
XOR DX, DX
DIV BX
ADD DL, '0'
PUSH DX
INC CX
TEST AX, AX
JNZ ITOA_PARSE_LOOP
ITOA_END_LOOP:
POP AX
INT 29H
LOOP ITOA_END_LOOP
LOAD_STATE
RET
ITOA ENDP
INIT_2D_ARR PROC NEAR
SAVE_STATE
MOV SI, OFFSET ARRAY
XOR AX, AX
XOR CX, CX
XOR BX, BX
MOV CL, ARR_LEN
MOV BX, M
INIT_LOOP:
PUSH AX
DIV BL
CMP AH, 0
JNE INIT_OLD_ROW
PUTSTR NEW_ROW_MSG
XOR DX, DX
MOV DL, AL
; èíêðåìåíòèðóþ ðåçóëüòàò äåëåíèÿ íà êîë-âî ñòîëáöîâ (òî åñòü, ïåðâûé èíäåêñ ìàññèâà)
INC DL
MOV NUM, DX
CALL ITOA
PUTCHAR '.'
PUTENDL
INIT_OLD_ROW:
PUTSTR EL_PROMPT
GETSTR BUFF
CALL ATOI
CMP IS_ERR, 1
JE INIT_END
XOR AX, AX
MOV AX, NUM
MOV [SI], AX
ADD SI, 2
POP AX
INC AX
LOOP INIT_LOOP
INIT_END:
LOAD_STATE
RET
INIT_2D_ARR ENDP
PRINT_2D_ARR PROC NEAR
SAVE_STATE
MOV SI, OFFSET ARRAY
XOR CX, CX
MOV CL, ARR_LEN
XOR DX, DX
MOV DX, M
XOR AX, AX
INC AX
PRINT_2D_LOOP:
MOV BX, [SI]
MOV NUM, BX
CALL ITOA
PUTCHAR ' '
PUSH AX
DIV DL
CMP AH, 0
JNE PRINT_CONTINUE
PUTENDL
PRINT_CONTINUE:
ADD SI, 2
POP AX
INC AX
LOOP PRINT_2D_LOOP
LOAD_STATE
RET
PRINT_2D_ARR ENDP
FIND_COORDS PROC NEAR
SAVE_STATE
MOV SI, OFFSET ARRAY
MOV BX, M
XOR CX, CX
MOV CL, ARR_LEN
XOR AX, AX
XOR DX, DX
MOV DX, NUM_TO_SEARCH
FIND_LOOP:
CMP [SI], DX
JNE FIND_CONTINUE
PUSH AX
XOR Ax, AX
MOV AL, 1
MOV IS_FOUND, AL
XOR Ax, AX
POP AX
PUSH AX
DIV BL
PUTCHAR '('
PUSH DX
XOR DX, DX
MOV DL, AL
; èíêðåìåíòèðóþ ðåçóëüòàò äåëåíèÿ íà êîë-âî ñòîëáöîâ (òî åñòü, ïåðâûé èíäåêñ ìàññèâà)
INC DL
MOV NUM, DX
CALL ITOA
PUTCHAR ';'
XOR DX, DX
MOV DL, AH
; èíêðåìåíòèðóþ îñòàòîê îò äåëåíèÿ íà êîë-âî ñòîëáöîâ (òî åñòü, âòîðîé èíäåêñ ìàññèâà)
INC DL
MOV NUM, DX
CALL ITOA
PUTCHAR ')'
PUTENDL
XOR DX, DX
POP DX
XOR AX, AX
POP AX
FIND_CONTINUE:
ADD SI, 2
INC AX
LOOP FIND_LOOP
CMP IS_FOUND, 0
JNE FIND_END
PUTSTR NOT_FOUND_MSG
FIND_END:
LOAD_STATE
RET
FIND_COORDS ENDP
MAIN PROC FAR
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX
PUTSTR N_PROMPT
PUTENDL
GETSTR BUFF
CALL ATOI
CMP IS_ERR, 1
JNE CHECK_N
JMP MAIN_END
CHECK_N:
CMP NUM, 1
JLE QUANT_ERR_N
CMP NUM, 255
JLE CONTINUE_INIT
QUANT_ERR_N:
PUTSTR QUANT_ERR_N_MSG
JMP MAIN_END
CONTINUE_INIT:
XOR AX, AX
MOV AX, NUM
MOV N, AX
PUTSTR M_PROMPT
PUTENDL
GETSTR BUFF
CALL ATOI
CMP IS_ERR, 1
JNE CHECK_M
JMP MAIN_END
CHECK_M:
CMP NUM, 1
JL QUANT_ERR_M
XOR AX, AX
XOR BX, BX
MOV AX, N
MOV BX, NUM
MUL BX
CMP AX, 255
JLE CONTINUE
QUANT_ERR_M:
PUTSTR QUANT_ERR_M_MSG
JMP MAIN_END
CONTINUE:
XOR AX, AX
MOV AX, NUM
MOV M, AX
GETLEN N, M
CALL INIT_2D_ARR
PUTSTR YOUR_2D_ARR_MSG
PUTENDL
CALL PRINT_2D_ARR
PUTSTR SEARCH_PROMPT
PUTENDL
GETSTR BUFF
CALL ATOI
CMP IS_ERR, 1
JE MAIN_END
XOR AX, AX
MOV AX, NUM
MOV NUM_TO_SEARCH, AX
PUTSTR COORDS_MSG
PUTENDL
CALL FIND_COORDS
MAIN_END:
GETCHAR
RET
MAIN ENDP
CSEG ENDS
END MAIN