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
| ;X=K-B2/C1+D3+E2*F2
DOSSEG
.MODEL SMALL
;-------------------------------------------;
MY_MUL MACRO X,Y,Z ;MACRO for multiply 3 numbers
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
;-------------------------------------------;
.STACK 100h
.DATA
F dw 0000h
B dw 0000h
C db 00h
D dw 0000h, 0000h
E dw 0000h
;74569024 in 10 = 47113540 in 16
K EQU 0516h
Temp1 db 00 ; B/C | 2 bytes / 1 byte = 1 bytes (1 bytes)
Temp2 dw 0000h, 0000h ; E*F | 2 bytes * 2 byte = 4 bytes
Temp3 dw 0000h, 0000h ; K-Temp1 | 4 bytes - 1 bytes = 4 bytes
Temp4 dw 0000h, 0000h, 0000h,0000h ; Temp3 + D4 | 4 bytes + 4 bytes = 8 bytes
X dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h ; Temp4 + Temp2 | 8 bytes + 4 bytes = 12 bytes
;-------------------------------------------;
X_Str db 10 dup (0)
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
X_div2 dw 0,0
Y_div2 dw 0
;-------------------------------------------;
MESSG_X DB 13,10,'X= K - B / C + D + E * F K = 74569024','$'
MESSG_F DB 13,10,'F = ','$'
MESSG_B DB 13,10,'B = ','$'
MESSG_C DB 13,10,'C = ','$'
MESSG_D DB 13,10,'D = ','$'
MESSG_E DB 13,10,'E = ','$'
;-------------------------------------------;
MESSG_X_Res DB 13,10, 'X = ','$'
erStr_CZ db 13,10, 'C = 0 --> divide by zero ',13,10,'$'
erStr1 db 13,10, 'Data not input_variable',13,10,'$'
erStr2 db 13,10, 'Incorrectly data ',13,10,'$'
erStr3 db 13,10, 'Data is too long ',13,10,'$'
Mult10 dw 1,0
my_z dw 0,0
;-------------------------------------------;
;MAIN PROGRAM
.CODE
Start:
mov ax,@data
mov ds,ax
call input
call calculation
call output
mov ah,01
int 21h
mov ah,4Ch
int 21h
;-------------------------------------------;
input proc
;Display X= K - B / C + D + E * F
LEA DX,MESSG_X
MOV AH,09
INT 21H
;Display F = (enter the value)
LEA DX,MESSG_F
MOV AH,09
INT 21H
mov di,offset F
mov MaxLen,5
mov cx,MaxLen
call input_variable
;Display B = (enter the value)
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,5
mov cx,MaxLen
call input_variable
;Display C = (enter the value)
LEA DX,MESSG_C
MOV AH,09
INT 21H
mov di,offset C
mov MaxLen,3
mov cx,MaxLen
call input_variable
;Display D = (enter the value)
LEA DX,MESSG_D
MOV AH,09
INT 21H
mov di,offset D
mov MaxLen,9
mov cx,MaxLen
call input_variable
;Display E = (enter the value)
LEA DX,MESSG_E
MOV AH,09
INT 21H
mov di,offset E
mov MaxLen,5
mov cx,MaxLen
call input_variable
cmp C,0
jne dali ;if C != 0 go to dali, else - show error
mov ah,09
mov dx, offset erStr_CZ
int 21h
mov ah,4Ch
int 21h
dali:
ret ;continue
input endp
;-------------------------------------------;
calculation proc
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
;D/C
mov ax,B
mov bl,C
div bl
mov Temp1,al
;E*F
mov ax, [E]
mul [F]
mov [Temp2], ax
mov [Temp2 + 2], dx
;K-Temp1
mov dx,K
mov bl,Temp1
sub ax,bx
sbb dx,0
mov Temp3,ax
mov Temp3+2,dx
;Temp4+D
mov ax, [Temp3]
mov dx, [Temp3+2]
mov bx, [D]
add ax, bx
mov [Temp4], ax
mov [Temp4 + 2], dx
;Temp4+Temp2
mov ax, Temp4
mov dx,Temp4+2
add Temp2,ax
mov [X],ax
mov [X+2],dx
ret
calculation endp
;-------------------------------------------;
output proc
mov di,0
mov Y_div2,10
mov cx,X
mov bx,X+2
O_1:
mov X_div2,cx
mov X_div2+2,bx
call my_div2
add dl,30h
mov X_Str[di],dl
inc di
cmp bx,0
ja O_1
cmp cx,10
jae O_1
add cl,30h
mov X_Str[di],cl
mov dx,offset MESSG_X_Res
mov ah,09
int 21h
O_2:
mov dl,X_Str[di]
mov ah,02h
int 21h
dec di
jge O_2
ret
output endp
;-------------------------------------------;
input_variable PROC
mov si,0
In_00: mov ah,01
int 21h
cmp al,0Dh
je In_1
In_0: mov dl,al
call CHECK_BYTE
mov TempStr[si],dl
inc si
loop In_00
In_1: push si
dec si
cmp cx,MaxLen
jne In_2
call Err1
In_2: mov bh,0
mov bl,TempStr[si]
MY_MUL Mult10,bx,my_z
add TempBin,ax
adc TempBin+2,dx
mov bh,0
mov bl,10
MY_MUL Mult10,bx,my_z
mov Mult10,ax
mov Mult10+2,dx
dec si
cmp si,0
jge In_2
mov ax, TempBin
mov dx,TempBin+2
pop si
cmp si,MaxLen
jl In_3
cmp MaxLen,10
jl In_2_1
js In_Err
cmp dx,0FFFFh
ja In_Err
jmp In_3
In_2_1: cmp MaxLen,5
jl In_2_2
cmp dx,00
ja In_Err
cmp ah,0ffh
ja In_Err
jmp In_3
In_2_2: cmp ax,00FFh
jbe In_3
In_Err: LEA DX,erSTR3
MOV AH,09
INT 21H
mov ah,4Ch
int 21h
In_3: mov [di],ax
mov [di+2],dx
mov TempBin,0
mov TempBin+2,0
mov Mult10,1
mov Mult10+2,0
RET
input_variable ENDP
;-------------------------------------------;
Err1 PROC
PUBLIC Err1
LEA DX,erSTR1
MOV AH,09
INT 21H
mov ah,4Ch
int 21h
RET
Err1 ENDP
;-------------------------------------------;
CHECK_BYTE PROC
PUBLIC CHECK_BYTE
sub dl,30h
cmp dl,00
jl ErS
cmp dl,0Ah
jl GO
ErS:
LEA DX,erSTR2
MOV AH,09
INT 21H
mov ah,4Ch
int 21h
GO: RET
CHECK_BYTE ENDP
;-------------------------------------------;
MY_DIV2 proc
sub cx,cx
sub bx,bx
mov dx,X_div2+2
mov ax,X_div2
M2_D1:
cmp dx,Y_div2
jb M2_D3
sub ax,Y_div2
sbb dx,00
add cx,01
adc bx,0
jmp M2_D1
M2_D3:
div Y_div2
add cx,ax
adc bx,00
ret
MY_DIV2 ENDP
;-------------------------------------------;
end Start |