Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Como Hacer un Archivo Binario a Mano

FASM no solo sirve para hacer programas

Una de las primeras cosas que un programador en ensamblador se pregunta es cual es la manera mas directa de escribir un archivo binario a mano. Y la manera mas sencilla es usar el editor del FASMW. Antes de entrar en detalles sobre como hacer esto voy a hablar del porqué un programador puede verse en la necesidad de crear un archivo binario a mano.

En mi caso personal, me vi en la necesidad de crear estos archivos tanto para crear las rutas o niveles del minijuego como los árboles de animación. Mas adelante ya no va a haber necesidad de hacer esto porque el editor de contenidos va a poder crear estos archivos directamente, pero por ahora necesito crear estos archivos a mano para probar el funcionamiento de las rutinas. El problema del huevo y la gallina para no alargarme demasiado. En general, la típica situación en la que alguien tiene la necesidad de crear archivos binarios en forma directa es para probar la funcionalidad de programas mas grandes, otro uso mas malévolo de esta técnica es la creación de los temibles Shellcodes, de los cuales no pienso hablar esta vez y los que saben lo que es un Shellcode saben bien porqué.

Lo interesante de usar el editor del Flatassembler (o su versión de linea de comando para los que no tienen Windows) para hacer binarios puros es que no solo se pueden guardar datos en hexadecimal. Sino que es posible guardar datos en punto flotante, strings ascii y unicode e incluso algunas instrucciones de ensamblador sin necesidad de todos los encabezados e información adicional que cargan los programas completos. Esto es perfecto para crear archivos que contengan estructras de datos demasiado complicadas para ser inicializadas en el programa y demasiado simple

Como hacer el archivo binario en FASM

Ya que saben los detalles escabrosos, solo copien lo escrito en la primera imagen en el editor del FASM y presionen CTRL + F9. El programa les solicitará un nombre para guardar el source. Pueden usar cualquiera sin importar la extensión. En el lugar donde se guardó van a aparecer dos archivos, uno es el source code que por default va a ser .ASM y otro con extensión .BIN. Ese archivo es nuestro archivo binario. En la segunda imagen se muestra el contenido del archivo .BIN en un editor hexadecimal. Ahora vamos a ver detenidamente lo que realmente hay dentro de ese archivo binario puro.

Los tres primeros bytes contienen los números del uno al tres. Los siguientes dos representan el valor de 16 bits 1234h, recuerden que el CPU de Intel es Little Endian y primero guarda el byte mas bajo en valores de mas de 8 bits. A partir del offset 5 se almacena el entero de 32 bits 1234ABCDh, en el offset 09 comienza el flotante de 32 bits 1.0 que en hexadecimal es 3F800000h. En el offset 0Dh comienza el flotante negativo de 80 bits -1 que en hexadecimal es BFFF8000000000000000h. En el offset 17h comienza la cadena de texto de valores de 16 bits ‘abcdef’ y justo después de esta la cadena ascii que dice ‘asm86mario’. Los últimos bytes son especialmente importantes y merecen ser detallados en el siguiente párrafo

Justo en la posición 2Dh del archivo binario se encuentra un 5 de 32 bits. Este 5 representa la posición dentro del archivo de otro dato que en este caso el la posición del entero de 32 bits. Esto es lo que los programadores de otros lenguajes llaman puntero y todo archivo binario debe de contar con estos campos para poder mantener una estructura controlable. Estos offsets o referencias a otros campos no tienen que medir a fuerza 32 bits, pueden reducirse para ocupar menos espacio o adecuarse al ancho de los registros para mejorar la velocidad. Por último y no menos importante el último byte del archivo es una instrucción NOP cuyo opcode es 90h. Esto es solo para demostrar que en estos archivos binarios es posible meter instrucciones de ensamblador dentro de estos archivos binarios puros.

Ya para termirar, me parece que llevo una eternidad en el proyecto del clon del Clash at Demonhead. Lo único que me tranquiliza es que todas las rutinas que he logrado implementar las voy a poder seguir usando en otros proyectos mas avanzados. Por ejemplo, hay un grupo interesado en que le ayude con la programación de un juego tipo Beat’em Up. Lo bueno es que todo lo que he programado hasta ahora va a poder ser implementado sin cambio alguno y solo va a ser cosa de revisar los algoritmos de física elemental para adaptar el juego. Pues ese género no responde a los procesos de contacto de sprites que la mayoría de los programadores conocen. Pero de eso hablaré cuando ya se tengan avances mas presentables. Por cierto, este fin de semana voy a asistir a un evento relacionado con el desarrollo de videojuegos a nivel local, no me atrevo a decir que nivel México porque en esto del internet ya no hay patrias, incluso hay quien llama xenofobia a lo que en otro tiempo se denominaba nacionalismo, lo único que se es que el evento va a ser en Monterrey, México. Ya les contaré como se puso en las próximas entradas.

Anuncios

marzo 25, 2011 - Posted by | Uncategorized | ,

4 comentarios »

  1. Waw que interesante deja ver hasta donde llego, gracias por el aporte

    Comentario por Roberto Carlos | abril 15, 2011 | Responder

  2. ¿Cómo puedo hacer un programa binario en Visual FoxPro 9 que se ejecute desde un ROM por Puerto USB sin que se tenga acceso directo al archivo explorando el Pendrive ROM creado por mí?

    Comentario por Andy Torrealba | diciembre 14, 2016 | Responder

    • No entiendo. ¿Quieres hacer un pendrive ROM con una memoria ROM conectada a un puerto USB? Si es lo que creo que entendí hay microcontroladores PIC que ya tienen habilitada la interfaz USB y para conectarlos a un puerto USB basta un pedazo de cable USB y algunos puntos de soldadura. Para que se ejecute automáticamente y no lo descubran puedes configurar el sistema de archivos para que muestre al OS información diferente a la real. He oido que hay discos duros apócrifos que hacen eso para aparentar que tienen más capacidad que la que realmente tienen. Investiga también como hacer un USB Bootable pero al final todo es cosa de cargar el drive con una “image” de todo el sistema de archivos.

      En cuanto a lo de Visual Fox Pro busca si tiene alguna función que cree archivos binarios para hacer la image y luego consigue un programa para cargar “imáges” de disco a la memoria que construiste. Aunque cargar la ‘image’ también funciona con una memoria USB comprada en cualquier parte.
      No puedo dar detalle de como hacerlo en Visual Fox Pro porque porque no contesto preguntas sobre lenguajes que no sean Ensamblador. Para lenguajes normies que se ponen de moda cada fin de semana puedes preguntarle mejor a otro personaje muy famoso cuyo avatar es un cocodrilito. Espero que la información que te di te sirva y la uses para el bien.

      Comentario por asm86 | diciembre 18, 2016 | Responder

      • Saludos.
        Gracias por la respuesta y sí es un proyecto que quiero hacer de fabricar un pendrive con microprocesador ROM, PROM, EEPROM, etc. “qué me recomendarías si sabes de electrónica”; el detalles que si se puede hacer para usarlo como llave electrónica conectándose al Puerto USB porque quiero que el sistema se instale desde esa memoria y que cuando se quiera entrar al sistema posteriormente en lo futuro, obligatoriamente debe conectar el dispositivo pero que no se instale porque ya fue instalado anteriormente y cuando quieran ver el contenido del dispositivo no les de acceso; algo que le restringa el acceso de ver los archivos y puedan copiarlos o borrarlos, si le roban el dispositivo tendrán que pagarme por otra llave y el que lo robó no podrá usarlo porque le haría exclusividad por cada cliente que eso es con Visual FoxPro. No soy un experto en electrónica pero me gusta aprender.

        Comentario por Andy Torrealba | diciembre 19, 2016


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: