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étournement de l'interruption clavier 9h


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 50
    Points : 36
    Points
    36
    Par défaut Détournement de l'interruption clavier 9h
    Bonjour, voila j'ai un projet à faire en système.
    Je dois réaliser un programme Boot qui détourne l'interruption clavier 9h et affiche par exemple deux fois la lettre 'a' lorsque je presse la touche a.
    Après de nombreuses recherches, je bloque, je ne comprends pas ce qui cloche dans mon programme.
    Merci de bien vouloir m'aider.
    Le voici :
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Il y a quatre choses qui ne vont pas dans ton programme :

    1. Le bootloader est chargé en 0000:7c00h exactement et il faut prendre l'habitude de travailler avec cette notation, et pas céder à la tentation de placer le segment de code en 07c0h et l'offset à zéro et ceci justement pour éviter de se faire avoir sur des cas comme le tien : quand tu modifies le vecteur de l'interruption que tu veux intercepter, tu déposes CS, obtenue à l'exécution et l'offset de « MonClavier », calculée à la compilation. Quand tu mélanges les deux, tu finis par pointer sur « 0000:0022 », soit complètement en dehors de ton code. Utilise « org » en début de programme. Je te laisse volontairement choisir la bonne valeur à y mettre.
    2. Dans ta première ligne de code, tu charges AX avec 07c0h, mais tu ne l'utilises nulle part ;
    3. L'interruption 16h s'appuie elle-aussi sur l'interruption 09h pour savoir s'il y effectivement quelque chose à lire. Or, tu termines ta routine par un « IRET ». C'est correct et légal en soi, mais tu n'appelles plus la routine initiale. Le DOS ne peut donc plus savoir si une touche a été enfoncée ou non ;
    4. C'est toujours une très mauvaise idée d'appeler une interruption depuis une autre interruption. D'abord parce qu'on n'est pas sûr qu'elles soient ré-entrantes (à dire vrai, elles le sont rarement, sous DOS). Ensuite, parce que tous les micro-processeurs ne gèrent pas l'état d'interruption de la même façon. Sur Intel, on se contente de dépiler les flags avant de dépiler l'adresse de retour donc ça fonctionne quand même, mais certaines architectures considèrent que l'on n'est plus en état d'interruption passé l'équivalent d'IRET.


    Pour régler ce dernier point, il faut écrire un handler qui se contente de positionner un flag lorsque l'on entre dedans et qui saute ensuite vers la routine initiale qui, elle, effectuera un IRET. Et c'est dans ta boucle infinie que tu surveilleras l'état du flag et que tu afficheras les caractères si celui est non nul. Et bien sûr il ne faut pas oublier de le remettre à zéro après l'avoir fait.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Tout d'abord merci d'avoir répondu .
    - "org" je ne connaissais pas, j'ai compris qu'il permettait de faire un décalage, j'ai alors fait 7c00h-0022h et mis cette valeur à "org". Je ne sais pas si c'est correct, peut-être que je m'y prends mal?

    - j'ai demandé à mon prof et il m'a dit que le plus simple, pour afficher plusieurs fois une lettre, était de faire appel à l'interruption 9h plusieurs fois. Alors j'ai pensé à sauvegarder l'interruption 9h avant de la détourner et ensuite de faire appel à ma routine qui lancera l'interruption 9h plusieurs fois. Je pense que la sauvegarde est juste mais pour ma routine j'en suis moins sur.

    - le 4eme point, je n'ai pas trop compris. Je suis encore un amateur de l'asm

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    j'avais oublié de mettre le fichier, le voici
    Fichiers attachés Fichiers attachés

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    « ORG » signifie « Origine » et est une directive qui existe sur pour ainsi dire tous les assembleurs existants. Elle sert à indiquer au compilateur à quel endroit, en mémoire, ton code est censé être implanté, pour qu'il puisse calculer les bonnes adresses en conséquence. En son absence, ton compilo suppose que c'est 0000. Sur Intel, la majorité (mais pas la totalité) du code est fait pour être indépendant en mémoire.

    Donc « ORG 7c00h-0022h », ce n'est pas la bonne réponse. C'est plus simple. Je te laisse chercher en faisant preuve d'un tout petit peu de bon sens. :-)

    Sinon, ce n'est pas l'interruption 09h mais bien 10h qu'il faut appeler pour afficher un caractère et c'est bien ce que tu fais dans ton premier programme. Le problème n'est pas là : il vient du fait que déclencher une interruption lorsque l'on est déjà dans une interruption est une pratique très sale. À la place, dans le handler de l'interruption 09h que tu détournes pour être prévenu de l'appui sur une touche, il faut se contenter de mettre un flag à 1 et ressortir idéalement le plus vite possible. Ensuite, là où tu fais une boucle infinie ne faisant rien, tu fais une boucle qui surveille l'état de ce flag et qui lit le cas échéant le caractère en attente et l'affiche deux fois.

    Ensuite, dans ton second programme, c'est très bien d'avoir utilisé la fonction 35h de l'interruption 21h pour récupérer le vecteur de l'interruption à détourner. Malheureusement, c'est une fonction MS-DOS, pas BIOS, et tu ne pourras garantir qu'elle sera disponible au boot.

    Enfin, tu fais « Push ; Push ; Iret » dans ton handler pour rappeler l'ancienne routine. C'était une bonne idée aussi mais ce n'est pas ainsi qu'il faut procéder. D'abord parce qu'il te faudrait également empiler les flags pour que cela fonctionne, ensuite parce que l'on ne cherche pas à sortir de l'état d'interruption : on va passer la main au handler original qui, lui, se termine forcément par un IRET, qu'on ne pourra d'ailleurs pas modifier. Donc, il faut simplement faire un JMP long sur 32 bits vers l'ancien gestionnaire.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    merci pour les réponses détaillées , je vais voir ça

Discussions similaires

  1. [MFC] interruption clavier (KEYBOARD) [MFC]
    Par pi05 dans le forum MFC
    Réponses: 3
    Dernier message: 06/04/2005, 14h44
  2. Détournement d'une interruption
    Par Invité dans le forum Assembleur
    Réponses: 18
    Dernier message: 16/02/2005, 13h49
  3. Interruptions clavier - Ports 60h et 61h
    Par Paradam dans le forum x86 16-bits
    Réponses: 32
    Dernier message: 10/07/2003, 11h09
  4. Utiliser l'interruption clavier
    Par Ninkosen dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 28/03/2003, 01h01
  5. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33

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