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
;============================================================================
;Donnes 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 passe 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 |
Partager