Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Revolución de 32 Bits

–Y la Lenta Muerte de los Sistemas de 16 Bits–

Quienes han entrado a la Red Social de Programadores de Ensamblador de seguro han leido los escritos de b1ackpig sobre el formato PE. Para quienes no sepan de que hablo, PE o Portable Executable es el formato de los programas de aplicación del Windows. En esos documentos se hace referencia a un importante evento histórico ocurrido en la década de los noventas: “La Transición del DOS al Windows”. Aunque detrás de todo esto se hallaba la verdadera transición de la programación de 16 a 32 bits. Veamos primero un poco de historia…

PC antiguo

Desde que Intel inventó el procesador 8086 e IBM lo adoptara para construir su famosa IBM-PC, la tecnología de los 16 bits era el estandar de las computadoras de sobremesa, en esos tiempos los sistemas de 8 bits eran poco menos que consolas de videojuegos y los de 32 bits solo podían hallarse en costosas computadoras dedicadas a la investigación. Sin embargo, todo cambió alrededor de 1985 cuando Intel desarrolló el procesador 80386. Esta paqueña maravilla era capaz de hacer todo lo que en su tiempo solo podían hacer las grandes computadoras de los centros de investigación. Sin embargo, dado que era un procesador muy avanzado no había una plataforma de hardware que lo aprovechara a su pleno potencial y de haberse construido hubiera sido sumamente costosa. Como muestra, la primera computadora de escritorio equipada con este CPU llegó a costar ¡10,000 DOLARES!

Debido a esto, no fue sino hasta los últimos años de la década de los ochentas que las computadoras para civiles con CPU’s de 32 bits llegaron al mercado de masas. Sin embargo, al igual que el 286 que bien podría considerarse un mal prototipo del 386 (modo protegido de 24 bits, registros de 16 y problemas de compatibilidad hacia atrás), estas poderosas computadoras de 32 bits seguían siendo programadas como el viejo 8086. Mas adelante, con la llegada del 486 de Intel comenzaron a verse algunos sistemas que rebasaban el megabyte en RAM. Y entonces fue cuando realmente comenzó la guerra por la optimización.

Si ustedes tienen o superan los treinta, de seguro recordarán una época en que había juegos(sobre todo de Lucasarts) cuyo ejecutable media alrededor de 500 kbytes y que al tratar de correrlos en una 486 con 4 megabytes en RAM, aparecía un mensaje que decía “NOT ENOUGH MEMORY”. ¿Como era posible que una PC recien iniciada con 4 mbytes en RAM no pudiera correr un pinchurriento jueguito que no medía mas de medio mega? La razón de esto era porque estos programas estaban hechos para correr en Modo Real.

Modo Real

Este era el modo de operación por defecto del antiguo CPU 8086. En el se tenían registros de 16 bits, se usaban 20 bits para manejar la memoria. Con 20 bits es posible tener control sobre apenas un megabyte en RAM que son aproximadamente 1,048,576 bytes (100000h en hexadecimal). De estos pocos mas del millón de bytes, solo 640kbytes estaban a disposición de los programas. El resto pertenecía a la memoria de video, llamadas al sistema operativo, vectores de interrupción y hasta unos ROMS fosilizados que estaban ahí desde los tiempos del CP/M (el antepasado no reconocido del DOS). Además, de esos 640 kbytes, ya algunos estaban ocupados por servicios del sistema operativo. De hecho, y nada mas para insultar, este es el ensamblador que aún en este siglo XXI se imparte en buena parte de las carreras universitarias de Ingeniería en Computacion. La pregunta era: ¿Donde estaban los programadores capaces de entrar al Modo Protegido?

En realidad ya existían programas de 32 bits para computadoras personales desde fines de los años ochenta para computadoras basadas en CPU’s 386 o superiores. Un ejemplo era el no tan famoso sistema operativo OS/2 de IBM del cual se dice Bill Gates robó todo lo que no pudo encontrar en la GUI de las computadoras de Apple. La razón por la que el OS/2 no tuvo el éxito esperado era porque no tenía suficiente compatibilidad hacia atrás con el software existente de 16 bits que corría en la inmensa mayoría de las computadoras personales con DOS y las primeras versiones del Windows de 16 bits.

Primeros juegos de 32 bits para PC

Ya entrados los noventas, cuando el estandar eran las PC con CPU 486, DOS y Windows 3.1 ocurrió un fenómeno muy interesante: ¡Aparecieron juegos que rompieron la barrera del mega en memoria! La razón era sencilla. Los programadores habían descubierto la manera de entrar al Modo Protegido desde el DOS. Con esto tenían acceso a toda la memoria del sistema y a los registros de 32 bits. Los mas experimentados entraban por ellos mismos pero también había algo llamado DPMI (Dos Protected Memory Interface) que permitía tener acceso al direccionamiento de memoria de 32 bits desde una “sencilla” aplicación en DOS. Lo de sencilla lo pongo entre comillas porque no era nada facil de hacer. Y como han de imaginarse, los primeros que abandonaron el primer Megabyte de RAM fueron precisamente los que sabían programar en Lenguaje Ensamblador.

Mas adelante apareció un compilador que no solo trabajaba en 32 bits. ¡Sino que además era de uso libre! Llamado DJGPP. Gracias a este compilador y a DPMI’s como el famoso DOS4GW surgieron las grandes leyendas de los juegos de PC de mediados de la década de los noventas. Aunque aún era necesario saber algo de Ensamblador para acelerar algunas rutinas gráficas y mantener la memoria bajo control. De hecho, esta pantalla de advertencia era la que nos decía que el juego a cuyo ícono habíamos hecho doble click iba a ser genial:

dos4gw

Y esta era fue precisamente la que nos tocó a mis amigos y a mi. Los tiempos de las primeras computadoras con un CPU Pentium con FPU integrada, las primeras versiones del Windows 95, las conexiones telefónicas a Internet facturadas por hora y la fiebre de los First Person Shooters. Poco antes de que el Software Libre se pusiera de moda y la única manera de hacer trabajar una PC armada con componentes chinos era instalando copias piratas del Windows que circulaban en cajas de Floppies de 3.5 pulgadas. Y la herramienta mas avanzada de desarrollo de software era el Borland Turbo C++ 3.0 (cuya licencia costaba 500 dólares mas impuestos en tiendas especializadas de informática). En ese entonces intentamos hacer juegos programados en C/C++; pero pronto llegamos al límite del compilador, pues al ser un compilador de 16 bits para DOS no nos permitía manejar mas de un megabyte de memoria ni era facil escribir a la memoria de video. A la fecha no se me olvida lo complicado que era hacer un frame buffer usando las funciones de memoria malloc( ) y free ( ). O new( ) y delete ( ) en C++ o modificar la tabla de los vectores de interrupción para el teclado y el reloj interno del sistema sin que el sistema completo se hiciera porquería. Por estas razones, pero sobre todo por la de manejar una mayor cantidad de memoria es que se decidió que había que programar en ensamblador.

Al principio hacíamos programas en C y compilábamos por separado rutinas de Ensamblador que era posible llamar desde C cual si se tratara de funciones de la biblioteca estandar; al principio esto funcionó bastante bien pues teníamos la “facilidad” de programar en C/C++ combinada con la velocidad y control de las rutinas de Ensamblador. Hasta que notamos que los códigos fuente lo único que conservaban de lenguaje C era solo el main( ) y las { }. ¡Todo lo demás eran puras llamadas a rutinas hechas en Ensamblador! Así que decidimos que era el momento de quitarle las ruedas de entrenamiento a las bicicletas y programar todo en Ensamblador de una vez por todas. ¡Los resultados fueron sorprendentes! Pues programas completos que medían alrededor de 200 kilobytes en C, en ensamblador no ocupaban ni la centésima parte de eso y los errores de desbordamiento y tipo de datos eran rarísimos. En ese entonces trabajábamos con la misma copia pirata del Borland Turbo Assembler que aún circula en muchas universidades de países de centro y sudamérica. Y como ya han de imaginarse, este ensamblador aunque ya podía trabajar en 32 bits no estaba preparado para los grandes avances que se veían venir como por ejemplo la tecnología de Intel MMX. Y aunque es posible programar en ceros y unos (y llegamos a hacerlo) esto era demasiado tardado. Por lo que nuestro siguiente gran reto fue programar nuestro propio compilador de Ensamblador.

Sin embargo, durante la extensa investigación sobre como hacer un compilador propio (y verdadera investigación, no las jaladas sobre “teoría de autómatas” que tanto han desprestigiado las universidades chafas) el buen b1ackpig dio con un interesante descubrimiento: el FASM.

fasmscreen

El FASM o Flat Assembler es el mejor compilador de ensamblador que he encontrado y es el que he estado usando hasta el día de hoy. Pues tiene casi todo lo que un programador puede necesitar: (Es libre, posee muchas herramientas, casi no consume recursos, se actualiza muy rápido y tiene muy buena documentación) Hablar de las maravillas del FASM merece su propia entrada en este blog. Sin mencionar que el paquete incluía su propio código fuente en Ensamblador. Yo personalmente aprendí mucho leyendolo. En fin, en esa segunda mitad de la década de los noventas, b1ackpig, el Julio y yo teníamos a la computadora lo suficientemente dominada para programar un verdadero juego de video. Solo faltaba un poco de Programación Gráfica, que en nuestro caso se resumía a simple álgebra lineal y geometría diferencial de libro de texto para hacer verdaderos juegos 3D.

Pero a finales de la década de los noventa ocurrieron unos cambios radicales en el mundo de la computación que nos metieron en serias dificultades; eso mas unos serios errores tácticos que cometí relacionado con la programación gráfica en Windows que retrasaron nuestras investigaciones por años. Eso sin contar que por ese tiempo fue cuando me expulsaron de la universidad. Pero eso es una historia que será contada en la siguiente entrada de este blog.

Anuncios

noviembre 28, 2009 - Posted by | Uncategorized | , , ,

Aún no hay comentarios.

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: