-
Notifications
You must be signed in to change notification settings - Fork 0
/
operations-on-numbers.asm
603 lines (424 loc) · 7.96 KB
/
operations-on-numbers.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
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
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
.model small
;MINA
.data ;define variables
;Numbers msg
enterMsg db 10,13,10,13,"Enter 6 numbers <between 0 and 9> ",10,13,"then perform some arithmetic operations on them ",10h,10,13,'$'
num db 10,13,"Enter the number $"
n db '1','2','3','4','5','6','$'
space db 3Ah,09h,'$'
tyMsg db 10,13,10,13,"thank you for entering all numbers ",03h,10,13,'$'
finishMsg db 10,13,10,13,"thank you for use my project ",03h,10,13,'$'
;Options msg
selectMsg db 10,13,10,13,"Please select the operation you need",10,13,"<v,x,n,,d,a,e,s,l,q,r or ? for help> ",10h,'$'
optionsMsg db 10,13,
db "v: for average",10,13,
db "x: for max",10,13,
db "n: for min",10,13,
db "e: for standard deviation",10,13,
db "a: to show numbers in ascending order",10,13,
db "d: to show numbers in descending order",10,13,
db "s: summation of all numbers",10,13,
db "l: for all the above",10,13,
db "q: to quit",10,13,
db "r: to enter 6 new numbers",10,13
db "?: for help",10,13,'$'
;Error msg
errorChar db 10,13,10,13,"Unrecognized character",10,13,'$'
errorNum db 10,13,10,13 ,"The character you entered is not in the range from 0 to 9",10,13,'$'
;Operations msg
sumMsg db 10,13,"The sum of all numbers is :$"
avgMsg db 10,13,"The average is : $"
maxMsg db 10,13,"the max number is : $"
minMsg db 10,13,"The min number is : $"
sdMsg db 10,13,"the standard deviation is : $"
ascMsg db 10,13,"Numbers in ascending order : $"
desMsg db 10,13,"Number in descending order : $"
allMsg db 's','v','x','n','e','a','d'
;variables
nums db 6 DUP <0>
asc db 6 DUP <0>
des db 6 DUP <0>
nums db 0, 0, 0, 0, 0, 0
asc db 0, 0, 0, 0, 0, 0
des db 0, 0, 0, 0, 0, 0
;Selection register
compareReg db ? ;for compare between the operations
input db ? ;for read from user
result db ? ;for save the result of mul or div or square
flag db ? ;its value <0:false,1:true>
;registers for the square root
reg db ?
regShift db ?
save db ?
.code ;the executable part of the program
;MINA
printC macro character
pusha
pushf
mov dl, character
mov ah, 2h
int 21h
popf
popa
printC endm
;MINA
printM macro string
pusha
pushf
lea dx, string
mov ah, 09h
int 21h
popf
popa
printM endm
;Youssef(multiple function)
; result = n1*n2
mulO macro n1,n2
pusha
pushf
mov ax,0;
mov al,n1
mul n2 ; the value is stored in AX register
mov result,al
popf
popa
mulO endm
;arsani
;result = n1 / n2
divO macro n1, n2 ; n1,n2 values passed
pusha
pushf ; save current status
mov ax,0 ; initialize ax = 0 (ah = 0, al = 0)
mov al, n1 ; move n1 to al
div n2 ; divide n1 / al(n2) and save in al
mov result, al ; move result from al to 'result' variable
popf
popa ; load latest status
divO endm
;YOUSSEF
main proc
mov ax,data
mov ds,ax
repeat:
printM enterMsg
mov cx,6
mov di,0
readLoop:
printM num
printC n[di]
printM space
call read ;input
call checkN ;0--9
cmp flag,0
je cont
printM errorNum
jmp readLoop
cont:
mov dl,input
mov nums[di],dl
inc di
loop readLoop
printM tyMsg
call avgOperation
call sort
mov cx,1
selectLoops:
printM selectMsg
call read
call checkC
cmp flag,0
je continue
printM errorChar
jmp selectLoops
continue:
call selectOperation
inc cx
loop SelectLoopss
main endp
jmp toEnd
;ARSANI
read proc
pusha
pushf ; to save current status
mov ah,1h
int 21h ; ask user to enter a number
mov input, al ; move the entered number from al to 'input' variable
popf
popa ; reload latest status
ret
read endp
;MARK
checkN proc
pusha
pushf
mov flag, 0
cmp input, '0'
jb errorVar
cmp input, '9'
ja errorVar
jmp endCheckN
errorVar:
mov flag, 1
endCheckN:
popf
popa
ret
checkN endp
;MARK
checkC proc
pusha
pushf
mov flag,0
cmp input,'v'
je endCheckC
cmp input,'x'
je endCheckC
cmp input,'n'
je endCheckC
cmp input,'d'
je endCheckC
cmp input,'a'
je endCheckC
cmp input,'e'
je endCheckC
cmp input,'s'
je endCheckC
cmp input,'l'
je endCheckC
cmp input,'q'
je endCheckC
cmp input,'r'
je endCheckC
cmp input,'?'
je endCheckC
errorExist:
mov flag,1
endCheckC:
popf
popa
ret
checkC endp
;CLARA
clear proc
mov ax, 0
mov bx, 0
mov dx, 0
mov cx, 0
mov si, 0
mov di, 0
mov flag, 0
ret
clear endp
;ARSANI
SelectOperation proc
pusha
pushf
mov dl, input
mov compareReg,dl
L0:
cmp compareReg ,'?'
jne L1
printM optionsMsg
jmp finishSelect
L1:
cmp compareReg ,'r'
jne L2
jmp repeat
L2:
cmp compareReg ,'q'
jne L3
jmp toEnd
L3:
cmp compareReg ,'v'
jne L4
printM avgMsg
printC avg
jmp finishSelect
L4:
cmp compareReg ,'x'
jne L5
printM maxMsg
printc max
jmp finishSelect
L5:
cmp compareReg ,'n'
jne L6
printM minMsg
printc min
jmp finishSelect
L6:
cmp compareReg ,'e'
jne L7
printM sdMsg
printc standard
jmp finishSelect
L7:
cmp compareReg ,'s'
jne L8
printM sumMsg
mov ax, 0
mov al, sum
aam
or ax,3030h
printC ah
printC al
jmp finishSelect
L8:
cmp compareReg ,'a'
jne L9
printM ascMsg
mov cx ,6
mov si,0
printAsc:
printc asc[si]
inc si
loop printAsc
jmp finishSelect
L9:
cmp compareReg ,'d'
jne L10
printM desMsg
mov cx ,6
mov si,0
printDes:
printc des[si]
inc si
loop printDes
jmp finishSelect
L10:
cmp compareReg ,'l'
jne finishSelect
mov cx,7
mov di,0
printAll:
push cx
push di
mov dl,allMsg[di]
mov input,dl
call selectOperation
pop di
pop cx
inc di
loop printAll
finishSelect:
popf
popa
ret
SelectOperation endp
;MARK
StandardOperation proc
pusha
pushf
mov standard, 0
mov cx,6
mov si,0
rootSum:
mov dl, nums[si]
cmp avg,dl
ja aOp
mov al,avg
sub al,30h
sub dl,30h
sub dl,al
mov bl,dl
jmp toPower
aOp:
mov al,avg
sub al,30h
sub dl,30h
sub al,dl
mov bl,al
toPower:
mulO bl,bl
mov bl,result
add standard,bl
inc si
loop rootSum
mov bh,standard
mov bl,6
divO bh,bl
mov al,result
root al
mov bl,result
add bl,30h
mov standard,bl
popf
popa
ret
StandardOperation endp
avgOperation proc
pusha
pushf
mov sum,0
mov avg,0
mov cx ,6
mov si ,0
sumLoop:
mov dl, nums[si]
sub dl,30h
add sum,dl
inc si
loop sumLoop
mov dl,6
divO sum,dl
mov al , result
add al,30h
mov avg, al
popf
popa
ret
avgOperation endp
Sort proc
pusha
pushf
mov cx,6
mov si,0
addTo:
mov dl, nums[si]
mov asc[si],dl
inc si
loop addTo
; Selection sort
mov si,0
mov cx,5
p1:
push cx
mov cx,5
sub cx,si
mov di, si ;si =0
inc di ;di =1
mov bx, si ;bx= 0
p2:
mov dl, asc[bx]
cmp asc[di],dl
jnb fp2
mov bx,di
fp2:
inc di
loop p2
mov dl,asc[bx]
mov al,asc[si]
mov asc[si],dl
mov asc[bx],al
pop cx
inc si
loop p1
mov di,0
mov si,5
mov cx,6
insert:
mov dl,asc[si]
mov des[di],dl
inc di
dec si
loop insert
mov al,des[5]
mov min,al
mov al,des[0]
mov max,al
popf
popa
ret
Sort endp
toEnd:
end main