Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

MOV. El Primer Movimiento

Continuamos nuestra aventura en los infernales pasillos del WinMain que viéramos en nuestro último código. Había pensado en detallar el funcionamiento del WinMain y el Stack Frame, pero creo que eso es demasiado dificil por ahora, puede que lo veamos la otra semana. Por ahora, es mejor detallar aquella instrucción que parece engañosamente elemental pero que es mucho mas dificil de lo que la gente cree. El omnipresente MOV:

MOV se llama así porque son las 3 primeras letras de la palabra inglesa MOVe. Que significa mover. Parece sencillo, pero no lo es, pues según Barry Brey en su famoso libro Los Microprocesadores Intel, esta instrucción tiene mas de ¡20,000 variantes! En pocas palabras, MOV mueve datos de un lugar a otro, aunque en realidad lo que hace es copiarlos. He aquí una clasificación básica de los diferentes tipos de MOV:

MOV entre registros generales

MOV entre registros generales y celdas de memoria

MOV inmediato a registro

MOV inmediato a memoria

MOV registros generales a registros de segmento

MOV entre registros de control y memoria

etcétera, etcétera, etcétera.

Por ahora nos concentraremos en los cuatro primeros, siendo el mas sencillo de comprender el movimiento de inmediato a memoria. Recuerden que lentamente estamos destripando el último código que se publicó en esta especie de blog. De ese modo su lectura tiene mas sentido. Sin embargo, mas que darles la explicación de escuelita, les hablaré de algo que muchos les dicen que es imposible.¡De Código Máquina!

En los apéndices A y B de la referencia de instrucciones de los manuales de Intel, viene un OpCode Map y el formato y codificación de las instrucciones. Literalmente, nos muestra como construir una instrucción a partir de ceros y unos. Desgraciadamente, las funciones que involucran posiciones de memoria son sumamente difíciles de codificar a mano y no porque sean muy complejas, sino porque las posiciones de memoria se mueven conforme agregamos y quitamos instrucciones de nuestro programa. En tiempo de compilación, se recalculan estas posiciones a partir de las etiquetas, por lo que hacer esto a mano resulta bastante tedioso, a menos que usemos alguna suerte de posicionamiento relativo. Bueno, creo que de momento solo hablaré de las reglas básicas del MOV y luego habraré sobre como codificarlo en ceros y unos.

REGLAS DEL MOV

1- No se puede usar MOV para mover datos entre 2 posiciones de memoria diferentes

2.-Los argumentos del MOV deben de ser del mismo ancho en bits

3.-Cuando movemos algo a un registro o a una celda de memoria, cualquier cosa que contuviera antes es remplazada por el nuevo valor

3.- En realidad la instrucción MOV no mueve, sino que copia el contenido operando origen al destino.

4.- El primer argumento de la instrucción mov es el DESTINO y el segundo el ORIGEN. Como quien dice, los datos se mueven de derecha a izquierda

5.- Cuando hay registros generales involucrados, el ancho de los datos se infiere de estos, si movemos un valor inmediato a memoria, es necesario especificar ese ancho.

6.- Los únicos anchos que puede contener un MOV son 2, BYTE y WIDE, (Wide puede ser 16,32 o 64 según el modo de operación del CPU) Existen operaciones similares a MOV que transfieren otras cantidades de datos.

7.- Cuando una etiqueta (o nombre de variable como dirían los lamers de C – – ) se mueve hacia un registro o celda de memoria, lo que en realidad se mueve es un valor que indica la posición. Por ejemplo MOV eax, variable

8.- Si esa etiqueta se encuentra entre corchetes [], entonces se refiere al contenido al que hace referencia esa etiqueta. Como en MOV eax, [variable]

Veamos algunos ejemplos de estas instrucciones:

MOV entre registros

mov eax, edi

mov esi, ecx

mov ebx, eax

MOV entre registos y celdas de memoria

mov eax, [variable]

mov eax, [ebx]

mov eax, [ebx + edi + 100h]

mov [variable], eax

MOV inmediato a memoria

mov eax, 100h

mov ecx, variable

mov edi, 1

Bueno, por hoy es suficiente. Espero que esto baste para entender como se llenan las estructuras básicas en el programa de ventana que vimos la última vez.

Anuncios

enero 18, 2009 - Posted by | Uncategorized

1 comentario »

  1. Muy buena explicación, llevo un rato batallando queriendo encontrar alguien que hablará de ensamblador con un conocimiento propio del tema, pero bueno aquí andaré revisando y leyendo para ver si puedo comprender mejor este lenguaje, saludos

    Comentario por José | noviembre 28, 2016 | 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: