|
Listado de tut01en1.asm
|
format PE GUI
MB_OK = 00h
MB_ICONEXCLAMATION = 30h
push MB_OK + MB_ICONEXCLAMATION
push _caption
push _message
push 0
call [MessageBox]
push 0
call [ExitProcess]
_caption db 'Ensamblando programas para Win32',0
_message db '¡Hola Mundo!',0
data import
dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA user_name,RVA user_table
dd 0,0,0,0,0
kernel_table:
ExitProcess dd RVA _ExitProcess
dd 0
user_table:
MessageBox dd RVA _MessageBoxA
dd 0
kernel_name db 'KERNEL32.DLL',0
user_name db 'USER32.DLL',0
_ExitProcess dw 0
db 'ExitProcess',0
_MessageBoxA dw 0
db 'MessageBoxA',0
end data
|
|
|
Pantallazo
|
|
|
format
Ésta palabra es una directiva del fasm. Le indica al ensamblador que tipo de formato debe dar al archivo final, es decir al programa que queremos producir.
| PE GUI
Los valores dados a la directiva format para producir un "Ejecutable Portátil" para la interfaz gráfica.
|
=
El signo "igual que" es otra directiva. Le dice a fasm que el nombre dado representa el valor numérico asociado.
Al momento de escribir el archivo, fasm sustituye cada aparición de "MB_OK" con un cero (0).
| Los valores numéricos terminados en "h" son interpretados como hexadecimales, es decir, números que van de 0 a 15 en lugar de 0 a 9 usando las primeras 6 letras del alfabeto. Son tan utilizados que haremos una exposición más detallada luego. El número 030h corresponde al 48 decimal.
|
push
Es una instrucción del lenguaje ensamblador que viene convertida por fasm en código directamente ejecutado por el procesador. Es decir, es una orden directa para que el procesador haga una función determinada.
Push empuja el valor dado a continuación en una pila de valores. La pila almacena los valores en el orden en que llegan, con el último valor empujado de primero.
| El resultado de la suma de 0+030h viene empujado en la pila.
Es decir, la pila tiene como primer valor el 030h
|
La instrucción siguiente empuja en la pila el valor del label o etiqueta "_caption" que es una dirección o posición de memoria. Éste es un concepto fundamental para el aprendizaje del lenguaje ensamblador.
Fasm conserva el valor de posición que corresponde al punto donde se define la etiqueta "_caption". Para definir una etiqueta hay tres opciones equivalentes:
1. Usar una directiva de datos, en el caso de _caption es db
2. Hacerlo seguir de dos puntos, como en el caso de kernel_table:
3. Usar la directiva label, que veremos en otro curso.
|
db
Es una directiva de datos que quiere decir Data Byte. Indica a fasm que debe convertir la información que sigue en secuencias de bytes para escribirlas en el archivo producido (nuestro programa).
El byte es una unidad de información correspondiente a 8 bits, o sea que puede representar un valor entre 0 y 255.
Cómo información podemos tener números y/o cadenas de texto separados por comas. La cadena de texto se convierte a bytes usando un código donde a cada símbolo corresponde un número (código ASCII).
|
call
Es otra instrucción del lenguaje ensamblador. Ésta se encarga de "llamar" una función, que puede ser interna o externa. Una función es una porción de instrucciones que hacen una tarea determinada y por lo tanto vienen agrupadas bajo una etiqueta. Recordemos que la etiqueta representa una dirección de memoria.
Llamar la función es decirle al procesador que ejecute las instrucciones cuando llamamos la etiqueta.
|
La función MessageBox es una función externa a nuestro programa. Pertenece al Windows y puede ser usada por cualquier programa. Ella será la que nos muestre la ventana en la pantalla y esperará a que pulsemos un botón.
Para trabajar, la función necesita saber que título y que mensaje mostrará, cuántos botones y de que tipo. Ésta información la obtiene de la pila directamente, por lo tanto nosotros debemos ponerla en orden y bien completa.
|
La función ExitProcess es otra función del Windows. Ella se encarga de terminar correctamente nuestro programa; un programa bien hecho en Windows termina siempre con ésta.
Notaste que le damos un valor de cero en la pila. Éste sirve para que nosotros le comuniquemos al Windows como terminó el programa. La convención indica que con un cero le decimos que todo salió bien.
|
Aquí termina efectivamente la ejecución de nuestro programa.
Quedaron faltando por analizar las últimas líneas del listado. Éstas líneas no se ejecutan. Sirven para el correcto funcionamiento del programa y cada una cumple con una función determinada. Aunque parecen bastante crípticas, en realidad no lo son tanto. Para explicarlas, necesitaremos unos conceptos adicionales que veremos al final de éste primer curso.
Por ahora no esperemos más. ¡Veamos nuestro programa en acción!
|
|