Activa las notificaciones para estar al tanto de lo más nuevo en tecnología.

Uno de los ganadores del concurso de código en C ofuscado

El IOCCC (The International Obfuscated C Code Contest), es un concurso de software por demás peculiar. Lo que se busca es confundir, volver más oscuro,...

adriancable00

El IOCCC (The International Obfuscated C Code Contest), es un concurso de software por demás peculiar. Lo que se busca es confundir, volver más oscuro, el código fuente, de ahí la palabra “obfuscated”. La realidad es que esta organización intenta que los programadores: i. escriban el código más oscuro en C dentro de las reglas; ii. la idea es mostrar la importancia del estilo en programación (de manera irónica); iii. poner a prueba a los compiladores de C con código inusual; iv. Ilustrar las sutilezas del lenguaje C y v. proveer un foro seguro para código pobremente escrito en C.

Esta curiosa organización acaba de presentar a los ganadores de su concurso número 22. Hay muchas ideas interesantes, las cuales pueden verse aquí . Sin embargo, a mí me llamó la atención el siguiente proyecto de Adrian Cable: “Largest small system emulator”, el cual es un emulador de una computadora 8086. Vamos, una máquina virtual de PC. Puede correr DOS, Windows 3.0, Excel, MS Flight Simulator, AutoCAD, Lotus 1-2-3…

Lo sorprendente es que el código en C solamente tiene 4043 bytes (la mitad de 8086 curiosamente). Implementa la mayoría del hardware de la PC de los años ochenta usando menos bits que el total de transistores necesarios para crear el procesador 8086. Así entonces, en 4043 bytes de código en C se tiene un emulador de una PC de IBM (1980) consistente de:

  • Intel 8086/186 CPU
  • 1MB RAM
  • 8072A 3.5″ floppy disk controller (1.44MB/720KB)
  • Fixed disk controller (supports a single hard drive up to 528MB)
  • Hercules graphics card with 720×348 2-color graphics (64KB video RAM), and CGA 80×25 16-color text mode support
  • 8253 programmable interval timer (PIT)
  • 8259 programmable interrupt controller (PIC)
  • 8042 keyboard controller with 83-key XT-style keyboard
  • MC146818 real-time clock
  • PC speaker

El emulador usa la biblioteca gráfica SDL por portabilidad y compila en Windows, Mac OS X, Linux y probablemente en la mayoría de otros compiladores de 32/64 bits.

Pero ¿por qué este proyecto entra en la categoría de oscuro/ofuscado? Primero de todo, el 8086 es un procesador de pesadilla (para ser emulado). Las instrucciones son complejas e irregulares en tamaño y estructura, con múltiples modos de direccionamiento y además, sin un lugar consistente para la memoria de los operandos, donde frecuentemente hay múltiples formas de codificación para la misma instrucción. Igualmente, el uso del modelo bizarro segmento:offset lo hace complejo en lo que se refiere a modelar la memoria. Además, el 8086 tiene un número de bugs (PUSH SP), comportamientos no documentados y características arcaicas (banderas auxiliares y de paridad), lo cual incluso, había que emular.

El autor modeló cada característica del procesador con la excepción de la bandera TRAP, que no se usa en software, a excepción de los depuradores. Además, se emulan los periféricos estándar de la PC. El haber logrado poner en 4043 bytes el código es parte de las reglas, pues éste no debe pasar de 4096 bytes. Lograr 4043 bytes requirió mucho esfuerzo (y casi el divorcio, dice el autor).

adriancable01

Se soporta prácticamente el software para la PC original. El autor ha probado MS-DOS 6.22, FreeDOS 0.82pl3, Windows 3.0, DESQview 2.8, Lotus 1-2-3 2.4 e AsEasyAs 5.7 for DOS, Excel 2.1 for Windows, AutoCAD 2.5, WordStar 4, QBASIC, GWBASIC, Turbo C++, Carrier Command, Police Quest, y mjuchos prohgramas de juegos freeware), así como herramientas de diagnóstico como Manifest, Microsoft MSD, InfoSpot, CheckIt. Todas funcionaron correctamente.

Si se quiere compilar el código fuente, el autor advierte que habrá muchos “warnings” (advertencias), producidas por el lenguaje C: Missing type specifiers, control reaching the end of functions without returning values, incompatible pointer type assignments,  precedence warnings, lo cual fue necesario para mantener chico el código. Otros compiladores producirán errores similares.

Comentarios