2010-03-01 12 views
6

Aquí está el código:¿Por qué mi programa masm32 se cuelga cada vez que intento usar interrupciones?

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

Resultado: http://img705.imageshack.us/img705/3738/resultom.png

"test.exe ha dejado de funcionar" - siempre tiene la razón cuando llega a la interrupción.

This is the interrupt I'm trying to use. Simplemente debería salir del programa. Otros que he intentado incluyen entrada/salida de caracteres, etc. Nada funciona.

Estoy en Windows 7, usando masm32 con WinAsm IDE.

Hay tantas cosas interesantes que parece que debería poder hacer con las interrupciones ... sin embargo, se bloquea cada vez que trato de usar una interrupción, siempre de la misma manera.

Esto parece estar relacionado y posiblemente útil: DOS Interrupt in masm x86 assembly crashing

... pero realmente no he sido capaz de descifrar nada de ella.

¿Alguna sugerencia?

Respuesta

5

Sí. Las interrupciones de esta naturaleza son específicamente para MS-DOS y, como tal, funcionaron en Windows ME y en versiones anteriores, pero no funcionarán en la arquitectura de NT, excepto en el emulador de DOS (command.com). No tengo idea si esto todavía se incluye con Windows 7: sé que las versiones x64 de Windows no lo tienen de manera predeterminada.

Si está escribiendo Native NT Apps (es poco probable que lo haga si no sabe cuál es, pero si desea conocer el blog de Mark Russinovich en MSDN) aquí hay una lista de interrupciones NT y sus correspondientes funciones: http://www.ctyme.com/intr/rb-4249.htm

Aparte de eso, que desea llamar a una función en la API Win32: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

Editar: y en ese ejemplo de código, no se ha especificado ninguna opción para la interrupción, hecha a través de los registros. Ah, y podrías hacerlo funcionar siempre que lo ensambles para DOS y no para Windows. Si usa un Enlazador, es probable que esté creando un ejecutable de Windows PE. Sin embargo, si está en Windows de 64 bits, como ya he dicho, no intente.

Una cosa que podría hacer es instalar un sistema de máquina virtual como VirtualBox o VMware y luego instalar FreeDOS. No debería ocupar mucha RAM en absoluto y le permitirá experimentar libremente con el ensamblaje/dos.

+0

Gracias Ninefingers, supongo que tiene sentido. Definitivamente investigaré una máquina virtual, ¡es probable que sea una buena idea! Además, la interrupción que estaba usando no toma ninguna opción (no lo creo de todos modos), así que eso no sería un problema. – Cam

2

Además de @ninefingers excelente respuesta - puedo agregar que int 20H solo funcionará para programas de 16 bits. Y nunca puede ser utilizado por un .exe

Ver here.

2

Tiene que tener cuidado con las interrupciones de programación. Si se encuentra en un modo que no sea RealMode (16 bits), normalmente no puede alcanzar las interrupciones en el nivel de la CPU. Debe haber disponible una tabla de descriptores de interrupción para indexar la tabla de vectores de interrupción.

El IVT se encuentra en el Anillo 0, donde tiene acceso directo y sin obstáculos al hardware (CPU, Video, etc.) Todas las aplicaciones se ejecutarán en el Anillo 3 (incluido OS). IDT contiene índices para el IVT. Esto se hace para proteger su hardware. Si desea acceder a las interrupciones desde el sistema operativo, deberá asegurarse de que estén disponibles para su fuente de 32 bits.

0

Menos de 32 bits Windows tiene un modo virtual 86 y con este modo es posible usar las antiguas interrupciones de software RM desde DOS, porque Windows emula muchas de ellas. También después de haber instalado correctamente un controlador para nuestra grafikcard, es posible utilizar algunos de los intupts de software int 10h, por ejemplo para obtener la vesamodelist de un vesabios en nuestra tarjeta. Sí, es una emulación, pero obtiene los números reales y sus parámetros de entorno de nuestra tarjeta, también si el cambio a todos esos vesamodes es imposible bajo Windows.

Una aplicación de DOS de 16 bits también puede usar el formato * .exe, pero este es un formato MZ, no un formato PE.

Dirk

Cuestiones relacionadas