Bonjour à tous !
Voilà je voudrais simplement savoir comment on fait pour aquérir
l'heure système.
Je sais que l'Int 21h fonction 2Ah donne la date, mais pas l'heure.
Voilà c'est tout...
Merci d'avance.
Bonjour à tous !
Voilà je voudrais simplement savoir comment on fait pour aquérir
l'heure système.
Je sais que l'Int 21h fonction 2Ah donne la date, mais pas l'heure.
Voilà c'est tout...
Merci d'avance.
Bonsoir,
C'est la fonction 2CH de l'intérruption 21H que tu dois utiliser.
En entrée :
AH = 2Ch
En sortie :
CH = Heures
CL = Minutes
DH = Secondes
DL = Centièmes de seconde
Bonne soirée
Bonjour et merci et beaucoup !
Une autre question en rapport : Je veux faire un test pour un delay.
J'ai vu un thread là dessus et j'ai testé ce code dans un programme :
Ca ne fonctionne pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Delay: mov ah, 86h mov ecx, 0FFFFFFFFh mov dx, cx sar ecx, 16 int 15h
Dans ce cas, sar ecx, 16 ne sert à rien mais c'est pour faire une future procédure.
Quelqu'un veut bien me dire ce qui ne va pas ?
Merci.
Bonjour !
Es-tu sûr ? Avec la fonction 86h de l'interruption 15h, la valeur du délai (en microsecondes) est stockée dans le couple CX:DX.Envoyé par Nico*3-3
Dans ton code, tu demandes un délai de FFFF:FFFFh microsecondes (car l'instruction SAR réinjecte le bit 15, ce qui ne change rien à la valeur de CX). Ca fait donc 4.294.467.295 microsecodes, soit 4.294 secondes !
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Désolé de remonter un vieux topic, mais en relisant ça une question m'est venu à l'esprit : L'INT 21h est celle du DOS nan ? Si je veux obtenir l'heure système ( CMOS ) à partir d'un autre OS (Linux, ou autre) je fait comment (Si c'est possible ! )?
Mici ^^
Psy³
The problem is someplace between the chair and the keyboard
Bonsoir,
L'int 21h est bien une interruption DOS. Si tu le souhaites, tu peux également utiliser la fonction 02h de l'int 1Ah du BIOS.
Entrée :
AH = 02h
Sortie :
CH = Heures
CL = Minutes
DH = Secondes
Le carry flag est modifié en conséquence : CF=0 : pas de problèmes ; CF=1 la batterie de l'horloge est déchargée.
J'espère que tout ceci répondra à ta question.Cette fonction permet de lire l'heure de l'horloge temps réel alimentée par batterie. Comme ce type d'horloge n'existe que sur les AT, seul ce modèle de PC soutient cette fonction.
Bonne nuit !
Salut tout le monde ! Bonne Année et désolé, ah les vacances...
Je vais donner quelques précisions de plus :
Je fais (pour l'instant) un test .exe sous DOS pour faire une attente. Je veux faire une procédure "Delay" qui prend dans en paramètre dans ecx le nombre de millisecondes à attendre. C'est ecx pour que ce soit plus simple : au lieu de s'embêter avant chaque appel à faire le calcul pour mettre le paramètre dans cx:dx, on le met directement dans ecx et la procédure fera les calculs pour nous. La procédure doit mettre cx dans dx (le low word) et décaler ecx de 16 bits vers la droite pour avoir le high word dans cx. On retombe donc en cx:dx.
Mais avant de faire cela, je veux faire un test.
Voilà donc mon code complet avec FASM (car ça viens peut-être de l'extérieur):
Voilà, ça ne plante pas mais ça ne fait aucune attente.
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 Format MZ entry CODE_SEG:Start segment CODE_SEG Start: Initialise: mov dx, DATA_SEG mov ax, EXTRA mov ds, dx mov es, ax Delay: mov ah, 86h mov ecx, 0FFFFFFFFh mov dx, cx sar ecx, 16 int 15h Fin: mov ax, 4C00h int 21h segment DATA_SEG segment EXTRA
Et même en remplaçant :
Par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mov ecx, 0FFFFFFFFh mov dx, cx sar ecx, 16
Ca fait la même chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mov cx, 0FFFFh mov dx, 0FFFFh
Alors je me suis dit : c'est peut-être ax car il est initialisé avec l'adresse d'un segment et ah est ensuite mis à 86h.Mais al ets initialisé avec une valeur quelconque. Alors j'ai remplacé :
Par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part mov ah, 86h
Toujours pareil. Je ne sais pas ce qui ne vas pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part mov ax, 8600h
Merci d'avance pour vos réponses.
Je suis allé faire un tour chez Ralph Brown (http://www.ctyme.com/intr/rb-1525.htm), et j'ai vu que la fonction 86h renvoie CF à 1 s'il y a erreur.
J'ai donc rajouté un petit bout de code après l'appel de l'interruption :
Et ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part jc Error
Pour déclencher un bip en cas d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Error: mov dl, 7 mov ah, 02h int 21h jmp Fin
Et ce bip... se déclenche à chaque fois .
Qu'est-ce qui pourrait me sauver ?
Je vous invite à regarder vous aussi chez Ralph Brown si vous voulez m'aider.
Merci beaucoup.
Désolé de me répéter mais, si je ne me trompe pas, ton couple CXX vaut FFFF:FFFFh microsecondes, qui est une valeur énorme (et qui déclenche peut-être l'erreur).
D'ailleurs, je ne comprends pas bien le but de ton instruction de décalage SAR sur le registre ECX.
As-tu essayé une valeur plus faible (500.000 ou 1.000.000 microsecondes, par exemple) ?
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Oui j'ai bien essayé plusieurs valeurs plus petites, même CX à 0, même tout à zéro, même des valeurs multiples de 977 et il me fait toujours le bip d'erreur...
Je ne sais pas si j'appelle bien l'interruption, je ne sais vraiment pas ce qui n'est pas bon dans mon code.
Aidez-moi s'il vous plaît
Merci d'avance...
Quel est ton OS ?
Si ça peut te rassurer, la fonction 86h de l'interruption 15h ne fonctionne pas sous Windows 2000 (et donc pas sous XP non plus).
Ca ne plante pas mais ça ne fait aucune attente.
Par contre, ça marche très bien sous DOS pur et sous Windows 3.1x. J'imagine que ça doit aussi fonctionner sous Win9x/Me.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Euh... Oui j'ai XP.
D'accord ça marche pas, mais je fais commen alors : : :
Merci Alcatîz.
J'ai aussi essayé en détournant l'interruption 70h mais ça ne fais aucune attente, pareil !
Voilà mon code :
Ca ne fais rien, comme d'habitude...
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 Format MZ entry CODE_SEG:Start segment CODE_SEG IntClock70h: cmp byte [AddClock], 0 jz $+1 inc [Clock] iret Start: mov ax, DATA_SEG mov ds, ax InitVector: xor dx, dx mov es, dx mov eax, [es:70h*4] mov [Vector], eax mov word [es:70h*4], IntClock70h mov [es:70h*4+2], cs Delay: mov [AddClock], 1 cmp [Clock], 0FFFFFFh jb $-1 Fin: RestoreVector: xor dx, dx mov es, dx mov eax, [Vector] mov [es:70h*4], eax mov ax, 4C00h int 21h segment DATA_SEG Clock dd 0 AddClock db 0 Vector dd ?
Là aussi ça doit être à cause de Windows XP, mais comment faire ? Il dois bien y avoir un moyen.
Tout dépend de la précision dont tu as besoin : si tu peux te contenter de multiples de 1/18,2 secondes, tu peux détourner l'interruption 1Ch et utiliser l'horloge système comme compteur.
Tu peux trouver notamment un exemple expliqué de détournement de cette interruption dans ce thread : http://www.developpez.net/forums/vie...&highlight=1ch.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Merci Alcatîz,
Mais j'ai essayé (pour ne pas perdre de temps) simplement en modifiant le programme ci-dessus, c'est-à-dire que j'ai remplacé 70h par 1Ch etc...
Sans passer par le DOS pour changer le vecteur.
Ca ne marche pas non plus...
Suis-je obligé de passer par le DOS ? Je vais essayer et je dirais ce que ça me fais.
J'ai essayé en modifiant les vecteur d'interruption du DOS et ça fait, comme toujours, aucune attente...
Est-ce que quelque chose d'autre pourrait me permettre de faire un delay (à part changer d'OS ) ?
Pourquoi est-ce que Windows XP bloque-t-il l'accès a ces fonctions ?
Merci d'avance...
Il me semble que, même sous XP, l'int 1Ch devrait être utilisable sur la machine virtuelle. Tu n'observes aucune incrémentation de compteur, rien du tout ?Envoyé par Nico*3-3
Au fait, est-ce XP Home ou XP Pro ? Je crois que XP Home est bridé au niveau de l'émulation du mode réel (si je me trompe, merci de me corriger !).
Tu peux éventuellement essayer de passer en mode de compatibilité Win9x :
http://www.microsoft.com/windowsxp/u...appcompat.mspx (ça ne coûte rien d'essayer )
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Bonjour,
J'ai XP Home Edition...
J'ai essayé de passer en mode compatibilité mais rien n'y fais, ça ne fonctionne pas. J'ai testé avec 3 programmes : un qui passe par l'interruption 15h fonction 86, un qui détourne l'int 70h et un qui détourne l'int 1Ch, mais aucun des trois ne fonctionne.
J'ai pas de chance .
Tu n'aurais pas, au fond d'un tiroir, un CD d'installation de Win 98 par exemple ? Sans aucun problème, tu peux créer un multiboot XP/98 (même si XP est déjà installé).
Ca te permettrait au moins d'exécuter tes programmes DOS sans tous ces problèmes.
Dans un autre registre (haha), il existe de bons émulateurs de machines 8086 et autres. C'est peut-être aussi une piste pour toi ?
Désolé de penser à ce genre de solution mais je suis vraiment à court d'imagination . Google regorge d'allusions à la non-fonctionnalité des fonctions du BIOS de gestion de l'horloge système sur XP mais ne regorge pas de solutions miracles.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
T'es à cour d'imagination :
Eh bien pas moi
Je viens de trouver deux solutions, une avec le DOS et une avec le BIOS !
DOS : En partant de la question de début de ce topic, la fonction 2Ch donne l'heure système, avec DH pour les secondes... En partant de là, si on veut faire une attente de 4 secondes par exemple, voilà comment on procède : On execute l'int une fois pour avoir les secondes, ensuite on les met dans un registre temporaire, on additionne ce registre du nombre de secondes qu'on veut attendre, ensuite on fait une boucle qui appelle encore l'int et on teste les valeurs de dh (secondes) et du registre temporaire. Jusqu'à ce que DH atteigne la valeur du registre temp !
BIOS : La fonction 00h de l'int 1Ah du BIOS renvoie dans cx:dx le nombre de tops d'horloge depuis minuit, donc à partir de là on fait pareil que pour le DOS !
Voilà une solution qui me permet de faire une attente.
Je met le tag résolu mais je considère que ce n'est qu'à moitié résolu, car je ne peux toujours pas utiliser la fonction 86h de l'int 15h, donc si quelqu'un a d'autres propositions à faire, merci beaucoup !
Nico*3-3
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager