-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSorting.asm
More file actions
465 lines (378 loc) · 12.2 KB
/
Copy pathSorting.asm
File metadata and controls
465 lines (378 loc) · 12.2 KB
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
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
JMP START
ENTER_NUMBER_OF_ELEMENTS_MSG DB "Please enter the number of elements in the array to be sorted or press 0 to terminate: $"
SUITABLE_NUMBER_MSG DB "Please Enter a suitable number in range [1-25]: $"
ENTER_ELEMENTS_MSG DB 10, 13, "Please enter elements of the array to be sorted: $"
SROTING_TYPE_MSG DB 10, 13, "Enter a for ascending order or d for descending order: $"
SORTED_MSG DB 10, 13, "The sorted array is: $"
WORD_LENGTH_EXCEEDED_MSG DB 10, 13, "ERROR: Exceed the size of 'WORD' please re-enter $"
ARRAY_LENGTH DB ?
ARRAY_INFO DB 3,?,3 dup(' ')
INPUT_HANDLER DB 6,?,5 dup ('0')
ELEMENTS DW 50 dup(?)
START:
; DISPLAY ENTER_NUMBER_OF_ELEMENTS_MSG MESASAGEE
LEA DX, ENTER_NUMBER_OF_ELEMENTS_MSG
MOV AH , 09h
INT 21H
JMP GET_ARRAY_LENGHT
START_WITH_RANGE_INFO:
MOV AH,2
MOV dl ,10
INT 21H ;Printing a new line
MOV dl,13
INT 21H
MOV AL, 2h
INT 10h
LEA dx, SUITABLE_NUMBER_MSG ; Display Out Of Range message
MOV AH, 09h
INT 21H
; Start the program process by asking for the number of elements to be sorted
GET_ARRAY_LENGHT:
LEA DX, ARRAY_INFO
MOV AH, 0AH
INT 21H
MOV BL, ARRAY_INFO[1] ;storing the size of the input for range checking
CMP BL, 1 ;Check if the input is ONE or TWO Digits length
JA TWO_DIGITS_ARRAY_LENGTH
JE ONE_DIGITS_ARRAY_LENGTH
ONE_DIGITS_ARRAY_LENGTH:
MOV AL, ARRAY_INFO[2]
SUB AL, 48
JMP GUARD_AGAINEST_WRONG_NUMBER
TWO_DIGITS_ARRAY_LENGTH:
MOV AL, 10 ; We made the AL value eq. 10 as the first input is in the 10th place
MOV AH, ARRAY_INFO[2] ;store the first digit in AH
SUB AH, 48
MUL AH
MOV BL, ARRAY_INFO[3]
SUB BL, 48
ADD AL, BL ; Add the number in 10th decimal place with the number in the 1st decimal place to get the user input
GUARD_AGAINEST_WRONG_NUMBER:
CMP AL, 0 ;ChecK if the user pressed 0 to terminate the progrem
JE END
CMP AL ,25 ;Check if the user entered a number out of range of [0-25]
JA WRONG_ARRAY_LENGTH
; STORE ARRAY LENGTH TO CX AS A COUNTER
MOV ARRAY_LENGTH, AL
MOV CX, 0
MOV CL, ARRAY_LENGTH
; Start Accepting the array elements
ACCEPT_ARRAY_ELEMENTS:
LEA DX, ENTER_ELEMENTS_MSG ; Display "Enter elements..." Message
MOV AH , 09h
INT 21H
;Counter Acts as array index
MOV SI, 0
;Start Storing the entered elements
STORE_USER_INPUT:
CALL NEW_LINE
;Check if all elements are stored in the array
CMP CX, 0
JE SORT
;Accept New Element
LEA DX, INPUT_HANDLER
MOV AH, 0AH
INT 21H
MOV BL, INPUT_HANDLER[1]
CMP Bl, 1 ;checking if it is one digit or not
JA SEVERAL_DIGITS_ENTERED
JE ONE_DIGIT_ENTERED
ONE_DIGIT_ENTERED:
MOV AL, INPUT_HANDLER[2] ;if it is only one digit
SUB AL, 48 ;convert from ascci to digit
SEVERAL_DIGITS_ENTERED:
PUSH CX
MOV CX, 0
;Check the length of entered digit
CMP INPUT_HANDLER[1], 5
JE FIVE_DIGITS
CMP INPUT_HANDLER[1], 4
JE FOUR_DIGITS
CMP INPUT_HANDLER[1], 3
JE THREE_DIGITS
CMP INPUT_HANDLER[1], 2
JE TWO_DIGITS
CMP INPUT_HANDLER[1], 1
JE ONE_DIGIT
FIVE_DIGITS:
MOV AH, 0
MOV AL, INPUT_HANDLER[2]
CMP AL, 36h
JA WORD_LENGTH_EXCEEDED
SUB AX, 30h
MOV BX, 10000
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[3]
CMP AL, 35h
JA WORD_LENGTH_EXCEEDED
SUB AX, 30h
MOV BX, 1000
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[4]
CMP AL, 35h
JA WORD_LENGTH_EXCEEDED
SUB AX, 30h
MOV BX, 100
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[5]
CMP AL, 33h
JA WORD_LENGTH_EXCEEDED
SUB AX, 30h
MOV BX, 10
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[6]
CMP AL, 35h
JA WORD_LENGTH_EXCEEDED
SUB AX, 30h
MOV BX, 1
MOV DX, 0
MUL BX
ADD CX, AX
JMP STORE_NUMBER_TO_ELEMENTS_ARRAY
WORD_LENGTH_EXCEEDED:
LEA DX, WORD_LENGTH_EXCEEDED_MSG
MOV AH, 09H
INT 21H
POP CX
JMP STORE_USER_INPUT
FOUR_DIGITS:
MOV AH, 0
MOV AL, INPUT_HANDLER[2]
SUB AX, 30h
MOV BX, 1000
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[3]
SUB AX, 30h
MOV BX, 100
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[4]
SUB AX, 30h
MOV BX, 10
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[5]
SUB AX, 30h
MOV BX, 1
MOV DX, 0
MUL BX
ADD CX, AX
JMP STORE_NUMBER_TO_ELEMENTS_ARRAY
THREE_DIGITS:
MOV AH, 0
MOV AL, INPUT_HANDLER[2]
SUB AX, 30h
MOV BX, 100
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[3]
SUB AX, 30h
MOV BX, 10
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[4]
SUB AX, 30h
MOV BX, 1
MOV DX, 0
MUL BX
ADD CX, AX
JMP STORE_NUMBER_TO_ELEMENTS_ARRAY
TWO_DIGITS:
MOV AH, 0
MOV AL, INPUT_HANDLER[2]
SUB AX, 30h
MOV BX, 10
MOV DX, 0
MUL BX
ADD CX, AX
MOV AH, 0
MOV AL, INPUT_HANDLER[3]
SUB AX, 30h
MOV BX, 1
MOV DX, 0
MUL BX
ADD CX, AX
JMP STORE_NUMBER_TO_ELEMENTS_ARRAY
ONE_DIGIT:
MOV AH, 0
MOV AL, INPUT_HANDLER[2]
SUB AX, 30h
MOV BX, 1
MOV DX, 0
MUL BX
ADD CX, AX
JMP STORE_NUMBER_TO_ELEMENTS_ARRAY
; Storing the number entered by user to the ELEMENTS array
STORE_NUMBER_TO_ELEMENTS_ARRAY:
MOV ELEMENTS[SI], CX
MOV BX, 0
MOV DX, 0
POP CX
DEC CX
ADD SI, 2
JMP STORE_USER_INPUT
;START SORTING
SORT:
MOV CX, 0
MOV CL, ARRAY_LENGTH
DEC CX
MOV SI, 00
; Ask USER for the type of sorting ASC/DESC
ASK_FOR_SORTING_TYPE:
LEA DX, SROTING_TYPE_MSG
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
CMP Al, 'a'
JE SORT_ASC
CMP Al, 'd'
JE SORT_DESC
;Bubble sorting ASC/DESC algirthms
SORT_ASC:
MOV DX, CX
COMPARE_ASC:
CMP DX, 0
JE CYCLE_ASC
MOV AX, ELEMENTS[SI]
MOV BX, ELEMENTS[SI + 2]
CMP AX, BX
JG SWAP_ASC
ADD SI, 2
DEC DX
JMP COMPARE_ASC
SWAP_ASC:
MOV ELEMENTS[SI + 2], AX
MOV ELEMENTS[SI], BX
ADD SI, 2
DEC DX
JMP COMPARE_ASC
CYCLE_ASC:
MOV SI, 0
SUB CX, 1
CMP CX, 0
JNZ SORT_ASC
JMP ARRAY_SORTED
SORT_DESC:
MOV DX, CX
COMPARE_DESC:
CMP DX, 0
JE CYCLE_DESC
MOV AX, ELEMENTS[SI]
MOV BX, ELEMENTS[SI + 2]
CMP AX, BX
JS SWAP_DESC
ADD SI, 2
DEC DX
JMP COMPARE_DESC
SWAP_DESC:
MOV ELEMENTS[SI + 2], AX
MOV ELEMENTS[SI], BX
ADD SI, 2
DEC DX
JMP COMPARE_DESC
CYCLE_DESC:
MOV SI, 0
SUB CX, 1
CMP CX, 0
JNZ SORT_DESC
JMP ARRAY_SORTED
ARRAY_SORTED:
LEA dx, SORTED_MSG
MOV AH, 09H
INT 21H
MOV SI, 0
MOV BX, 0
MOV DX, 0
; Start printing the sorted array
PRINT_SORTED_ARRAY:
CMP ARRAY_LENGTH, 0
JE TASK_FINISHED
MOV AX, 0
MOV AX, ELEMENTS[SI]
CMP AX, 9
JA PRINIT_MULTI_DIGIT
JMP PRINT_ONE_DIGIT
PRINT_ONE_DIGIT:
MOV DX, ELEMENTS[SI]
ADD DX, 48
MOV AH, 02H
INT 21H
MOV Dl, 44
INT 21H
JMP HANDLE_NEXT_ELEMENT
MOV AX, ELEMENTS[SI]
PRINIT_MULTI_DIGIT:
PUSH CX
MOV BX, 10
MOV CX,0
NEXT:
MOV DX, 0
DIV BX ; AX = AX / BX --> Reminder is stored in DX
ADD DL,48
PUSH DX ;pushing the reminder digits to the stack to use in the next digit printing
INC CX
CMP AX, 0 ; Start printing the element
JE PRINT_SEPARATED_DIGIT
JMP NEXT
PRINT_SEPARATED_DIGIT:
POP DX
MOV AH, 02H ;Pop digits from CX and Print it
INT 21H
LOOP PRINT_SEPARATED_DIGIT
POP CX ;POP the old value of CX which is the array loop counter
JMP PRINT_COMMA
; Prinit ',' between DIGITS
PRINT_COMMA:
MOV Dl, 44
INT 21H
HANDLE_NEXT_ELEMENT:
DEC ARRAY_LENGTH
ADD SI, 2
JMP PRINT_SORTED_ARRAY
TASK_FINISHED:
CALL NEW_LINE
JMP START_AGAIN
WRONG_ARRAY_LENGTH:
MOV AH, 0
MOV AL, 02H
INT 10H
LEA DX, SUITABLE_NUMBER_MSG ;prINTing the warning message
MOV AH , 09h
INT 21H
JMP GET_ARRAY_LENGHT
PROC NEW_LINE
MOV AH, 2
MOV DL, 10
INT 21H
MOV DL, 13
INT 21H
ret
ENDP NEW_LINE
START_AGAIN:
JMP START
END:
HLT