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 :

Déroutement de l'int 1Ch


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Déroutement de l'int 1Ch
    Bonjour à tous

    Voilà, je travaille sur TASM, j'utilise une architecture x86 16 bits ; dernièrement je cherche un moyen de dérouter correctement l’interruption 1Ch pour afficher un message, par exemple. Je veux dire par là que toutes mes tentatives étaient vaines ainsi que toute mes recherches, et voilà mon code
    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
     
    DATA SEGMENT
     
     
       message_main db "programme principale en cours$",10,13
       message_rout db "oh la 1ch$"
     
    DATA ENDS
     
    pile SEGMENT stack
    DW 256 dup(?)
    TOS label word
     
    pile ENDS
     
      CODE SEGMENT  
    ASSUME ds:DATA
     
     
     
    notre_int: mov bx,data
               mov ds,bx
               mov ah,9h
               mov dx,offset message_rout
               int 21h       
     
               iret
     
    derout proc near
         mov al,1ch
         mov ah,25h
         mov bx,seg notre_int
         mov ds,bx
         mov dx,offset notre_int
         int 21h
     
        ret
    derout endp    
     
    mess proc near
               mov bx,data
               mov ds,bx
               mov ah,9h
               mov dx,offset message_main
               int 21h        
    mess endp
     
    ASSUME cs:CODE,ds:DATA,ss:pile,es:DATA
     
    start:
         MOV AX, data
         MOV DS, AX
         MOV AX, pile
         MOV SS, AX
         MOV SP, offset TOS
     
     
     
     
     
     
     
     
     
    call derout
     
     
             mov cx,0ffffh
    bouc_ext:mov si,0ffffh 
     
             call mess  
    bouc_int:dec si    
             jnz bouc_int
             loop bouc_ext
     
     
     
     
     
     
     
        mov ax, 4c00h 
        int 21h 
     
    CODE ends
     
    end START
    Le programme affiche bien " programme principale en cours " mais n'affiche pas " oh la 1ch"

    Je ne vous demande pas une solution définitive mais un peu d'aide, d'indication ne serait pas de refus, merci infiniment.

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    Pourquoi le programme afficherait-il " oh la 1c " ?

    ( l'interruption 1Ch n'est pas appelée dans la boucle )

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 435
    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 : 17 435
    Points : 43 070
    Points
    43 070
    Par défaut
    ah les vieux souvenirs .....

    La méthode n'est pas bonne. L'interruption 0x1c ( ou 1ch si vous préférez ) est une interruption BIOS. On ne peut pas la dérouter comme ça sans risquer le crash. Il faut récuperer l'ancien vecteur d'interruption ( ah=35 int 21h de mémoire : à vérifier ) avant de changer celle-ci. Ta routine de remplacement devra alors exécuter le code d'origine ( appel FAR sur le pointeur récupéré, attention à la pile car la fonction d'origine finira par un iret alors que l'appel fait par un call far ne sauvegarde pas les flags ) avant ou après ton propre code. Ton code ne supprimera donc pas la routine d'origine mais y ajoutera une surcouche. C'est comme cela que fonctionnait les programmes TSR sous DOS. Par aillleurs, avant la sortie de ton code, il te faudra remettre l'interruption d'origine.
    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

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    c mon programme ..... ce que j veux que après l’exécution d'int 1Ch et l'affichage de "oh !! la 1CH" pendant toutes les secondes de cette procedure on retourne au programme principale .... le délai entre deux messages consecutifs du programme principale est fixé par 2 boucles imbriquées ... mais l'hors d'execution de mon programme le message "oh !! la 1CH " s'affiche infiniment sans retour au programme principal tp3.asm

  5. #5
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Je déconseille l'utilisation d'interruptions dans une interruption (ici int 21h) mais bon... ça doit pouvoir fonctionner...
    Par contre, tu ne sauvegarde pas les registres au début et ne les restaure pas à la fin de ta nouvelle int

  6. #6
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par yasmine mimina
    ... mais l'hors d'execution de mon programme le message "oh !! la 1CH " s'affiche infiniment sans retour au programme principal
    L'interruption 1Ch est déclenchée par une interruption matérielle (INT 08h) toute les 55 milli-secondes (soit environ 18 fois par seconde).

    Si le temps d'exécution total de l'int 1Ch dépasse cette durée, l'interruption matérielle suivante est déja là au moment du IRET et ca repart immédiatement pour un tour de plus avec l'int 1Ch sans laisser aucune chance au programme principal de prendre la main.

    Toutes les bonnes doc sur les interruptions préconisent de faire aussi court que possible avec les routines d'interruption 08h et 1Ch.

    Dans le cas présent la routine 1Ch appelle l'int 21h pour un affichage écran pouvant demander du temps surtout s'il induit un scrolling, ce qui ne manquera pas d'arriver vue la cadence à laquelle les messages sont affichés (18 par secondes).

  7. #7
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Je me répète, mais une interruption doit laisser les registres dans leur état initial.
    Il faut qu'elle passe incognito

Discussions similaires

  1. [.COM] Réserver de la RAM fct 48h int 21h
    Par bulerias dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 06/12/2010, 14h33
  2. [8086] Int 1ch
    Par lylia SI dans le forum x86 16-bits
    Réponses: 6
    Dernier message: 05/03/2007, 10h27
  3. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37
  4. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07
  5. Les INT en mode protégé
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 8
    Dernier message: 05/12/2002, 16h13

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