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

x86 16-bits Assembleur Discussion :

Horloge Assembleur x86 Intel


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2023
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Horloge Assembleur x86 Intel
    Bonjour je dois créer une horloge en langage Assembleur x86 Intel (MASM). J'utilise Geany et Dosbox pour exécuter le fichier *.COM et je me retrouve un peu coincé. Déjà, mon programme n'affiche pas la bonne heure : il est bloqué à 12h00 et les minutes sont justes mais quand on atteint 60 secondes, elles ne passent pas et les secondes défilent normalement.

    Je vous avoue que je suis un peu arrivé au bout de mes compétences . Si vous aviez un peu de temps à prendre pour m'aider et me donner des pistes, je suis preneur.
    Voici mon code (merci d'avance pour vos réponses) :

    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
    ;--------------------------------------------------
    ; Programme affichage de l'heure en assembleur
    ;--------------------------------------------------
        TITLE DISPLAY HOUR - programme prototype
    ;--------------------------------------------------
        ASSUME CS:CSEG, DS:CSEG, ES:CSEG
    CSEG    SEGMENT
     
            ORG 100H
    ;*****programme principal
    MAIN:
    		; Lecture de l'heure du RTC
            MOV AH, 2
            INT 1AH
     
            ; Appel de la sous-fonction 2CH de l'interruption 21H pour obtenir l'heure
            MOV AH, 2CH
            INT 21H
     
            ; Affichage des heures (dizaine)
    		MOV AH, 0
            MOV AL, CH
            MOV BH, 10
            DIV BH
            ADD AL, 30H
            MOV DL, AL
            MOV AH, 02H
            INT 21H
     
            ; Affichage des heure (unités)
            MOV AL, AH
            ADD AL, 30H
            MOV DL, AL
            MOV AH, 02H
            INT 21H
     
            ; Affichage du séparateur ':'
            MOV DL, ':'
            MOV AH, 02H
            INT 21H
     
            ; Affichage des minutes (dizaines)
            MOV AH, 0
            MOV AL, CL
            MOV BH, 10
            DIV BH
            ADD AL, 30H
            MOV DL, AL
            MOV AH, 02H
            INT 21H
     
            ; Affichage des minutes (unités)
            MOV AL, AH
            ADD AL, 30H
            MOV DL, AL
            MOV AH, 02H
            INT 21H
     
            ; Affichage du séparateur ':'
            MOV DL, ':'
            MOV AH, 02H
            INT 21H
     
            ; Affichage des secondes (dizaines)
            MOV AH, 0
            MOV AL, DH
            MOV BH, 10
            DIV BH
            ADD AL, 30H
            MOV DL, AL
            MOV AH, 02H
            INT 21H
     
            ; Affichage des secondes (unités)
            MOV AL, AH
            ADD AL, 30H
            MOV DL, AL
            MOV AH, 02H
            INT 21H
     
            ; Affichage d'une nouvelle ligne
            MOV DL, 0AH
            MOV AH, 02H
            INT 21H
     
            ; Attente d'une seconde
    		MOV AH, 86H
    		MOV CX, 150
    		INT 15H
     
            ; Boucle infinie
            JMP MAIN
     
            ; Fin du programme
            MOV AH, 4CH
            INT 21H
     
    ;****************zone de données
     
    CSEG    ENDS
            END MAIN
    ;----------------------------------------fin de programme

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    août 2011
    Messages
    16 819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 16 819
    Points : 41 452
    Points
    41 452
    Par défaut
    Pour commencer, tu utilises une fonction BIOS puis la fonction DOS équivalente (en dehors du fait que la fonction BIOS retourne du BCD).

    n'utilises que la fonction DOS.

    Ensuite, une division 8 bits se fait avec le couple AH:AL, tu dois donc dans ton cas mettre AH à 0 avant la division.
    Tu dois aussi tenir compte

    Pour continuer, je créerais plutôt une chaine de caractères que j’afficherais une fois prête

    Pour la fonction ah=0x86 int0x15, tu l'utilises mal. Il faut utiliser le couple CX : DX pour exprimer le temps en micro-secondes, et tu ne vérifie pas l'état du flag carry sans parler de la granulité de 976 microsecondes.

    Au niveau de l'appel int 0x15, tu as déjà l'heure, que tu peux interroger de nouveau pour voir si tu as un décalage d'1 seconde avec la précédent mesure.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2023
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Need help
    Citation Envoyé par chrtophe Voir le message
    Pour commencer, tu utilises une fonction BIOS puis la fonction DOS équivalente (en dehors du fait que la fonction BIOS retourne du BCD).

    n'utilises que la fonction DOS.

    Ensuite, une division 8 bits se fait avec le couple AH:AL, tu dois donc dans ton cas mettre AH à 0 avant la division.
    Tu dois aussi tenir compte

    Pour continuer, je créerais plutôt une chaine de caractères que j’afficherais une fois prête

    Pour la fonction ah=0x86 int0x15, tu l'utilises mal. Il faut utiliser le couple CX : DX pour exprimer le temps en micro-secondes, et tu ne vérifie pas l'état du flag carry sans parler de la granulité de 976 microsecondes.

    Au niveau de l'appel int 0x15, tu as déjà l'heure, que tu peux interroger de nouveau pour voir si tu as un décalage d'1 seconde avec la précédent mesure.
    Bonjour, j'avoue que je suis aussi en difficulté sur le même principe que le sujet original et je ne comprend pas très bien comment régler le soucis (je suis vraiment pas bon en assembleur ...)
    Ce serait possible que quelqu'un me montre les modifications exact à faire sur son code pour réussir a avoir l'horloge correct qui s'actualise chaque seconde ?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    novembre 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : novembre 2022
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    bonjour,

    tu utilises le registre Ax pour stocker l'heure (dizaines dans Ah et unités dans al)
    tu utilise aussi ceregistre pour appeler la fonction 2 de l' int 21 ( 02h dans Ah)
    ligne 27 tu ecrases le nombre d'unités de l'heure par le numero de la fonction de DOS que tu appelles
    met un push Axavant d'afficher les unités et pop Ax aprés.

Discussions similaires

  1. Plugin assembleur x86 pour Eclipse
    Par donkeyquote dans le forum Eclipse
    Réponses: 3
    Dernier message: 12/11/2008, 11h50
  2. [Débutante] Analyser un code Assembleur x86 simple
    Par élodie69 dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 21/05/2008, 11h54
  3. integrer du code Assembleur (x86) dans python
    Par nephhh dans le forum Général Python
    Réponses: 2
    Dernier message: 11/02/2007, 11h50
  4. Conversion instructions assembleur X86 -> PPC
    Par bencall dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/09/2006, 22h02
  5. Conversion hexa-BCD en assembleur pour intel 8085
    Par stgi02 dans le forum Assembleur
    Réponses: 4
    Dernier message: 08/08/2006, 13h46

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