-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPGCD_IN_8bits.asm
372 lines (252 loc) · 7.28 KB
/
PGCD_IN_8bits.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
data SEGMENT
; PGCD AVEC REPRESENTATION SUR 8 BITS
; INITIALISATION DU VARIABLES
n1 DB 8
n2 DB 28
Tab db 6,12,24,36,2,0 ;doit se terminer avec 0
message_1 db 'fin du calcule du PGCG $'
cx2 dw ?
samedi db 'samedi, $'
dimanche db 'dimanche, $'
lundi db 'lundi, $'
mardi db 'mardi, $'
mercredi db 'mercredi, $'
vendredi db 'vendredi, $'
jeudi db 'jeudi, $'
str db ' Tab= $'
str2 db ' PGCD= $'
ancien_ip dw ?
ancien_cs dw ?
ENDS
stack SEGMENT
DB 128 dup(0)
ENDS
code SEGMENT
;;;;;;;;;;;;;;;;;;;;;; PROCEDURE QUI CALCULE LE PGCD ENTRE 2 VAR ;;;;;;;;;;;;;;;
PGCD_I PROC
POP CX ; SAUVGARDER IP DANS CX
POP BX; LES VALEURS SONT DANS BH ET BL
REPETER:
CMP BL, 0
JE FIN
MOV AL, BH
MOV AH, 0 ; INITIALISER AX
DIV BL ; AH := n1 % n2 CONTIENT LE RESTE, AL := n1 / n2 CONTIENT LE QUOTIENT
MOV BH, BL ; n1 := n2
MOV BL, AH ; n2 := n1 % n2
JMP REPETER
FIN:
PUSH BX
PUSH CX ; RETOURNER LE IP AU DEBUT DU PILE
RET
PGCD_I ENDP
;;;;;;;;;;;;;;;;;;;;;;;; PROCEDURE QUI AFFICHE UN NBR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP PROC ;DISP = DISPLAY
MOV DL,BH ; LES VALEURS SONT DANS BH ET BL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BL ; BL
ADD DL,30H
MOV AH,02H
INT 21H
RET
DISP ENDP
;;;;;;;;;;;;;;;;;;;;;;;;; PROCEDUER QUI QFFICHE UN TABLEAU;;;;;;;;;;;;;;;;;;;;;;;;;;;
AFFICHER_TAB PROC
call LENGTH ; la taille du tableau est dans bh
xor cx,cx
mov cl, bh ; la taille du tableau est dans cx
lea si , tab
again:
mov ah,0
mov al,[si]
mov dl , 10
div dl ; ax/dl
mov bl,ah ; modulo dans bh
mov bh, al ; quotient dans bl
call Disp
MOV DL,',' ; POUR AFFICHER ','
MOV AH,02H
INT 21H
inc si
loop again
AFFICHER_TAB ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;; PROCEDURE QUI CALCULE PGCD D'UN TABLEAU ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PGCD_IN PROC
POP CX2 ; SAUVGARDER IP DANS CX2
lea si, tab
mov bh,[si] ; premier valeur dans bh
cmp bh,0
je fin1
boucle:
inc si
mov bl,[si] ; valeur suivante dans bl
cmp bl,0
je fin1
PUSH BX
call PGCD_I
jmp boucle
fin1:
PUSH BX
PUSH CX2 ;
ret
PGCD_IN ENDP
;;;;;;;;;;;;;;;;;;;;;;;;; PROCEDURE QUI CALCULE LA TAILLE DU TABLEAU ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LENGTH PROC
xor bh,bh ; pour initialiser bh a 0
mov si,offset Tab
mov bl,[si]
cmp bl,0
je fin2
boucle2:
inc bh ; la taille dans bh
inc si
mov bl,[si]
cmp bl,0
je fin2
jmp boucle2
fin2:
ret
LENGTH ENDP
;;;;;;;;;;;;;;;;;;;;; MACRO POUR DEPLACER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
goto macro x,y
mov ah,02h
mov bh, 00h
mov dl,x
mov dh,y
int 10h
endm
;;;;;;;;;;;;;;;;;;;; MACRO POUR AFFICHER UN CARACTER ;;;;;;;;;;;;;;;;;;;;;;;
afficherChar macro x
MOV DL,x
MOV AH,02H
INT 21H
endm
;;;;;;;;;;;;;;;;;;;;; programme principale ;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
MOV AX, data
MOV DS, AX
MOV ES, AX
MOV AX, stack
MOV SS, AX
; DEPLACER VERS LA FIN DU 1er LIGNE
goto 60,1
MOV AH,2AH ; To get System Date
INT 21H
AAM
CMP AL , 06h
JE j1
CMP AL ,00h
JE j2
CMP AL , 01h
JE j3
CMP AL ,02h
JE j4
CMP AL , 03h
JE j5
CMP AL ,04h
JE j6
CMP AL , 05h
JE j7
j1:
LEA DX , samedi
jmp fn
j2:
LEA DX , dimanche
jmp fn
j3:
LEA DX , lundi
jmp fn
j4:
LEA DX , mardi
jmp fn
j5:
LEA DX , mercredi
jmp fn
j6:
LEA DX , jeudi
jmp fn
j7:
LEA DX , vendredi
fn:
MOV AH,09H
INT 21H
;;;;;;;;;;;;;;;;;;;;; afficher jour ;;;;;;;;;;
DAY:
MOV AH,2AH ; To get System Date
INT 21H
MOV AL,DL ; JOUR DANS DL
AAM
MOV BX,AX
CALL DISP
afficherChar '/'
;;;;;;;;;;;;;;;;;;;;; afficher mois ;;;;;;;;;;
MONTH:
MOV AH,2AH ; To get System Date
INT 21H
MOV AL,DH ; MOIS DANS DH
AAM
MOV BX,AX
CALL DISP
afficherChar '/'
;;;;;;;;;;;;;;;;;;;;; afficher annee ;;;;;;;;;;
YEAR:
MOV AH,2AH ; To get System Date
INT 21H
ADD CX,0F830H ; ,
MOV AX,CX
AAM
MOV BX,AX
CALL DISP
;;;;;;;;;;;;;;;;;;;; deplacer vers deuxiem ligne ;;;;;;;;;;;;
goto 73,2
heure:
MOV AH,2CH ; To get System Date
INT 21H
MOV AL,CH ; HEURE DANS CH
AAM
MOV BX,AX
CALL DISP
afficherChar ':'
minutes:
MOV AH,2CH ; To get System Date
INT 21H
MOV AL,CL ; MINUTE DANS CL
AAM
MOV BX,AX
CALL DISP
;;;;;;;;;;;;;;;;;;;; deplacer vers 3eme ligne ;;;;;;;;;;;;;;;;;;
goto 3,3
call LENGTH
afficherChar 'N'
afficherChar '='
MOV DL,bh ;
ADD DL , 48
MOV AH,02H
INT 21H
;;;;;;;;;;;;;;;;;;;; deplacer vers mileu de 3eme ligne ;;;;;;;;;;;;;;;;
goto 35 ,3
LEA DX ,str
MOV AH,09H
INT 21H
call AFFICHER_TAB ; afficher le tableau
;;;;;;;;;;;;;;;;;;;;;; deplacer vers mileu de 4eme ligne ;;;;;;;;;;;;;;;;
goto 35 , 4
LEA DX ,str2
MOV AH,09H
INT 21H
call PGCD_IN ; afficher le PGCD
POP BX ; PGCD DANS BH
;;;;;;;;;;;;;;;;;; AFFICHAGE DU PGCD ;;;;;;;;;;;;;
mov ah,02h
mov dl, bh
add dl,48
int 21h
exit:
MOV AH, 4ch ; exit
INT 21h
ENDS
END start
; add your code here
ret