|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Sinan CÉtudiant Inscription : mai 2012 Messages : 14 ![]() |
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 : |
|
00
|
|
|
#2 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Il y a quatre choses qui ne vont pas dans ton programme :
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. |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Sinan CÉtudiant Inscription : mai 2012 Messages : 14 ![]() |
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 |
|
00
|
|
|
#4 |
|
Invité régulier
![]() Sinan CÉtudiant Inscription : mai 2012 Messages : 14 ![]() |
j'avais oublié de mettre le fichier, le voici
|
|
00
|
|
|
#5 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
« 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. |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Sinan CÉtudiant Inscription : mai 2012 Messages : 14 ![]() |
merci pour les réponses détaillées
|
|
00
|
Copyright © 2000-2013 - www.developpez.com