profundidad imagen entre diferencia cuál convertir color cambiar operating-system nasm osdev assembly

operating-system - imagen - profundidad de color 32 bits



Mezcla de código de 32 bit y 16 bit con nasm (4)

Esta es una pregunta de sistemas de bajo nivel.

Necesito mezclar código de 32 y 16 bits porque estoy tratando de regresar al modo real desde el modo protegido. Como un poco de información básica, mi código está haciendo esto justo después de arrancar GRUB, así que no tengo ningún sistema operativo molesto que me diga lo que puedo y no puedo hacer.

De todos modos, uso [BITS 32] y [BITS 16] con mi ensamblaje para decirle a Nasm qué tipos de operaciones debe usar, pero cuando pruebo mi código uso bochs parece que para algunas operaciones Bochs no está ejecutando el código que Escribí. Parece que el ensamblador se adhiere a los extras 0x66 y 0x67 que confunden Bochs.

Entonces, ¿cómo obtengo que Nasm ensamble código exitosamente donde mezclo código de 32 bit y 16 bit en el mismo archivo? ¿Hay algún tipo de truco?


¡No estabas bromeando sobre esto siendo de bajo nivel!

¿Has revisado los códigos de operación / operandos generados para asegurarte de que nasm respeta tus directivas BITS correctamente? También verifique que los objetivos de salto sean correctos, quizás Nasm esté utilizando las compensaciones incorrectas.

Si no es un error en Nasm, tal vez haya un error en Bochs. No puedo imaginar que la gente vuelva a cambiar al modo de 16 bits del modo de 32 bits muy a menudo.


Los 0x66 y 0x67 son códigos de operación que se utilizan para indicar que el siguiente código de operación debe interpretarse como una bitness no predeterminada. Más específicamente, (y según este enlace ),

"Cuando NASM está en modo BITS 16, las instrucciones que usan datos de 32 bits tienen como prefijo un byte 0x66, y las que se refieren a direcciones de 32 bits tienen un prefijo 0x67. En modo BITS 32, lo contrario es verdad: instrucciones de 32 bits no requieren prefijos, mientras que las instrucciones que usan datos de 16 bits necesitan un 0x66 y las que trabajan en direcciones de 16 bits necesitan un 0x67 ".

Esto sugiere que es culpa de Bochs.


Si está en modo real, su tamaño predeterminado es implícitamente 16 bits, por lo que debe usar el modo BITS 16. De esta forma, si necesita un tamaño de operando de 32 bits, agregue el prefijo 0x66, y para un tamaño de dirección de 32 bits agregue el prefijo 0x67.

Consulte la Guía del desarrollador de software Intel IA-32, Volumen 3, Capítulo 16 (CÓMO MEZCLAR EL CÓDIGO DE 16 BITS Y 32 BITS, el número de capítulo podría cambiar de acuerdo con la edición del libro):

El modo de dirección real, el modo virtual-8086 y el SMM son modos nativos de 16 bits.

La directiva BITS 32 solo confundirá al ensamblador si lo usa fuera del Modo protegido o Modo largo.


El problema resultó ser que no estaba configurando mis tablas de descriptores correctamente. Tenía un bit invertido incorrectamente así que en vez de ir al modo de 16 bits iba al modo de 32 bits (con segmentos que tenían un límite de un meg).

Gracias por las sugerencias!

Terry