ASSEMBLER

 

¿Que es ?

 

El programa ensamblador es la herramienta que realiza la traducción de un fichero que contiene instrucciones para el procesador del estilo mov %eax, %ebx a su correspondiente representación como secuencia de ceros y unos. Este programa, por tanto, sabe cómo codificar todas y cada una de las operaciones posibles en el procesador, así como sus operandos, modos de direccionamiento, etc.

Los datos de entrada al programa ensamblador (de ahora en adelante simplemente ensamblador) es uno o varios ficheros de texto plano que contienen un programa o secuencia de instrucciones a ejecutar por el procesador.

 

Estructura de un programa en ensamblador

Un programa está dividido en varias secciones. La palabra .data es una directiva y comunica al ensamblador que a continuación se define un conjunto de datos. El programa tan sólo tiene un único dato que se representa como una secuencia de caracteres. La línea .asciz, también una directiva, seguida del string entre comillas es la que instruye al ensamblador para crear una zona de memoria con datos, y almacenar en ella el string que se muestra terminado por un byte con valor cero. Nótese que el efecto de la directiva.asciz no se traduce en código sino que son órdenes para que el ensamblador haga una tarea, en este caso almacenar un string en memoria.

Antes de la directiva .asciz se incluye la palabra dato seguida por dos puntos. Esta es la forma de definir unaetiqueta que luego se utilizará en el código para acceder a estos datos. La línea siguiente contiene la directiva .text que denota el comienzo de la sección de código. Nótese que todas las directivas tienen como primer carácter un punto. La línea .globl main contiene la directiva que comunica al ensamblador que la etiqueta con nombre main será globalmente accesible desde otro programa.

El compilador que se utilizará se llama gcc y realiza una tarea similar a la de un compilador de un lenguaje de alto nivel como Java. La cadena -o programa es la forma de decirle al compilador que queremos que el ejecutable resultante se llame programa. Si al compilar se detecta algún error en el programa se muestra la línea y el motivo. Si no se detectan errores, se genera un fichero con el ejecutable resultante.

En el caso de tener el código escrito en varios ficheros que deben combinarse para obtener un único programa, la línea anterior se modifica incluyendo todos los ficheros con extensión .s necesarios.

TIPOS DE LENGUAJE

Lenguaje de máquina: Lenguaje que puede interpretar y ejecutar un procesador determinado. Este lenguaje está formado por instrucciones codificadas en binario (0 y 1). Es generado por un compilador a partir de las especificaciones de otro lenguaje simbólico o de alto nivel. Es muy difícil de entender para el programador y sería muy fácil cometer errores si se tuviera que codificar.

Lenguaje de ensamblador: Lenguaje simbólico que se ha definido para que se puedan escribir programas con una sintaxis próxima al lenguaje de máquina, pero sin tener que escribir el código en binario, sino utilizando una serie de mnemónicos más fáciles de entender para el programador. Para ejecutar estos programas también es necesario un proceso de traducción, generalmente denominado ensamblaje, pero más sencillo que en los lenguajes de alto nivel.

Lenguajes de alto nivel: Los lenguajes de alto nivel no tienen relación directa con un lenguaje de máquina concreto, no dependen de la arquitectura del procesador en el que se ejecutarán y disponen de sentencias con una estructura lógica que facilitan la programación y la comprensión del código para el programador; las instrucciones habitualmente son palabras extraídas de un lenguaje natural, generalmente el inglés, para que el programador las pueda entender mejor. Para poder ejecutar programas escritos en estos lenguajes, es necesario un proceso previo de compilación para pasar de lenguaje de alto nivel a lenguaje de máquina; el código generado en este proceso dependerá de la arquitectura del procesador en el que se ejecutará.

Definición de constantes

Una constante es un valor que no puede ser modificado por ninguna instrucción del código del programa. Realmente una constante es un nombre que se da para referirse a un valor determinado.

La declaración de constantes se puede hacer en cualquier parte del programa: al principio del programa fuera de las secciones .data, .bss, .text o dentro de cualquiera de las secciones anteriores.

Definición de variables

La declaración de variables en un programa en ensamblador se puede incluir en la sección .data o en la sección .bss, según el uso de cada una.

Sección .data, variables inicializadas Las variables de esta sección se definen utilizando las siguientes directivas:

 • db: define una variable de tipo byte, 8 bits. 

 • dw: define una variable de tipo palabra (word), 2 bytes = 16 bits.

 • dd: define una variable de tipo doble palabra (double word), 2 palabras = 4 bytes = 32 bits.

 • dq: define una variable de tipo cuádruple palabra (quad word), 4 palabras = 8 bytes = 64 bits.

Vectores

Los vectores en ensamblador se definen con un nombre de variable e indicando a continuación los valores que forman el vector.

También podemos utilizar la directiva times para inicializar vectores, pero entonces todas las posiciones tendrán el mismo valor.

vector5 times 5 dw 0 ;vector formado por 5 palabras inicializadas en 0

 

Tamaño de los operandos 

En sintaxis NASM el tamaño de los datos especificados por un operando puede ser de byte, word, double word y quad word. Cabe recordar que lo hace en formato little-endian.

 • BYTE: indica que el tamaño del operando es de un byte (8 bits). 

• WORD: indica que el tamaño del operando es de una palabra (word) o dos bytes (16 bits).

 • DWORD: indica que el tamaño del operando es de una doble palabra (double word) o cuatro bytes (32 bits).

 • QWORD: indica que el tamaño del operando es de una cuádruple palabra (quad word) u ocho bytes (64 bits).

En algunos casos es obligatorio especificar el tamaño del operando; esto se lleva a cabo utilizando los modificadores BYTE, WORD, DWORD y QWORD ante la referencia a memoria. La función del modificador es utilizar tantos bytes como indica a partir de la dirección de memoria especificada, independientemente del tamaño del tipo de dato (db, dw, dd, dq) que hayamos utilizado a la hora de definir la variable.

Instrucciones de transferencia de datos

 •movdestino,fuente: instrucción genérica para mover un dato desde un origen a un destino.

 • pushfuente: instrucción que mueve el operando de la instrucción a la cima de la pila.

 • popdestino: mueve el dato que se encuentra en la cima de la pila al operando destino.

 • xchgdestino,fuente: intercambia contenidos de los operandos.

Instrucciones aritméticas y de comparación:

adddestino,fuente: suma aritmética de los dos operandos.

 • adcdestino,fuente: suma aritmética de los dos operandos considerando el bit de transporte.

 • subdestino,fuente: resta aritmética de los dos operandos.

 • sbbdestino,fuente: resta aritmética de los dos operandos considerando el bit de transporte.

 • incdestino: incrementa el operando en una unidad.

 • decdestino: decrementa el operando en una unidad.

 • mulfuente: multiplicación entera sin signo.

 • imulfuente: multiplicación entera con signo.

 • divfuente: división entera sin signo.

 • idivfuente: división entera con signo.

 • negdestino: negación aritmética en complemento a 2.

 • cmpdestino,fuente: comparación de los dos operandos; hace una resta sin guardar el resultado

Instrucciones lógicasy de desplazamiento:

Operaciones lógicas:

 •and destino,fuente: operación 'y' lógica.

 • or destino,fuente: operación 'o' lógica.

 • xor destino,fuente: operación `o exclusiva´ lógica.

 • not destino: negación lógica bit a bit.

Operaciones de desplazamiento:

•sal destino,fuente / shldestino,fuente: desplazamiento aritmético/lógico a la izquierda.

• sardestino,fuente: desplazamiento aritmético a la derecha.

• shr destino,fuente: desplazamiento lógico a la derecha.

• rol destino,fuente: rotación lógica a la izquierda.

• ror destino,fuente: rotación lógica a la derecha.

• rcl destino,fuente: rotación lógica a la izquierda considerando el bit de transporte.

•rcr destino, fuente: rotación lógica a la derecha considerando el bit de transporte.