Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Piel Transparente

–Como hacer un programa facil de depurar–

Hace no mucho tiempo, científicos japoneses de la universidad de Hiroshima desarrollaron una rana con piel transparente. De modo que uno puede ver el funcionamiento de sus órganos en vivo y en directo sin necesidad de diseccionarla. Pueden ver el video aqui.

¿Y que tiene que ver una rana con piel transparente con el Ensamblador? Bueno, la verdad es que llevo años como programador y he leído muchos libros que dicen como se supone que se debe de programar. El problema es que todos esos libros se escribieron en una época en la que los programadores no contaban con una computadora en su casa. Pues todos dicen que uno debe de hacer una serie de pruebas exhaustivas antes de la compilación. Pero en mi experiencia personal, esto es demasiado tardado y no sirve para investigar nuevos algoritmos. Mas bien soy de la idea de que uno debe de construir un programa de tal forma que el mismo nos ayude a localizar los errores. Exactamente del mismo modo que lo hace la rana transparente. Imaginense que los programas que hacen fueran transparentes y pudieramos detectar los errores con solo verlos ejecutarse.

Si bien la rana de piel transparente es un gran avance de la genética, hacer esto mismo con un programa de computadora no requiere demasiado esfuerzo. De hecho, se requieren muchos menos recursos para hacer un programa que se autorevise solo que usar programas exernos para buscar errores. Y si esto suena demasiado complejo veamos algo de historia:

Si ustedes rondan los 30 años y son nerds, de seguro recuerdan el siguiente código: arriba, arriba, abajo, abajo, izquierda, derecha, izquierda, derecha, B, A, START. Este código se introducía en las pantallas de presentación de los juegos de la compañia Konami (Contra, Life Force, etc.) y uno podía obtener 30 vidas en lugar de 3. En otros juegos existían otros códigos para elegir nivel, cambiar de armas, invulnerabilidad, etc. Estos códigos no siempre eran trampas para ayudar a los jugadores mas flojos sino rutinas para buscar y reparar errores dentro del juego. Si un programador quería revisar que no hubiera errores en el nivel 50 no tenía que jugar desde el principio. Era posible revisar el daño que los monstruos le hacían al jugador sin necesidad de morir cada vez. O probar el efecto de las armas mas exóticas sin tener que pasar horas buscándolas.

Al inicio de un programa, uno puede construir rutinas que nos ayuden a construirlo y si somos demasiado perezosos podemos dejarlas en el programa de modo mas o menos oculto. No puedo explicar lo útiles que son estas rutinas. Sobre todo porque de todos los libros de computación que he leído en ninguno hablan de este estilo de programación. La rutina mas elemental es la que despliega el contenido del acumulador en hexadecimal. Aquí les digo como lograrlo.

Para desplegar el contenido del acumulador en hexadecimal es necesario combinar algunas funciones que ya vimos. Veámoslo por pasos:

debug:
        pusha
        call	bin2asc
        push	0
        push	debug_caption
        push	debug_message
        push	0
        call	[MessageBox]
        popa
        ret

Esta es la función básica. Primero guarda el contenido de los registros generales en la pila con PUSH, luego llama a la función bin2asc y luego llama a MessageBox, la cual recibe la posición de una cadena ASCII como uno de sus parámetros. Ahora revisemes la función bin2asc:

bin2asc:
        pusha
        xor	eax, eax
        mov	ecx, 8
        mov	edx, [eax_bin]
lee_binario:
        mov	ebx, 0fh
        and	ebx, edx
        mov	al,  [ebx + digitos]
        push	eax
        shr	edx, 4
        loop	lee_binario
        mov	ecx, 8
        mov	edi, eax_ascii
escribe_binario:
        pop	eax
        mov	[edi], al
        inc	edi
        loop	escribe_binario
        popa
        ret

Esta función recibe un valor binario de 8 bits y genera una cadena ASCII-Z que es posible desplegar en una caja de diálogo de MessageBox. Las 4 primeras instrucciones salvan los registros generales con pusha, pone en cero el acumulador con XOR EAX, EAX (cualquier número XOR consigo mismo es cero), carga un 8 en el registro contador ECX y carga en el registro EDX el valor binario a convertir, en este caso [eax_bin]. La segunda parte es un ciclo que se repite 8 veces; a grandes rasgos se toman los bits de EDX en grupos de 4 en 4 y ese número (que solo puede tomar valores entre 0 y 15) se usa como un ‘offset’ en el arreglo DIGITOS. Este arreglo contiene los números del 0 al 9 y las letras de la A a la F de modo que su posición dentro de la memoria corresponde con el valor numérico de estos símbolos en el sistema Hexadecimal. Noten que estos símbolos se guardan en el STACK con PUSH desde el último (bits menos significativos) hasta el primero (bits mas significativos). Ahora la cadena ascii que representa el número ya se encuentra en el STACK.

La última parte consiste en escribir esa cadena en una posición dada. En este caso tal buffer está en ‘eax_ascii’ Hacemos que EDI que es el Destination Index Register (y no Destiny como dicen los lamers de la Universidad de Guadalajara) y cargamos en el contador ECX otro 8. En sucesión rápida sacamos los valores del STACK (que son de 32 bits) en EAX y escribimos los 8 bits mas bajos de EAX en el arreglo con MOV [EDI], AL e incrementamos EDI con INC EDI en una posición. Lo siguiente restaurar el contenido original de los registros generales con POPA y terminar la función con RET.

Noten que esta función está pesimamente estructurada, pues los datos no están autocontenidos en variables locales. Pero esta fue la única rutina sencilla de explicar que encontré entre mis códigos. Supongo que esto será suficiente para quien realmente le interese el Ensamblador y no a los lamers que solo quieren aprobar una materia para convertirse en DBA’s. Por ahora la nota ya quedó demasiado larga así que ahí le dejamos por ahora, mas adelante veremos mas código e insultaremos algunos lamers.

marzo 11, 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: