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.