6
votes

Pourquoi mon programme MASM32 se bloque-t-il chaque fois que j'essaie d'utiliser des interruptions?

Voici le code:

.386 ;target for maximum compatibility
.model small,stdcall ;model
.code
    main:
        int 20h
    END main


0 commentaires

4 Réponses :


6
votes

Yep. Les interruptions de cette nature sont spécifiquement pour MS-DOS et, comme cela travaillait dans Windows ME et précédent, mais ne fonctionnera pas sur l'architecture NT, sauf sous l'émulateur DOS (Command.com). Je ne sais pas si cela navigue toujours avec Windows 7 - Je sais que les versions X64 de Windows ne l'ont pas par défaut.

Si vous écrivez des applications NT natives (vous devrez probablement le faire si vous ne savez pas ce que l'on est, mais si vous voulez savoir de jeter un coup d'œil à Mark Russinovich's Blog de MSDN) Voici une liste des interruptions NT et leurs fonctions correspondantes: http://www.ctyme.com/intr/rb -4249.htm

autre que cela, vous souhaitez appeler une fonction dans l'API Win32: http://msdn.microsoft.com/en-us/library/aa383749%28vs.85%29.aspx

Edit: et dans cet exemple de code, vous n'avez spécifié aucune option pour l'interruption, effectuée via les registres. Oh et vous pouvez le faire fonctionner à condition que vous assemblez pour DOS et non pour Windows. Si vous utilisez un lieur, vous créerez probablement une exécutable Windows PE. Cependant, si vous êtes sur des fenêtres de 64 bits, comme je l'ai dit, n'essayez pas.

Une chose que vous pouvez faire est d'installer un système de machine virtuelle telle que VirtualBox ou VMware, puis installez FreeDos. Il ne devrait pas prendre beaucoup de RAM du tout et vous laissera expérimenter avec l'assemblage / DOS librement.


1 commentaires

Merci neuffingers, je suppose que cela a du sens. Je vais certainement regarder dans un VM, c'est probablement une bonne idée! En outre, l'interruption que j'utilisais ne prend aucune option (je ne pense pas de toute façon), afin que cela ne soit pas un problème.



3
votes

En plus de @nineFingers Excellente réponse - Puis-je ajouter l'int 20h ne fonctionnera que pour des programmes de 16 bits. Et ne peut jamais être utilisé par une .exe

voir ici .


0 commentaires

3
votes

Vous devez faire attention aux interruptions de programmation. Si vous êtes dans quelque chose d'autre que RealMode (16 bits), vous ne pouvez généralement pas atteindre les interruptions au niveau de la CPU. Une table descripteur d'interruption doit être disponible pour l'indexation de la table des vecteurs d'interruption.

Le IVT est assis dans la bague 0, où vous avez un accès direct et sans entrave au matériel (CPU, vidéo, etc.) Toutes les applications seront exécutées dans la bague 3 (OS incluse). L'IDT contient des index à la VIV. Ceci est fait pour protéger votre matériel. Si vous souhaitez accéder aux interruptions du système d'exploitation, vous devrez vous assurer qu'ils sont disponibles sur votre source 32 bits.


0 commentaires

0
votes

moins de 32 bits, il existe un mode virtuel 86 et avec ce mode, il est possible d'utiliser les anciennes interruptions du logiciel RM à partir de DOS, car Windows imit beaucoup d'entre eux. Aussi, après si nous avons correctement installé un pilote de notre GrafikCard, il est possible d'utiliser certains des logiciels Int 10H interrompre, exemple pour obtenir le vésamodeliste d'un vésabios sur notre carte. Oui, c'est une émulation, mais il reçoit les vrais modénums et leurs paramètres d'environnement de notre carte, également si le passage à tous ces vesamodes est impossible sous Windows.

Une application DOS 16 bits peut également utiliser le format * .exe, mais il s'agit d'un format MZ, et non d'un format PE.

Dirk


0 commentaires