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

Assembleur Discussion :

[NASM] Redirection de l'interruption 09h


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut [NASM] Redirection de l'interruption 09h
    Bonjour à tous ! voila, le cherche à capturer les événements clavier et j'ai pensé rediriger le vecteur de l'interruption 9h, mais je ne sais pas du tout comment il faut faire ! la seule chose que je sais, c'est qu'il faut multiplier par 4 la valeur de l'interruption pour connaitre la position du vecteur dans la table. Pouvez vous m'aider ?
    Merci à tous les gars et les filles qui m'ont déja filé un bon coup de main et vive l'asm.

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    salut,

    premièrement, tu pourras le faire que sous dos (c'est à dire en mode réel), ça ne fonctionne pas sous windows

    deuxièmement, les explications :
    le processeur doit savoir à quelle adresse pointer quand il trouve comme commande "int 0xxh". Pour cela, il existe ce qu'on appelle l'IDT (interrupt descriptor table). En mode réel, cette IDT commence à l'adresse 0000:0000h. toujours en mode réel, tu as besoin d'un word pour le segment et d'un word pour l'offset donc il faut en tout 4 bytes (ou 1 dword) par adresse. Sachant tout cela, et sachant que les interruptions sont classées normalement, tu trouveras l'adresse de l'interruption 00h à l'adresse 0000h:0000h, l'int 01h--> 0000:0000h+1*4h et ainsi de suite, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int 0xxh --> 0000h:0000h+0xxh*4
    Voilà pour l'IDT

    Troisièmement, tu travailles avec une interruption matérielle, c'est à dire que l'interruption est provoquée normalement par le matériel et non par l'utilisateur, il faut donc prendre une précaution : désactiver ces interruptions avec l'instruction CLI avant tout !!! De plus, à la fin de ta subroutine, il faut prévenir le contrôleur d'interruptions matérielles que la voie est maintenant libre en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov al,20h
    out 20h,al
    sti
    Et en faisant au début de ton routine un CLI aussi !!!


    Donc finalement, pour résumer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CLI
    sauvegarde du dword situé à l'adresse 0000h:0024h
    mettre en 0000h:0024h l'adresse (segment+offset) de ta nouvelle routine
    STI
    pour restaurer l'interruption, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CLI
    mettre en 0000h:0024h l'adresse sauvegardée
    STI
    Sans oublier de faire un out 20h,20h à la fin de ta routine

    Bon amusement [/code]
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut merci!
    Salut, c'est sympa de me donner une explication aussi détaillé, j'etais en train d'essayer ça avec l'interruption 10h pour faire mes tests et ça plantait toujours, je vais revoir tout ça avec ton explication! Et merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/12/2011, 10h42
  2. [NASM/Linux 32b] Interruption BIOS sous linux.
    Par geek-59600 dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 02/04/2011, 13h45
  3. Réponses: 0
    Dernier message: 01/05/2009, 18h18
  4. [NASM] Problème avec l'appel des interruptions
    Par homeostasie dans le forum Assembleur
    Réponses: 3
    Dernier message: 23/01/2007, 16h50
  5. Réponses: 14
    Dernier message: 14/12/2004, 14h45

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