Conceptos Básicos

Estructura básica de un Código en Ensamblador

La estructura básica es la siguiente:

 

.MODEL SMALL

.STACK

.DATA

 

(La declaración de variables va aquí)

 

.CODE

Nombre_del_programa PROC FAR

 

MOV AX, @DATA

MOV DS, AX

 

(Aquí van las instrucciones del programa principal).

 

Nombre_del_programa ENDP

 

(Aquí van los procedimientos)

 

END Nombre_del_programa

 

 

Donde:

Nombre_del_programa = Un nombre cualquiera siguiendo las reglas de los nombres de variables (No comenzar con número, no llevar espacios, etc.)

 

Nota: Las instrucciones MOV AX, @DATA y MOV DS, AX son también parte del código del programa y son INDISPENSABLES para poder utilizar las variables. Cabe mencionar que el uso de procedimientos lo explicare en la sección ¿CÓMO JUNTO TODO ESTO?

 

REGISTROS

Un registro es una variable de 16 bits preestablecida en el microprocesador de la PC, sirve de referencia para que las interrupciones sepan que es lo que van a hacer y con qué.

Los registros más usados son cuatro AX, BX, DX, CX. Cada uno tiene funciones específicas dependiendo que interrupción usaremos.

Como ya mencione los registros están formados por 16 bits que equivale a 2 bytes pegados (1 byte = 8 bits) o un WORD (1 Word = 16 bits). Cada registro puede ser descompuesto en sus dos bytes de la siguiente manera:

 

AX se descompone en AH y AL

BX se descompone en BH y BL

CX se descompone en CH y CL

DX se descompone en CH y DL

 

Donde AL toma los 8 bits menos significativos de AX y AH toma los más significativos de AX (AH y AL son Bytes), ejemplo:

 

 

INTERRUPCIONES

Una interrupción es una instrucción preestablecida en el microprocesador de la PC desde su fabricación. Cada interrupción se especializa en algo (por ejemplo la interrupción 10H se encarga del VIDEO mientras que la 21H se encarga del TECLADO) y se dividen en subfunciones con un fin específico.

Para usar una interrupción debemos colocar en los registros los valores necesarios para su correcta ejecución para que realmente haga lo que deseamos. Ejemplo:

 

MOV AH, 00H

MOV AL, 02H

INT 10H

 

Lo que pasa es que al ejecutar la interrupción 10H, esta observa el valor de AH y en este caso ejecuta la subfunción 00H, cambiando al modo de pantalla 02H.

 

ETIQUETAS

Una etiqueta es una marca dentro del código de nuestro programa y se usa principalmente para los ciclos y los saltos (ambos se explican posteriormente).

El nombre de una etiqueta sigue las reglas de los nombres de las variables (no comenzar con número, no llevar espacios, etc.).

Para crear una etiqueta solo tienes que colocarla en el punto a marcar agregándole al final un dos puntos ( un ':').

Ejemplo:

 

MOV CX, 13

 

RETORNO1: (Esto es la etiqueta)

 

MOV DX, OFFSET MENSAJE

MOV AH, 09H

INT 21H

LOOP RETORNO1

 

VARIABLES

Una variable es una localidad de memoria en la cual podemos guardar el valor que nosotros queramos.

Existen varios tipos de variables para diferentes propósitos:

 

 

Para poder usar las variables debemos primero DECLARARLAS, es decir, especificar su NOMBRE, TIPO y cuanta memoria ocupará, justo debajo de .DATA (Ver ESTRUCTURA DE UN CODIGO EN ENSAMBLADOR) de la siguiente manera:

 

Caracter DB ? - Esto declara una variable llamada Caracter de un Byte de largo

Cadena DB 32 dup(?) - Esto declara una variable llamada Cadena de 32 Bytes de largo

Entero DW ? - Esto declara una variable llamada Entero de un Word de largo

Arreglo 15 dup(?) - Esto crea una variable llamada Arreglo de 15 Words de largo

 

Nota: El comando DUP lo que hace es duplicar N veces el caracter dentro de los paréntesis:

4 dup(?) es lo mismo que ?,?,?,?

 

CONSTANTES

Su declaración y funcionamiento son muy similares a las de las variables, solo explicare las cadenas de caracteres.

Una CADENA DE CARACTERES consiste en una serie de bytes en los que se almacenaran los valores en código ASCII de una oración. Ejemplo:

 

Cadena DB "Oración a almacenar $"

 

Nota: El caracter $ no se tomara en cuenta al imprimir la cadena (Más adelante se explica como hacer esto) solo indica al procesador el fin de la cadena. Si se omite el procesador se pasa de largo y nadie sabe lo que pueda pasar...

 

Organización de las variables en memoria

 

Imaginemos que la memoria de la PC es una cuadricula como en un plano cartesiano y que cada cuadro representa un Byte.

Al igual que en un plano cartesiano, una variable se localiza en un punto indicado con la coordenada X y la coordenada Y.

En los lenguajes de programación a la coordenada X se le conoce como SEGMENT y a la coordenada Y como OFFSET. Para indicar una dirección de memoria se expresa así:

SEGMENT : OFFSET

Algo que hay que mencionar es que todas las variables se guardan en un mismo SEGMENT, y el valor de este SEGMENT se guarda en @DATA.

 

 


 

Comandos más comunes de ENSAMBLADOR

 

MOV variable, valor

Copia VALOR en VARIABLE.

 

MOV AX, 10 (es lo mismo que AX = 10)

MOV BX, DX (es lo mismo que BX = DX)

 

INT interrupción

Ejecuta la interrupción que indiquemos.

 

INT 10H (esto ejecuta la interrupción 10H)

 

ADD variable, valor

Suma a VARIABLE lo que valga VALOR

 

ADD AX, 2 (es lo mismo que AX = AX + 2)

ADD BX, DX (es lo mismo que BX = BX + DX)

 

SUB variable, valor

Resta a VARIABLE lo que valga VALOR

 

SUB AX, 2 (es lo mismo que AX = AX - 2)

SUB BX, DX (es lo mismo que BX = BX - DX)

 

CMP variable1, variable2

Compara VARIABLE1 con VARIABLE2

 

CMP AX, 9

CMP BX, DX

 

JMP etiqueta

Salta a la etiqueta indicada

 

JMP RETORNO1

 

JE etiqueta

Se usa después de una comparación (Ver comando CMP). Salta si VARIABLE1 es igual a VARIABLE2

 

CMP AX, 9

JE RETORNO1

 

JG etiqueta

Se usa después de una comparación (Ver comando CMP). Salta si VARIABLE1 es mayor que VARIABLE2

 

CMP AX, 9

JG RETORNO1

 

JL etiqueta

Se usa después de una comparación (Ver comando CMP). Salta si VARIABLE1 es menor que VARIABLE2

 

CMP AX, 9

JL RETORNO1

 

JNE etiqueta

Se usa después de una comparación (Ver comando CMP). Salta si VARIABLE1 no es igual a VARIABLE2

 

CMP AX, 9

JE RETORNO1

 

JNG etiqueta

Se usa después de una comparación (Ver comando CMP). Salta si VARIABLE1 no es mayor que VARIABLE2

 

CMP AX, 9

JG RETORNO1

 

JNL etiqueta

Se usa después de una comparación (Ver comando CMP). Salta si VARIABLE1 no es menor que VARIABLE2

 

CMP AX, 9

JL RETORNO1

 

LODSB

Carga un Byte desde una cadena de caracteres.

 

Antes de poder ejecutar este comando debemos mover al registro SI el OFFSET de la cadena de caracteres:

 

MOV SI, OFFSET Cadena_de_caracteres

 

Donde:

Cadena_de_caracteres = Nombre de la variable que contiene la cadena de caracteres.

 

LODSB después de haber leído el byte lo guarda en el registro AL e incrementara automáticamente el valor de SI colocándose por si solo en el siguiente byte de la cadena.

 

LOOP Etiqueta

 

Realiza un salto a la etiqueta si CX es diferente que cero y en caso de saltar decrementa CX automáticamente.

Donde:

Etiqueta = Cualquier etiqueta dentro de nuestro código

 

 


 

Bloques más usados

 

¿Qué es un BLOQUE?

Un bloque es un conjunto de instrucciones que tienen un fin especifico. Por ejemplo:

 

MOV AH, 00H

MOV AL, 02H

INT 10H

 

Estas tres instrucciones juntas forman el BLOQUE para cambiar a modo texto monocromático, MOV AH, 00H indica que se hará la subfunción 00H, MOV AL, 02H indica que se cambiara al modo de video 02H (o Texto Monocromático) y la INT 10H pone en ejecución lo anterior.

 

Bloque Para cambiar a modo de pantalla TEXTO

Cambia a modo texto monocromático

 

MOV AH, 00H

MOV AL, 02H

INT 10H

 

Bloque para limpiar la pantalla

Limpia la pantalla

 

MOV AH, 06H

MOV AL, 00H

MOV BH, 07H

MOV CX, 0000H

MOV DX, 184EH

INT 10H

 

 

Bloque para colocar el cursor donde queramos

Coloca el cursor en cualquier parte de la pantalla

 

MOV DH, Fila

MOV DL, Columna

MOV AH, 02H

MOV BH, 00H

INT 10H

 

Donde:

Fila = Fila donde queremos colocar el cursor

Columna = Columna donde queremos colocar el cursor

 

Bloque Para imprimir una cadena de caracteres

Imprime la cadena de caracteres contenida en la variable especificada.

 

MOV DH, Fila

MOV DL, Columna

MOV AH, 02H

MOV BH, 00H

INT 10H

MOV DX, OFFSET Nombre_de_la_cadena

MOV AH, 09H

IN 21H

 

Donde:

Fila = Fila donde queremos colocar el cursor

Columna = Columna donde queremos colocar el cursor

Nombre_de_la_cadena = Variable donde guardamos la cadena de caracteres.

 

Bloque Para capturar un solo caracter del teclado

Detiene la ejecución del programa hasta que se presione una tecla.

 

MOV AH, 01H

INT 21H

 

Nota: El código ASCII del caracter que fue capturado se guarda en el registro AL.

 

 

Bloque Para imprimir un solo caracter

Imprime el caracter indicado en la posición actual del cursor.

 

MOV AL, Codigo_Ascii_del_caracter

MOV AH, 0AH

MOV BH, 00H

MOV BL, 07H

MOV CX, 01H

INT 10H

 

Donde:

Codigo_Ascii_del_caracter = El Código ASCII del Carácter a imprimir.

 

Bloque Para capturar una cadena de caracteres del teclado

Captura una cadena de caracteres del teclado y la guarda en la variable indicada.

 

MOV AH, 0AH

MOV DX, OFFSET Cadena_de_caracteres

MOV Cadena_de_caracteres(0), Cantidad_de_caracteres_a_capturar

INT 21H

 

Donde:

Cadena_de_caracteres = Variable donde guardaremos la cadena de caracteres. Esta variable debe estar formada con suficientes bytes para guardar la cadena de caracteres mas oros 2 bytes extras, es decir, para guardar una cadena de 16 caracteres, la variable debe ser de 18 bytes.

Cantidad_de_caracteres_a_capturar = Cantidad de caracteres que desees capturar en la variable.

 

Nota: Existe un problema al usar este BLOQUE ya que la cadena de caracteres que captura no es compatible con el BLOQUE para IMPRIMIR UNA CADENA DE CARACTERES mencionado anteriormente. Para imprimir esta cadena de caracteres es necesario usar este BLOQUE.

 

MOV SI, OFFSET Cadena_de_caracteres

ADD SI, 2

MOV CX, 00H

MOV CL, Cadena_de_caracteres(1)

Etiqueta_nueva:

MOV Respaldo, CX

MOV DH, Fila

MOV DL, Columna

ADD DL, Cadena_de_caracteres(1)

SUB DL, CL

MOV AH, 02H

INT 10H

LODSB

MOV AH, 0AH

MOV BH, 00H

MOV BL, 07H

MOV CX, 01H

INT 10H

MOV CX, Respaldo

LOOP Etiqueta_nueva

 

Donde:

Fila = Fila donde queremos colocar el cursor

Columna = Columna donde queremos colocar el cursor

Cadena_de_caracteres = Variable donde guardamos la cadena de caracteres.

Etiqueta_nueva = Una etiqueta que no ayas usado antes.

 

Nota: Para este ultimo código se necesita declarar la variable llamada Respaldo de tipo DW.

 

Bloque para terminar el programa

 

Termina el programa

 

MOV AX, 4C00H

INT 21H

 

Nota: Este bloque lo utilizaremos para terminar el programa cuando nosotros deseemos, pero debe ser ejecutado en algún momento o el programa generara un error interno en el microprocesador y trabara la PC.