Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Destripando la Seccion de Codigo

Acabo de implementar un rudimentario sistema que me permite escribir con acentos ‘ñ’s y que al menos una vez evitó que publicara una nota tipo ‘troll’. Para los que no sepan, un Troll de Internet es un nerd medio amargado que publica cosas que hacen enojar a la gente. Así que cuando vuelva a hacerlo me aseguraré por lo menos de que este acto sea algo voluntario. Y ahora regresemos con el código de muestra en nuestro análisis linea por linea:

linea#4

Otra linea en blanco, esta vez para delimitar los parámetros del compilador

linea#5

entry start

En FASM, la directiva entry indica donde está el punto de entrada del programa, es algo así como el main() de c. La palabra ‘start’ es una etiqueta de posición de memoria. Es necesario hablar sobre el Memory Addressing para entenderlo, que en mi opinión es la parte mas complicada a la hora de programar en Ensamblador.

Linea#6

Otra linea en blanco para separar.

Linea#7

section ‘.code’ code readable executable

La directiva section indica que sigue una sección de programa. En este caso es una sección de código. El ‘.code’ entre comillas es el nombre con el que se identifica y las siguientes palabras indican las propiedades. En este caso, significa que es un código, que podemos leerlo y ejecutarlo. Para quien tenga el valor de ir mas allá, puede leer sobre los descriptores de segmento en los manuales de Intel.

Linea#8

Otra linea en blanco.

Linea#9

start:

Aquí es donde realmente empieza la ejecución del programa. Y es a la que hace referencia la linea 5 cuando dice entry start. Los dos puntos (:)se usan para indicar que ahi vive la etiqueta. Una etiqueta es un si\mbolo que es traducido por el Ensamblador como una posición de memoria. Para fines prácticos, este punto es donde arranca el código.

Linea#10

Otra linea en blanco

linea#11

push 0

¡Esta es la primera instrucción que vemos en este blog! Su función es introducir al Stack un cero cuyo ancho por default es de 32 bits. Un stack es una de las entidades informáticas mas importantes y hablaré detalladamente sobre ella cuando acabe unos cuantos dibujitos en paint. En Ensamblador se usa el stack para pasarle los parámetros a una subrutina, ya sea esta nuestra o parte del sistema operativo. En este caso el Windows.

****ADVERTENCIA***

Creo que el sistema de este blog no está alineando el código como debe de ser y además me está sembrando varias lineas en blanco. Así que a partir de aqui\ ya no contaré las lineas en blanco y me referiré directo al código.

Linea#12

push _caption

Esta linea es otra instrucción push para pasarle otro parámetro a una función. La diferencia es que lo que estamos pasando no es un valor constante. (o valor inmediato como dicen en Intel) sino una posición de memoria. Es decir _caption es un número que indica donde comienza una cadena de texto. La ‘raya antes de la c’ es llamada Underscore Bar y es usada por muchos programadores para indicar que una etiqueta es una posición de memoria y no tiene nada que ver con el ensamblador. De hecho yo lo encuentro sumamente confuso y se me figura un remedo del asterisco que usan los programadores de C- – cuando usan punteros.

Linea#13

push _message

Exactamente lo mismo que arriba, solo que aquí se introduce la pila la posición de una cadena ascii que indica el mensaje que aparece en una caja de diálogo.

Linea #14

push 0

Lo mismo que en la linea 11. Se empuja otro cero a la pila. Mas adelante explicaré lo que significan este y el otro cero.

Linea#15

call [MessageBoxA]

La segunda instrucción que vemos. CALL llama a una subrutina. Su funcionamiento se relaciona directamente con el Stack. En este caso, llamamos a MessageBox. Que es una función de la API de Windows que muestra una caja de diálogo con un mensaje y un botón. Los paréntesis cuadrados, también llamados corchetes se usan para referirse al contenido de una celda de memoria. Es muy importante conocer la diferencia entre el contenido y la posición de una celda de memoria. Para no entrar en detalles, usaré el ejemplo del estacionamiento. Un sitio para estacionarse puede referirse por un número, mientras que el contenido puede ser el automovil estacionado en ella. Primero hay que entender el Stack, luego la instrucción CALL y al final el sistema de llamadas de la API de Windows. Por cierto. API significa “Interfaz de Programa de Aplicación”

linea#16

push 0

Se empuja a la pila un cero de 32 bits que es el parámetro para la siguiente llamada a Función.

Linea#17

call [ExitProcess]

Aquí llamamos a la función del windows que termina la ejecución del programa. El cero es un mensaje de terminación del sistema y significa que todo salió bien.

Bueno, este es el fin de la sección de código, habraré de las demás secciones en otra nota. Pero antes de irme, hablaré de varios detalles sobre estas lineas:

*Las lineas de la 11 a la 15 se pueden traducir a código en Visual C de este modo

MessageBox(0,_message,_caption,0);

Los parámetros se pasan ‘al reves’. El primer cero indica el ‘handle’ de quien llama y el ultimo cero indica el tipo de caja de mensaje. La letra mayúscula ‘A’ indica que es una función ascii. Hay funciones Ascii y Unicode. Esta es Ascii.

*Las lineas 16 y l7 serían:

ExitProcess(0);

Sección de Datos:

La sección de datos de este programa es tan insignificante que puedo hablar de ella en un par de párrafos. Así que sigo el análisis:

linea #18

section ‘.data’ data readable writeable

Esta linea declara que sigue otra sección. Esta sección lleva por nombre ‘.data’ y los parámetros subsiguientes nos dicen que es una sección de datos y que podemos leer y escribir en ella.

Linea#19

_caption db ‘Win32 assembly program’,0

Ya estamos en la sección de datos, y lo primero que hay es lo que llaman una cadena ASCII-Z. En estas cadenas, cada byte representa una letra y al final se pone un cero binario para indicar que ahí se acaba. (Cero se escribe zero en inglés).

_caption es una etiqueta que indica la posición de esa cadena. Es como las placas con números que se ponen en las entradas de las casas. Es igual que la etiqueta start. Solo que como sigue una cadena ascii no necesitamos poner los dos puntos.

El ‘db’ es una directiva que dice que se definen datos de ancho de byte. Y las comillas sencillas que encierran la frase Win32 Assembly Program indican que esa frase se traduce en un chorizo de bytes. El cero al final, separado por coma, es un cero binario que indica el fin de la cadena ascii-z.

Linea#20

_message db ‘Hello World!’,0

Exactamente lo mismo que la linea anterior. Es una cadena ASCII-Z que dice Hello World!

Bueno, ahora si ya se acabó esta nota. Luego me dicen si no entendieron alguna de estas instrucciones. ¡Y prepárense porque la sección de importaciones es verdaderamente dificil!

Anuncios

diciembre 25, 2008 - Posted by | Uncategorized | ,

3 comentarios »

  1. Buen dia, tengo una duda, a lo mejor un poco basica pero como apenas estoy comenzando con ensamblador,en fin la pregunta es: en la parte en la que se introduce al stack la pocision de memoria de ‘_caption’, ese caption es un nombre creado por el que escribio el codigo o como tal es algo interno del sistema operativo?

    Comentario por xxracgxx | agosto 10, 2012 | Responder

    • _caption es la etiqueta que indica la posicion de la cadena da texto que queda en la linea superior de la ventana. El nombre lo creo el programador, puedes cambiarlo y el programa va a funcionar igual
      cuando hace push _caption introduce al stack la posicion de memoria de inicio de la cadena de texto que dice “Win 32 assembly program”. El signo de subrayado algunos programadores lo usan para distinguir que lo que importa es la direccion de memoria y no el contenido como sucede cuando se usan variables normales

      Comentario por asm86 | agosto 10, 2012 | Responder

  2. hola asm86
    una greguntita
    si yo quisiera con crear con asambler un programa que lee de los .txt
    y lo convierte en instrucciones de un programa desde la .txt
    y tambien escribe texto. todo desde la micro sd o USB
    como si fuera un programa inteligente que lo que oye por microfono
    lo escribe algoritmicamente con un programa y luego lo saca cuando lo necesita .
    es para crear un programa de inteligencia artificial autonomo .
    se podria con Nasm. saludos

    Comentario por mirycia | abril 25, 2017 | 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: