-
Notifications
You must be signed in to change notification settings - Fork 0
/
SUB.asm
360 lines (286 loc) · 5.91 KB
/
SUB.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
ASSUME CS:CSEG, DS:CSEG, ES:CSEG
CSEG SEGMENT
ORG 100H
MAIN: JMP DEB
;***********************************Procédures
;--------------------------- Conversion du nombre en BINAIRE
CONVBIN PROC
MOV AX,0
MOV BX,0AH
CONVBINBCL:
MUL BX
ADD AL,[SI]
ADC AH,0
INC SI
CMP [SI],0DH
JNE CONVBINBCL
RET
CONVBIN ENDP
CONVDEC PROC
MOV BX,0AH
CONVDECBCL:
DIV BX
OR DL,30H
MOV [DI],DL
INC DI
CMP AX,0
JNE CONVDECBCL
RET
CONVDEC ENDP
;PRINT PROC
;initialize count
; mov cx,0
; mov dx,0
;label1:
; if ax is zero
; cmp ax,0
; je print1
;initialize bx to 10
; mov bx,10
; extract the last digit
; div bx
;push it in the stack
; push dx
;increment the count
; inc cx
;set dx to 0
; xor dx,dx
; jmp label1
;print1:
;check if count
;is greater than zero
; cmp cx,0
; je exit
;pop the top of stack
; pop dx
;add 48 so that it
;represents the ASCII
;value of digits
; add dx,48
;interrupt to print a
;character
; mov ah,02h
; int 21h
;decrease the count
; dec cx
; jmp print1
;exit:
;ret
;PRINT ENDP
;***********************************
DEB:
SAISIEOP:
;--------------------------- Affichage message INT21-40
LEA DX,br
MOV AH,9
INT 21H ;-- Nouvelle ligne
MOV BX,0001H
LEA DX,MESSAGE3
MOV CX, L_MESSAGE3
MOV AH, 40H
INT 21H
;--------------------------- Saisie de l'opérateur
MOV CX,1
LEA DI,OPERATEUR
MOV AH,01
INT 21H
CMP AL,043
JE SAISIENB
CMP AL,045
JE SAISIENB
CMP AL,042
JE SAISIENB
CMP AL,047
JE SAISIENB
ERREUROP:
;--------------------------- Affichage message INT21-40
LEA DX,br
MOV AH,9
INT 21H ;-- Nouvelle ligne
MOV BX,0001H
LEA DX,ERREUROPERANDE
MOV CX, L_ERREUROPERANDE
MOV AH, 40H
INT 21H
JMP SAISIEOP
SAISIENB:
;--------------------------- Affichage message INT21-40
LEA DX,br
MOV AH,9
INT 21H ;-- Nouvelle ligne
MOV BX,0001H
LEA DX,MESSAGE1
MOV CX,L_MESSAGE1
MOV AH, 40H
INT 21H
;--------------------------- Saisie du nombre
MOV CX,4
LEA DI,NOMBRE1D
SAISIE1:
MOV AH,01
INT 21H
CMP AL,0DH
JE SUITE1
CMP AL,30H
JB HORSCODE1
CMP AL,39H
JA HORSCODE1
AND AL, 00001111B
MOV [DI],AL
INC DI
DEC CX
JNZ SAISIE1
SUITE1: MOV [DI], 0DH
LEA SI,NOMBRE1D
CALL CONVBIN
MOV NOMBRE1B,AX
HORSCODE1:
SAISIENB2:
;--------------------------- Affichage message INT21-40
LEA DX,br
MOV AH,9
INT 21H ;-- Nouvelle ligne
MOV BX,0001H
LEA DX,MESSAGE2
MOV CX,L_MESSAGE2
MOV AH, 40H
INT 21H
;--------------------------- Saisie du nombre
MOV CX,4
LEA DI,NOMBRE2D
SAISIE2:
MOV AH,01
INT 21H
CMP AL,0DH
JE SUITE2
CMP AL,30H
JB HORSCODE2
CMP AL,39H
JA HORSCODE2
AND AL, 00001111B
MOV [DI],AL
INC DI
DEC cx
JNZ SAISIE2
SUITE2: MOV [DI],0DH
LEA SI,NOMBRE2D
CALL CONVBIN
MOV NOMBRE2b,AX
JMP OPSELEC
HORSCODE2:
;--------------------------- JMP to opération
OPSELEC: MOV CX,1
LEA DI,OPERATEUR
MOV AH,01
INT 21H
CMP AL,043
JE ADDI
CMP AL,045
JE SUBS
CMP AL,042
JE MULTI
CMP AL,047
JE DIVI
;*************************** SOUSTRACTION
SUBS: MOV AX,NOMBRE1b
MOV BX,0
SUB AX,NOMBRE2b
MOV RESULTAT,AX
ADC BX,0
MOV RESULTAT+2,BX
JMP CONVDECIMAL
;****************************
;*************************** ADDITION
ADDI: MOV AX,NOMBRE1b
MOV BX,0
ADD AX,NOMBRE2b
MOV RESULTAT,AX
ADC BX,0
MOV RESULTAT+2,BX
JMP CONVDECIMAL
;***************************
;*************************** MULTIPLICATION
MULTI: MOV AX,NOMBRE1b
MOV BX,0
MUL NOMBRE2b
MOV RESULTAT,AX
ADC BX,0
MOV RESULTAT+2,BX
JMP CONVDECIMAL
;***************************
;*************************** DIVISION
DIVI: MOV AX,NOMBRE1b
MOV BX,0
DIV NOMBRE2b
MOV RESULTAT,AX
ADC BX,0
MOV RESULTAT+2,BX
JMP CONVDECIMAL
;***************************
;--------------------------- Conversion du nombre en DECIMAL
CONVDECIMAL:
LEA DI,RESASCII
MOV AX,RESULTAT
CALL CONVDEC
MOV DL,BYTE PTR [DI]
MOV RESASCII, DL
;--------------------------- Affichage RESULTAT
AFFRES: MOV DL, RESASCII
MOV AX,DL
MOV CX,0
MOV DX,0
AFFRESBCL:
CMP AX,0
JE PRINT1
MOV BX,10
DIV BX
PUSH DX
INC CX
XOR DX,DX
JMP AFFRESBCL
PRINT1:
CMP CX,0
JE SORTIE
POP DX
ADD DX,48
MOV AH,02H
INT 21H
DEC CX
JMP PRINT1
SORTIE: JMP FIN
;---------------------------
COMMENT /*
MOV AH,3FH
LEA DX, BUFFER
INT 21H
MOV AH, 40H
LEA DX, BUFFER
INT 21H
*/
;--------------------------- Fin d'execution INT24-4C
FIN: MOV AH, 4CH
INT 21H
;---------------------------
;------ZONE DE DONNEES------
;---------------------------
br DB 0AH,0DH,"$" ;-- ligne vide
NOMBRE1D db 5 DUP (0DH)
NOMBRE2D db 5 DUP (0DH)
NOMBRE1b dW 2 DUP (?)
NOMBRE2b dW 2 DUP (?)
RESULTAT dw 2 DUP (?)
RESASCII db 2 DUP (?)
OPERATEUR DB 1 DUP (?)
L_OPERATEUR EQU $-OPERATEUR
MESSAGE1 DB "VEUILLEZ SAISIR LE PREMIER NOMBRE"
L_MESSAGE1 EQU $-MESSAGE1
MESSAGE2 DB "VEUILLEZ SAISIR LE DEUXIEME NOMBRE"
L_MESSAGE2 EQU $-MESSAGE2
MESSAGE3 DB "Quelle operation souhaitez vous realiser ?"
L_MESSAGE3 EQU $-MESSAGE3
ERREUROPERANDE DB "Erreur lors de la saisie de l'operande"
L_ERREUROPERANDE EQU $-ERREUROPERANDE
BUFFER DB 80,?,80 DUP("$")
;--------------------------- Fin d'assemblage
CSEG ENDS
END MAIN