Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Corazones y Estómagos (Parte 2 de 3)

–Procesamiento de Mensajes en Windows–

Siguiendo la comparación con el aparato digestivo, la Callback Function es el estómago. Esta es una función como cualquier otra con su Stack Frame, su directiva Virtual, su LEAVE, RET , etiqueta de entrada y un montón de código adentro. Sin embargo, lo que hace única a esta función es que no es llamada por el código. ¡Sino por el Windows!. Comencemos a ver esta función en detalle:

Wndproc tiene 4 parámetros: hWnd que es el handle de la ventana; wMsg que es un valor de 32 bits que nos indica de que mensaje se trata y wParam y lParam. Estos son los 4 primeros elementos de una estructura de mensaje como es descrita en la entrada Mensaje En Una Botella.

Como ya se habrán dado cuenta. EBP apunta al centro del Stack Frame. Veamos a que apunta cada cosa:

EBP = contenido de ebp anterior

EBP+ 4 = posición de retorno

EBP + 8 = hWnd

EBP + 0Ch = wMsg

EBP + 10h = wParam

EBP + 14h = lParam

En este caso, la función de CALLBACK solo responde al mensaje WM_DESTROY lo primero que hace luego de inicializar el Stack Frame es ver si el mensaje que nos llegó es WM_DESTROY. El valor numérico de WM_DESTROY es 2 y se encuentra en [ebp + 0ch]. Esto es lo que hacen estas instrucciones: cmp dword [ebp + 0ch], 2 jne ignora_msg

Esto se traduce como compara el dword contenido en [ebp + 0ch] con un 2, si no son iguales vas a saltar hacia la etiqueta ignora_msg

Lo que queda entre este salto condicional y la etiqueta ignora_msg es el código que se ejecuta en respuesta a WM_DESTROY. Cuando el código es demasiado grande se hace una llamada a función o un salto incondicional en esta sección. En este caso, en respuesta al mensaje WM_DESTROY se hace una llamada a PostQuitMessage. Esta función es como una nota de suicidio, pues con esta nuestro programa le avisa al sistema que está a punto de terminar. Su único argumento es un código de salida que bien puede ser un cero. En este código, se incluye el leave y ret 10h para hacerlo mas sencillo. Pero en caso de un programa que reaccione a una gran cantidad de mensajes, lo mas seguro es utilizar un salto incondicional hacia la salida de la función Callback.

El código que sigue a la etiqueta ignora_msg.- Luego de que procesamos todos aquellos mensajes que nos interesan, nos ocupamos de purgar aquellos que no usamos. Esto es importante porque en Windows todos los mensajes deben de ser procesado. La manera de hacer esto es con la función de la API DefWindowProc, la cual recibe 4 argumentos que son los mismos 4 con los que trabaja la función Callback. Las cuales son hWnd, wMsg, wParam y lParam. Acabando esta llamada llega el fin de la función Callback con su leave y RET 10h.

Una cosa que no entiendo su significado es ese byte 0cch. De acuerdo con los manuales de Intel se trata de la interrupción 3. Sin embargo, este código nunca se ejecuta y es posible quitarlo. Lo dejé porque así es como venía en el código máquina original escrito por Iczelion. Me pregunto cual es su verdadero significado.

Solo para seguir la comparación con el Aparato Digestivo, La función CallBack es un estómago que recibe los mensajes. Como todo mundo aprendió en la escuela elemental. Luego de que el alimento se digiere (la lectura del mensaje),se le extraen los nutrientes en el intestino delgado(se compara el mensaje con aquellos que queremos procesar) y lo que no sirve va al intestino grueso a donde es expulsado, que es exactamente lo que hace DefWindowProc. Para que no se les olvide, cada que vean el nombre de DefWindowProc piensen en un WC.

¡Felicidades! Han llegado al final de la explicación del último código! Ahora solo falta la tercera parte de la explicación del manejo de mensajes y asunto arreglado. Lo siguiente será ver algunas funciones de la API de Windows con los que es posible leer y escribir información. Pero dado que estamos en Windows, las cosas no serán tan sencillas como INPUT y PRINT. Si alguien entiende lo que ambas palabras significan, puede que ya sea veterano.

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