Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Unos Cuantos Cientos de Lineas

–Nunca subestimes el crecimiento de un código en Ensamblador–

Se dice que un día contrataron a un pintor para hacer la linea divisoria de los carriles de una autopista. El primer día pintó 4 kilómetros, el siguiente 2, luego solo 1 y así cada vez fue pintando menos hasta que solo pudo pintar algunos cuantos centímetros diarios. Cuando le preguntaron el porqué de su baja de desempeño, el trabajador contestó que era porque cada vez le quedaba mas lejos el bote de pintura.

Esta historia parece un chiste tonto, sin embargo esto es exactamente lo que les pasa a los programadores conforme los códigos crecen en tamaño y complejidad. Al principio, cuando el programa es pequeño y solo tiene ‘unos cuantos cientos de lineas (si, yo también me asusté al leer esta frase a mis quince años) es relativamente sencillo llevar mentalmente el control de las variables, funciones, etiquetas, llamadas al sistema operativo y todas esas cosas, pero cuando el programa crece hasta llegar a tener mas de 10 archivos de código con decenas de miles de instrucciones cada uno cada vez nos cuesta mas trabajo mantener en la mente todos los detalles del mismo.

Estos números pueden parecer exagerados, pero el propio código del FASM está compuesto por mas de 10 archivos source y solo uno de ellos, el que podría considerarse el nucleo tiene 6643 lineas. Esto tiene nombre, se le conoce como la ‘Ley de Lehman‘, la cual nos dice que cualquier cosa es mas dificil de controlar a medida que crece. Y esto es doblemente importante al programar en Ensamblador. Donde una simples suma de dos números necesita mas instrucciones para leer los operandos y mostrar el resultado que para hacer la propia suma.

Solo piensen que están en alguna parte de un código de mas de 6,000 lineas de Ensamblador y no recuerdan exactamente el orden de los parámetros de una función cuya código se encuentra a miles de lineas de donde están programando. Algunos editores de código tienen la capacidad de localizar cadenas de texto, pero cuando los usan los lleva a todos los puntos del código donde se llama a esa función. Cuando al fin localizan el punto exacto ya no recuerdan exactamente en que parte del código estaban trabajando cuando comenzaron a buscar. Problemas como estos pueden tardar varios minutos y es uno de los argumentos que los enemigos del Lenguaje Ensamblador suelen usar. Por eso pienso que usar un editor de texto tradicional no es suficiente para desarrollar un programa complejo en Ensamblador.

Ya se, antes de que comiencen a discutir, se que existen programas que ayudan con este tipo de análisis de source, pero esas herramientas son mas difíciles de usar que los propios editores. Además de que la mayor parte de las mejoras que tienen solo sirven para escribir un poco mas rápido. Cosa que no sirve de nada cuando no sabes que instrucciones debes de teclear. Además de que el solo hecho de crear documentación es mucho mas tardado que escribir el programa.

He pensado si sería posible hacer un editor de código que resuelva todos estos problemas, sobre todo porque bajo Windows hacer un editor de texto es relativamente sencillo si uno sabe que parámetros pasarle a la función CreateWindowEx de la API de WIN32. Este editor funcionaría como un editor de texto sencillo (un poco mas que el Notepad) pero permitiría controlar códigos muy grandes, tendría capacidad para reconocer el código conforme se escribe y ayudaría al programador a orientarse dentro de él. Ahora mismo se me ocurre una capacidad para que el editor salte a una cierta posición del texto con tan solo oprimir un botón. Esto parecería sencillo si lo vemos como un simple ‘ve a la linea tal’. Pero si tomamos en cuenta que conforme uno escribe un programa todo cambia de lugar…

La cosa es que funcione como esos juegos de estrategia en los que uno puede asignar una unidad o grupo de unidades a una tecla, de modo que puede seleccionarla y darle órdenes sin importar donde esté o que esté haciendo.

Una capacidad que sería muy util y que sería relativamente rápida de implementar sería un directorio de símbolos. Una tabla de referencias cruzadas creada en tiempo de edición. De modo que nos dijera por ejemplo donde está siendo declarada y usada una variable o los lugares donde es llamada una función. Y con un solo botón tener la capacidad de saltar a esa parte del código. Incluso tener capacidad de detectar en que lugares se usa un determinado tipo de instrucción como las de Entrada/Salida o SIMD.

Otra función, aunque esta si resultaría mucho mas complicada es poder ver el código en capas de abstracción en forma gráfica. Por ejemplo el nivel mas puro serían las instrucciones, pero conforme nos fuéramos abstrayendo el programa fuente se representara de forma similar a un diagrama de flujo y si nos abstraemos aún mas como un grafo o diagrama de bloques tridimensional. Por supuesto, todo generado automátigicamente por el editor conforme uno escribe código.

Lo interesante de un proyecto asi es que en realidad no afecta para nada al Ensamblador y solo sería cosa de cambiar algunos parámetros para que este sistema trabajara con cualquier tipo de lenguaje de programación que procesara archivos de texto como códigos fuente. Pero hay que empezar en pequeño. Por ahora bastaría con hacer un sencillo editor de texto capaz de leer, archivos. Luego veríamos como darle capacidad de proceso. El resto se daría solo conforme lo necesitáramos.

La única cuestión es como hacer para que este editor de texto ensamble y ejecute un programa con un solo botón. He escuchado sobre editores de código que pueden invocar a cualquier compilador. Puede que tenga algo que ver con la consola de Windows. (Si pinguinos linuxeros: ¡Windows también cuenta con un modo consola de 32 y 64 bits!) Pero por ahora es mejor que me siente a programar porque cualquier cosa que diga solo hará el programa mas dificil. Ya veremos mas adelante en que acaba este asunto.

Anuncios

mayo 4, 2009 - Posted by | Uncategorized | ,

2 comentarios »

  1. Interesante el tema, de hecho un dia pense en hacer un editor de assembly similar al IDA Dissasembler, para que le eches un vistazo:

    http://www.hex-rays.com/idapro/

    Es un desensamblador, pero cuando desensamblas puedes editar el codigo desensamblado,

    Me gusta como en los comentarios te dice el funcionamiento de cada funcion de la api de windows, o tambien te da el valor de la cadena ascii en el comentario. Te da un analisis de arbol del codigo bien chingon. Aparte que automaticamente te acomoda el codigo, Sin necesidad de macros le entiendes bien el codigo a pesar de que sea un codigo desensamblado.

    Comentario por blackpig | mayo 5, 2009 | Responder

    • IDA es un gran desensamblador, aunque la Ingeniería Inversa abarca también el humilde código fuente. ¿Cuantas veces no se han visto incapaces de entender y modificar un programa a pesar de tener el código fuente a su disposición? De hecho, si el IDA es capaz de detectar el uso de funciones de la API de Windows y operaciones de cadenas ASCII es gracias a la magia de los Aceptores (o Autómatas como dicen los lamers para asustar niños).
      Llevar el control de un programa es mucho mas dificil de lo que la gente cree. De hecho es mucho mas sencillo volver a hacer un programa desde el principio que tratar de localizar y reparar un error en un software mal programado.
      Usar un desensamblador sin saber nada de Ingeniería Inversa es como colorear un gas venenoso, solo te sirve para ver que es lo que va a matarte. Por eso hay que aprender de esta materia antes de meterse a desensamblar código de otras personas. Que como ya advertí, puede no ser legal dependiendo de las condiciones en el contrato de licencia.

      Comentario por asm86 | mayo 5, 2009 | Responder


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: