Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

WinMain() // La Puerta del Infierno

Según un escritor italiano llamado Dante Alligieri(no se bien como se deletrea el apellido) si uno mira con detalle las puertas del Infierno, podrá ver una inscripción que dice:–Aquel que entre aquí es mejor que abandone toda esperanza”–. Ahora mismo nosotros estamos ante este mismo portal, la diferencia es que el letrero que se haya sobre nosotros dice: ‘WINMAIN()’
Si no correron despavoridos al ver que para pintar una miserable ventana hacían falta casi 300 lineas de código. Es probable que sobrevivan a lo que viene, de lo contrario aún pueden dar marcha atrás y seguir viviendo de los querys, las animaciones en flash (o era FLUSH) y el diseño de páginas WEB. Que hasta donde yo se, es la base de la cadena alimenticia de los lamers. Bueno, lamento decirles que si pensaban escapar ya es demasiado tarde…

Ahi está, la mismísima puerta del infierno. Sin embargo se encuentra cerrada por 4 candados, puestos ahí para que los lamers incautos no cayeran por accidente. Para entrar necesitamos 4 llaves especiales. Estas son las 4 llaves y las instrucciones para conseguirlas:

llave #1.- hInstance: Es el manejador de instancia. Un número de 32 bits que el sistema usa para identificar una aplicación en particular. Para obtenerlo hay que recitar el siguiente conjuro:
push 0
call [GetModuleHandle]
mov [hInstance], eax
; se toma el handle de modulo o instancia
; que es la posicion de memoria del programa

La función GetModuleHandle, perteneciente a Kernel32.dll recibe como parámetro un identificador. Si este valor es cero, la función retorna el manejador de instancia de la aplicación que la llama. Como ya se dijo, toda función retorna un valor en el acumulador EAX. Un Instance Handle es como la credencial de elector o un número de Seguridad Social. Pues con este se identifica a la aplicación dentro del sistema y este le solicita tal dato para ciertos trámites.

Llave#2.-hPrevInstance.- Prueba de lo antigua que es la función WinMain. En la era del Windows de 16 bits, este parámetro era el manejador de instancia previa. Hoy en día ese valor es CERO. (NULL como dirían los matador). Para ahorrar memoria cuando se corren varias instancias del mismo programa, Windows usa una sola copia del ejecutable y un segmento de datos por cada copia.

Llave#3.- lpCmdLine: Se trata de la posición de memoria de la linea de comando. Esto recuerda un poco al parámetro principal del viejo main() de C – -. En este caso, se trata de un entero de 32 bits que indica la posición de una cadena ascii-z dentro de la memoria. Y aunque no se usa para nada en aplicaciones gráficas (al menos yo no se como usarlo) se obtiene así:

call [GetCommandLine]
mov [command_line], eax
; obtener la posicion de la linea de comando

La función de la API de Windows GetCommandLine no requiere argumentos. Retorna en EAX la posición de la linea de comando. Que al final guardamos en la posición de memoria [command_line]

Llave #4.- nCmdShow.- Se trata de un entero constante que indica como ha de mostrarse el programa. En este caso se usa la constante SW_SHOWDEFAULT, cuyo valor hexadecimal es 0ah.
De acuerdo, ya tenemos las 4 llaves que necesitamos para poder entrar a WinMain, por lo que el proceso para entrar consiste en introducir a la pila estos 4 valores AL REVES y luego llamar a WinMain como se muestra aquí:

push dword 0ah
push dword [command_line]
push dword 0
push dword [hInstance]
call win_main
; llamar a la funcion winmain() con sus cuatro parametros

Por cierto, todo lo que está entre un ‘punto y coma ;’ y el fin de una linea es comentario y se ignora por el compilador. En este caso, la frase ‘llamar a la función winmain() con sus 4 parámetros’ es un comentario, pues el ‘;’ se encuentra justo a la izquierda.
Y esa es la entrada al WinMain, sin embargo aún no estamos preparados para soportar los horrores que aguardan dentro. Por lo que nos brincaremos al regreso de la función que eslo que sigue justo después:

push 0
call [ExitProcess]
; Fin del programa

Una llamada a función trabaja de la misma manera que un YO-YO o un salto en el Bungee. Cuando el código encuentra una instrucción CALL se amarra a los pies una cuerda que lo sujeta con la posición de memoria actual, luego salta hacia donde indica el parámetro de CALL y continúa la ejecución. Cuando encuentra una instrucción RET, lo que hace es que jala la cuerda de la que está colgado y regresa exactamente a la misma posición en la que iba cuando encontró la primera instrucción CALL. En este caso, ese punto es este, cuando se llama a la función de la API de Windows ExitProcess. El único parámetro de esta función es el de código de error. Si este es un cero, significa que todo salió como lo esperábamos y fin del show. Y aunque en este punto es donde termina la ejecución del programa, apenas nos asomamos a lo que es un verdadero programa de Ensamblador para Windows. En las siguientes notas veremos un poco mas de los horrores que nos esperan adentro. Mientras prepárense para lo peor, porque quien decide programar en Ensamblador es mejor que renuncie a toda esperanza… esperanza de encontrar empleo honesto en el Tercer Mundo.

Anuncios

enero 13, 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: