Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/05/2012, 12h11   #1
jayce23
Invité régulier
 
Homme Sinan C
Étudiant
Inscription : mai 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme Sinan C
Localisation : Belgique

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

Informations forums :
Inscription : mai 2012
Messages : 14
Points : 6
Points : 6
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
Type de fichier : asm bootsect.asm (1,3 Ko, 10 affichages)
jayce23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2012, 19h38   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Chercheur d'emploi
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2012, 12h04   #3
jayce23
Invité régulier
 
Homme Sinan C
Étudiant
Inscription : mai 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme Sinan C
Localisation : Belgique

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

Informations forums :
Inscription : mai 2012
Messages : 14
Points : 6
Points : 6
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
jayce23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2012, 12h05   #4
jayce23
Invité régulier
 
Homme Sinan C
Étudiant
Inscription : mai 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme Sinan C
Localisation : Belgique

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

Informations forums :
Inscription : mai 2012
Messages : 14
Points : 6
Points : 6
j'avais oublié de mettre le fichier, le voici
Fichiers attachés
Type de fichier : asm bootsect.asm (1,8 Ko, 5 affichages)
jayce23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2012, 20h29   #5
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Chercheur d'emploi
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
« 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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2012, 23h38   #6
jayce23
Invité régulier
 
Homme Sinan C
Étudiant
Inscription : mai 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme Sinan C
Localisation : Belgique

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

Informations forums :
Inscription : mai 2012
Messages : 14
Points : 6
Points : 6
merci pour les réponses détaillées , je vais voir ça
jayce23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h53.


 
 
 
 
Partenaires

Hébergement Web