Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > Contribuez
Contribuez Contribuez à la FAQ Assembleur ou partagez vos sources
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/01/2008, 00h09   #1
Dayssam
Nouveau Membre du Club
 
Homme Mohamed Dayssam
Ingénieur systèmes et réseaux
Inscription : mars 2007
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Dayssam
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 42
Points : 38
Points : 38
Par défaut [DOS] Programme qui affiche l'heure exacte

Programme qui affiche l'heure exacte

Code :
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
;============================================================================
;Programme correspondant aux objectifs du Contrôle de TP du 1er février 2001
;============================================================================
 
        ASSUME CS : Code, DS : Data, SS : Pile
 
;============================================================================
;Donn‚es et pile
 
Data	SEGMENT
        Message DB 13,"Il est $"   ;Message d'annonce
        TimeVal DB 4 DUP (?)    ;Stocke les 4 données directement (valeurs)
        TimeChr DW 4 DUP (?)    ;Stocke la représentation ASCII des nombres
Data	ENDS
 
Pile    SEGMENT STACK
        DW 10 DUP (0)
BasPile EQU THIS WORD
Pile    ENDS
 
 
;============================================================================
;Programme et procédures
 
Code	SEGMENT
 
;----------------------------------------------------------------------------
;Procédure qui lit l'heure
;sous forme de 4 octets h,min,sec,centièmes
;et range les valeurs brutes dans la table
;dont l'adresse est pass‚e par DX
 
ReadTime PROC NEAR
        MOV BX,DX
        MOV AH,2CH      ;Lecture de l'heure avec la fonction DOS
        INT 21H        
        MOV [BX+0],CH   ;Rangement dans le tableau des - Heures
        MOV [BX+1],CL   ;                              - Minutes
        MOV [BX+2],DH   ;                              - Secondes
        MOV [BX+3],DL   ;                              - Centièmes
        RET
ReadTime ENDP
 
;----------------------------------------------------------------------------
;Procédure qui lit une valeur positive <100 passée par DL
;la convertit en sa représentation en décimal en ASCII
;et la retourne dans AX
 
Int2Chr PROC NEAR
        MOV AL,DL
        MOV AH,0
more:   INC AH
        SUB AL,10d
        JGE more
        DEC AH
        ADD AL,10d
        ADD AX,'00'
        RET
Int2Chr ENDP
 
 ;----------------------------------------------------------------------------
;Procédure qui affiche deux caractères passés par DX (DH puis DL)
 
PlotWord PROC NEAR
        MOV CX,DX       ;Sauvegarde
        MOV DL,CH       ;Affichage de DH
        MOV AH,02H
        INT 21H
        MOV DL,CL       ;Affichage de DL
        MOV AH,02H
        INT 21H
        RET
PlotWord ENDP
 
;----------------------------------------------------------------------------
;Procédure qui lit un tableau de valeurs positive <100
;convertit toutes les valeurs en leur représentation en décimal en ASCII
;et les retourne dans un tableau. Les 3 paramètres sont passés par la pile.
; Dans l'ordre:	adresse du tableau de valeurs donné [BP+8]
;			taille de ce tableau [BP+6]
;			adresse du tableau destination [BP+4]
 
TabH2Ch PROC NEAR
        PUSH BP
        MOV BP,SP
nextInt:MOV BX,[BP+8]
        MOV DL,[BX]
        CALL Int2Chr
        MOV BX,[BP+4]
        MOV [BX],AX
        INC word ptr [BP+8]
        ADD word ptr [BP+4],2
        DEC word ptr [BP+6]
        JNZ nextInt
        MOV SP,BP
        POP BP
        RET
TabH2Ch ENDP
 
;----------------------------------------------------------------------------
;Procédure qui affiche l'heure sous forme hh:mm:ss.ss
;à partir de valeurs données dans un tableau dans l'ordre hhmmssss
;et dont l'adresse est passée par DX
 
PlotTime PROC NEAR
        MOV BX,DX
        MOV DX,[BX+0]   ;Affichage heures (dizaines,unités)
        CALL PlotWord
        MOV DL,':'      ;Affichage séparateur
        MOV AH,02H
        INT 21H
        MOV DX,[BX+2]   ;Affichage minutes (dizaines,unités)
        CALL PlotWord
        MOV DL,':'      ;Affichage séparateur
        MOV AH,02H
        INT 21H
        MOV DX,[BX+4]   ;Affichage secondes (dizaines,unités)
        CALL PlotWord
        MOV DL,'.'      ;Affichage séparateur
        MOV AH,02H
        INT 21H
        MOV DX,[BX+6]   ;Affichage centièmes (dizaines,unités)
        CALL PlotWord
        RET
PlotTime ENDP
;============================================================================
;Programme principal
 
main:   MOV AX,Data             ;Initialisations des segments
        MOV DS,AX
        MOV AX,Pile
        MOV SS,AX
        MOV SP,BasPile
        MOV BP,SP
 
boucle: MOV BX,offset Message   ;Affichage du message
        MOv DX,BX        
        MOV AH,09H
        INT 21H
 
        MOV BX,offset TimeVal   ;Chargement de l'heure brute dans le tableau
        MOV DX,BX
        CALL ReadTime
 
        MOV BX,offset TimeVal   ;Conversion
        PUSH BX
        MOV BX,4
        PUSH BX
        MOV BX,offset TimeChr
        PUSH BX
        CALL TabH2Ch
 
        MOV BX,offset TimeChr   ;Affichage
        MOV DX,BX
        CALL PlotTime
 
        MOV AH,01H              ;Test d'arrêt sur touche 'Esc' (ASCII 27d)
        INT 21H
        CMP AL,27
        JNE boucle
 
        MOV AH,4CH              ;Retour au dos
        INT 21H
 
Code	ENDS
 
        END main
Dayssam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 02h34   #2
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
c'est pas l'heure exacte, c'est l'heure de la machine, et si ta machine n'est pas a l'heure, ton programme non plus.

sinon, pour connaitre l'heure EXACTE sans passer par le dos, il existe les ports 70h et 71h, ça aussi c'est cool, et ça donne la possibilité de se passer de tout, BIOS, DOS, OS, WIN, LINUX, etc...

Code :
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
 
seconds rb 1
minutes rb 1
hours rb 1
cnt00 rd 1
fps rd 1
frames rd 1
frameps db 'fps=',0
timebuffer rb 8
endoftimebuffer db 0
timeclock:
        mov esi,endoftimebuffer
        dec esi
        mov al,00h ;or 0c0h
        out 70h,al
        in al,71h
        cmp al,[seconds]
        je @f
        mov ebx,[frames]
        mov ecx,ebx
        sub ebx,[cnt00]
        mov [cnt00],ecx
        mov [fps],ebx
@@:
        mov [seconds],al
        mov ah,al
        and al,0fh
        add al,'0'
        shr ah,4
        add ah,'0'
        mov [esi],al
        dec esi
        mov [esi],ah
        dec esi
        mov byte[esi],':'
        dec esi
        mov al,02h ;or 0c0h
        out 70h,al
        in al,71h
        mov [minutes],al
        mov ah,al
        and al,0fh
        add al,'0'
        shr ah,4
        add ah,'0'
        mov [esi],al
        dec esi
        mov [esi],ah
        dec esi
        mov byte[esi],':'
        dec esi
        mov al,04h ;or 0c0h
        out 70h,al
        in al,71h
        mov [hours],al
        mov ah,al
        and al,0fh
        add al,'0'
        shr ah,4
        add ah,'0'
        mov [esi],al
        dec esi
        mov [esi],ah
        mov ebx,esi
        mov [txt.x],265
        mov [txt.y],190
        call txt
        ret
ceci n'est pas un programme, mais une fonction que j'usite assez souvent dans mes programmes.

ma premiere becane montrait des signes de faiblesse, et ça bugguait deux fois par minutes...
le port du RTC etait DEAD et m'envoyait n'importe quoi.
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 13h38   #3
Dayssam
Nouveau Membre du Club
 
Homme Mohamed Dayssam
Ingénieur systèmes et réseaux
Inscription : mars 2007
Messages : 42
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Dayssam
Âge : 26
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 42
Points : 38
Points : 38
Merci ... c'est génial !

bien connaître ça.
Dayssam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 11h37   #4
MIG86
Membre du Club
 
Inscription : novembre 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 50
Points : 66
Points : 66
Deux petites remarques à propos du premier programme :
- par compatibilité avec les premières versions de MASM, il est bon de placer la directive ASSUME au début du segment de code ;
- en outre, avant d'afficher l'heure, il faudrait vérifier que DL donne des valeurs continues afin de savoir si les centièmes de seconde sont gérés par le système.
MIG86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h43.


 
 
 
 
Partenaires

Hébergement Web