IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Assembleur Discussion :

[DOS] Programme qui affiche l'heure exacte [Sources]


Sujet :

Contribuez Assembleur

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 : 53
    Points
    53
    Par défaut [DOS] Programme qui affiche l'heure exacte
    Programme qui affiche l'heure exacte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 : 53
    Points
    53
    Par défaut
    Merci ... c'est génial !

    bien connaître ça.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    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.

Discussions similaires

  1. [Turbo Pascal] Programme qui affiche le jour à partir d'une date
    Par rafikadel dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 27/03/2020, 19h33
  2. Programme qui affiche un carré
    Par jskthebest dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 08/05/2008, 20h21
  3. Réponses: 5
    Dernier message: 04/04/2008, 20h14
  4. Réponses: 4
    Dernier message: 13/04/2007, 15h26
  5. Programme qui affiche un quadrilatère droit
    Par superdj dans le forum Pascal
    Réponses: 19
    Dernier message: 27/11/2006, 23h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo