Está en la página 1de 47

UNIVERSIDAD NACIONAL DE INGENIERIA

FACULTAD DE ELECTROTECNIA Y COMPUTACION

MICROPROCESADORES
Registros del Microprocesador 8086

Son componentes dentro del microprocesador que nos


permiten almacenar datos. Estos datos pueden
representar valores sobre los cuales se van a realizar
operaciones, resultados de las operaciones, direcciones
de localidades de memoria donde se encuentran datos e
instrucciones, direcciones de los dispositivos de
entrada/salida sobre los que deseamos escribir o leer, o
los datos a escribir o leídos de esos dispositivos.

A la descripción del número, tamaño y uso de los


registros de un microprocesador se le conoce como el
modelo de programación del microprocesador.
Registros del 8086
Registros de propósito General
Se utilizan en la forma en que lo desee el programador.

AX, AH, AL (Acumulador): a menudo conserva el resultado


temporal después de una operación aritmética o lógica.

BX, BH, BL (Base): Se utiliza para guardar la dirección base de


listas de datos en la memoria.

CX, CH, CL (Contador): Contiene el conteo para ciertas


instrucciones de corrimientos y rotaciones, de iteraciones en el
ciclo loop y operaciones repetidas de cadenas.

DX, DH, DL (Datos): Contiene la parte más significativa de un


producto después de una multiplicación; la parte más
significativa del dividendo antes de la división.
Registros Apuntadores e Índices
SP (Apuntador de pila): Contiene el desplazamiento con respecto al
segmento de pila del tope de la pila del programa.

BP (Apuntador de base): Contiene el desplazamiento con respecto al


segmento de pila de datos almacenados en la pila de un programa.

SI (Índice fuente): Contiene el desplazamiento con respecto al


segmento de datos de un elemento de un arreglo o cadena.

DI (Índice destino): Contiene el desplazamiento con respecto al


segmento extra de un elemento de una cadena o arreglo.

IP (Apuntador de instrucciones): Contiene siempre el


desplazamiento con respecto al segmento de código de la localidad
de memoria que contiene la siguiente instrucción que va a ejecutar
el microprocesador.
Registros de Segmentos
CS (Código): Tiene la dirección lógica del segmento en que se encuentra el
código de un programa. Si el código ocupa más de un segmento, contiene la
dirección lógica de uno de los segmentos.

DS (Datos): Tiene la dirección lógica del segmento en que se encuentran los


datos estáticos de un programa. Si los datos ocupan más de un segmento,
contiene la dirección lógica de uno de los segmentos.

ES (Extra): Este registro también tiene la dirección lógica de uno de los


segmentos en que se encuentran los datos estáticos de un programa. Este
registro se utiliza en ciertas operaciones del microprocesador para el manejo
de cadenas.

SS (Pila): Tiene la dirección lógica del segmento en que se encuentran la pila


del sistema. La pila no puede ser mayor a un segmento.
Registro de Banderas
C (Acarreo): Indica un acarreo después de una suma o un préstamo después de una
resta.

P (Paridad): 0 = Impar y un 1 = par.

A (Acarreo auxiliar): Esta bandera sólo se utiliza en las operaciones daa y das.

Z (Cero): Z = 1 si el resultado de una operación aritmética o lógica es cero y si Z = 0,


el resultado no es cero.

S (Signo): Si S = 1, el resultado es negativo. Si S = 0, el resultado es positivo.

O (Sobreflujo): Es una condición que ocurre cuando se suman o se restan números


con signo.
Continuacion
T (Trampa): Activa, si se pone a 1, o desactiva, si se pone a 0, el modo de
ejecución paso a paso. Este modo es utilizado por los depuradores para
ejecutar las instrucciones una a la vez y permitir observar el efecto de la
instrucción sobre los registros y la memoria.

I (Interrupción): Habilita, si se pone a 1, o deshabilita, si se pone a 0, las


interrupciones al microprocesador. El estado de esta bandera se controla
con las instrucciones sti (habilitar interrupciones) y cli (desactivar las
interrupciones).

D (Dirección): Controla la selección de autoincremento o auto decremento


de los registros DI o SI durante las instrucciones de cadenas y arreglos. Si D
= 1 hay auto decremento en los registros y si D = 0 hay autoincremento.

El estado de esta bandera se controla con las instrucciones std (habilitar


dirección) y cld (desactivar dirección).
Declaraciones de Segmentos

nomseg: Nombre definido por el usuario.

alineamiento: Este atributo especifica el limite físico donde el LINK debe establecer
este segmento en memoria (MASM pasa esta información al LINK en el archivo
objeto), Si no se especifica ningún alineamiento este se asume como PARA Estos
pueden ser:

BYTE: El segmento se establece en el siguiente byte disponible.

WORD: El segmento se establece en la siguiente palabra disponible.

DWORD: El segmento se establece en la siguiente palabra doble disponible.

PARA: El segmento se establece en el siguiente párrafo disponible.

PAGE: El segmento se establece en la siguiente pagina (256 bytes) disponible.


combinación: Este atributo describe como el LINK debe combinar los segmentos
lógicos con nombres indeciso en un solo segmento físico. Los posibles atributos de
combinación son los siguientes:

PUBLIC o MEMORY: Todos los segmentos con cualquiera de estos atributos de


combinación, que contengan el mismo nombre de segmento serán encadenados
en un solo segmento físico.

COMMON: Todos los segmentos con este atributo de combinación y el mismo


nombre de segmento, el LINK comenzara estos segmentos lógicos con el mismo
nombre en la misma dirección de memoria física, tal que los segmentos lógicos se
encuentran traslapados.

STACK: Este atributo de combinación indica que todos los segmentos con este
atributo de combinación serán encadenados en uno solo , el registro SS contendrá
la dirección de este segmento y SP el tamaño de este segmento cuando DOS carga
el programa antes de ejecutarlo.
AT xxxx : Este atributo de combinacion no define mas datos al programa, solamente
nos permite hacer referencia a una dirección especifica de memoria por medio de
nombres simbolicos, xxxx es la dirección fija de memoria que se le asignara a este
segmento.

tipo de clase: La clase de segmento especificada entre comillas simples. Cuando el


LINK acomoda los segmentos, establece los segmentos que pertenecen al mismo
tipo de clase, uno despues de otro. La mayoria de los programas en MASM usan
los tipos de clase:

'CODE' Para los segmentos de codigo.


'DATA' Para los segmentos de datos.
'STACK' Para los segmentos de stack.
Esto ayuda a tener los segmentos de codigo, datos y stack en forma
contigua respectivamente.
Algunas veces cuando se hacen subrutinas para lenguajes de alto nivel el
tipo de clase debe ser el especificado por el lenguaje de alto nivel.

Programas EXE
Ejemplo de la declaración de los segmentos:
Etiquetas: Nombres que se les asignan a las direcciones de cualquier instrucción o
localización de memoria. Una etiqueta toma el lugar de una dirección. Tan pronto
como el ensamblador encuentra una etiqueta , esta es remplazada por la dirección
correcta:

Hacer un salto a la dirección 0110.


Hacer un salto a la dirección donde se encuentra la etiqueta inicio, una vez que el
programa se ensamble suponiendo que la etiqueta INICIO se encuentra en el
offset 0110. Este JMP INICIO será remplazado por un JMP 0110.
Directivas: Estas son instrucciones para el ensamblador, estas no generan código
como las instrucciones del procesador, pero indican al ensamblador y al editor de
encadenamiento como debe generar código.
Ejemplos de directivas:

Declaración de segmentos y atributos.

ASSUME: Esta directiva indica el nombre del segmento que el registro de dirección.

ORG: Para establecer la localización del contador del valor numérico que se darán
a las etiquetas.
ORG 100h Indica que ensamble código a partir del offset 100h , esta directiva es
necesaria para los programas COM.

END: Para marcar el final de un archivo fuente e indicar el punto de entrada del
programa, esta dirección será cargada a los registros CS:IP cuando el programa
entre en ejecución.
Declaración Simplificada de Segmentos

Esta comienza con la directiva .MODEL, la cual indica el modelo de memoria, el


cual indica como se direccionarán las instrucciones y datos, los modelos de
memoria pueden ser los siguientes:

El modelo de memoria mas utilizado es el Small el cual tiene un segmento de


código y un segmento de datos.
Modos de Direccionamiento

En la búsqueda de una instrucción, su dirección se obtiene sumando el


desplazamiento, contenido en el IP, al valor del registro de segmento CS,
multiplicado por 16.

Normalmente al terminar la ejecución de una instrucción, el IP se incrementa, con


lo que se pasa a direccionar la siguiente instrucción. Las instrucciones de salto y
salto a subrutinas pueden modificar el contenido de IP de tres formas diferentes:

• Por direccionamiento relativo. Al contenido del IP se suma, de forma inmediata,


un desplazamiento de 8 a 16 bits, con signo, proporcionado por la misma
instrucción.

• Por direccionamiento directo. Se carga, en el IP, una nueva dirección presente en


la instrucción.

• Por direccionamiento indirecto. El dato, obtenido por cualquiera de las formas de


direccionado de la memoria de datos, es interpretado por las instrucciones de
salto, como la dirección a la que se debe saltar.
Modos de direccionamiento de la memoria de Programas

En la búsqueda de una instrucción, su dirección se obtiene sumando el


desplazamiento, contenido en el IP, al valor del registro de segmento CS,
multiplicado por 16.

Normalmente al terminar la ejecución de una instrucción, el IP se incrementa, con


lo que se pasa a direccionar la siguiente instrucción. Las instrucciones de salto y
salto a subrutinas pueden modificar el contenido de IP de tres formas diferentes:

• Por direccionamiento relativo. Al contenido del IP se suma, de forma inmediata,


un desplazamiento de 8 a 16 bits, con signo, proporcionado por la misma
instrucción.

• Por direccionamiento directo. Se carga, en el IP, una nueva dirección presente en


la instrucción.

• Por direccionamiento indirecto. El dato, obtenido por cualquiera de las formas


de direccionado de la memoria de datos, es interpretado por las instrucciones de
salto, como la dirección a la que se debe saltar.
Modos de direccionamiento de la memoria de datos.
Modo inmediato. El operando se proporciona en el byte o bytes que siguen al
código de operación de la instrucción.

Ejemplo: ADD CX,385Fh

Modo de direccionado por registro. Un registro, definido por la instrucción,


contiene el operando.

Ejemplo: ADD CX,AX


Modo directo. El byte o par de bytes que siguen al código OP de la instrucción dan
el desplazamiento de 8 ó 16 bits, que, sumado al contenido del registro DS,
determina la dirección efectiva en la que se encuentra el dato a transferir.

Ejemplo: ADD CL,TABLA


Modo directo indexado. El byte o par de bytes que siguen al código OP
representan un desplazamiento que se suma al contenido de uno de los registros
índice (DI o SI). El contenido de DS se añade al resultado de la suma, con lo que se
obtiene la dirección del operando.

Incrementando o decrementando los registros índice, se puede acceder a posiciones de


memoria consecutivas.

Ejemplo: ADD CX, [SI+4]

• Modo indirecto. La dirección del operando es el contenido de uno de los siguientes


registros: BP, BX, DI o SI.

Ejemplo: ADD CX, [BX]

• Por registro base indexado. El desplazamiento que ha de sumarse a un registro segmento


se halla sumando el contenido de un registro índice y un desplazamiento de 8 ó 16 bits,
contenido en la instrucción, al contenido de un registro base.

Ejemplo: MOV AX,TABLA[BX][SI]


• Modo relativo a base: El byte o par de bytes que siguen al código OP representan un
desplazamiento que se suma al contenido de uno de los registros base (BX o BP). El
contenido de DS se añade al resultado de la suma, con lo que se obtiene la dirección del
operando.

Ejemplo: MOV AX, [BP]+4


Conjunto de Instrucciones
A semejanza con otros microprocesadores, las instrucciones del 8086 pueden
clasificarse en tres grupos, según la definición que se utilice para los operando:

• Sin operando. Por ejemplo, CLI, STI, DAA, WAIT, etc.

• Con un sólo operando. Por ejemplo, JMP, PUSH, CALL, etc.

• Con dos operandos. Por ejemplo, MOV.

Las instrucciones varían de 1 a 6 bytes en longitud. Los desplazamientos y los datos


inmediatos pueden tener 8 ó 16 bits dependiendo de la instrucción. El código de
operación y el modo de direccionamiento se encuentran en los primeros uno o dos
bytes de la instrucción. Estos pueden ir seguidos por:

• Ningún byte adicional.


• Una EA de 2 bytes ( sólo para direccionamiento directo ).
• Un desplazamiento de 1 ó2 bytes.
• Un operando inmediato de 1 ó 2 bytes.
• Undesplazamientode1ó2bytesseguidosdeunoperandoinmediatode1ó2 bytes.

• Un desplazamiento de 2 bytes y una dirección de un segmento de 2 bytes (sólo


para direccionamientos fuera del segmento ).

El código de operación, que generalmente es el primer byte de la instrucción


(aunque hay algunas veces en las que este byte designa un registro y otras en las
que 3 bits del código de operación están en el segundo byte), es el encargado de
determinar la operación, informando a su vez del tamaño de los operandos.

En la mayoría de los códigos de operación hay indicadores especiales de 1 bit. Estos


indicadores son:

Bit W. Nos informa del tamaño de los operandos, es decir, si se trata de byte o
palabra. Con W = 0 estamos accediendo a un byte y con W = 1 a una palabra. Bit D.
Este bit es utilizado con instrucciones de dos operandos, salvo en los casos en que
uno de los operando debe ser un registro especificado en el campo REG.

Este bit nos informa si el registro especificado en el campo REG se trata del
operando fuente u operando destino de instrucción especificada por el código de
operación.
Para D = 0, el registro indicado por el campo REG es el operando fuente y para D =
1, el registro indicado por el campo REG es el operando destino.

Bit S. El bit S aparece junto con el bit W en instrucciones de suma inmediata


registro / memoria, resta y comparación. El bit S indica el tamaño del dato u
operando inmediato, el bit W nos indica el tamaño del dato u operando destino. Si
SW es 00, tanto la fuente como destino tienen 8 bits, es decir, se trata de una
operación de 8 bits; Si SW es 11 se trata de una operación de 16 bits con un
operando inmediato de 16 bits con extensión de signo; Si SW es 01 indica una
operación de 16 bits con un operando inmediato de 8 bits con extensión de signo.

Bit V. Utilizado por instrucciones de desplazamiento y rotación para determinar el


número de desplazamientos.

Bit Z. Utilizado para instrucciones REP.


Como se puede apreciar en estas tablas se podría producir ambigüedad al
representar, por ejemplo, 00 para indicar el registro de segmento ES, 000 para
indicar AX y a su byte de menor orden AL , pero esto no sucede ya que el código de
operación implica el tipo de registro que indica.
Cuando el código de operación y el modo de direccionamiento ocupan 2 bytes pueden
verse representado de las dos formas siguientes:

El primero de los casos es para instrucciones de un sólo operando o bien instrucciones de


dos operandos pero uno de ellos implícito en el código de operación.

El segundo de los casos se trata de instrucciones de dos operandos, en cuyo caso uno de
ellos viene especificado por el campo REG y el otro operando viene especificado por los
campos MOD y R/M que pueden indicar un registro o bien una posición de memoria.

A continuación se especifica una tabla donde quedan reflejados los modos de


direccionamiento y registros de segmento por defecto para varias combinaciones de los
campos MOD y R/M.
Viendo esta tabla podemos apreciar que según la combinación de MOD y R/M tendremos
diferentes posibilidades para el segundo operando. Como anteriormente se ha indicado
este segundo operando puede ser un registro o una posición de memoria, que
principalmente va a estar en función del campo MOD. Si MOD = 11 nos indica que se trata
de un registro, pudiendo ver de que tipo de registro se trata según la combinación de R/M.

Si MOD es distinto de 11 nos indica una posición de memoria y la dirección efectiva se


calcula según las tablas. Si nos fijamos en MOD = 00 esto significa que no hay
desplazamiento a menos que R/M = 110, lo que implicaría direccionamiento directo.

Si MOD = 01 indica que el tercer byte de la instrucción contiene un desplazamiento de 8 bits


que se extiende automáticamente a 16 ( extensión de signo ) antes de ser usado para
calcular la dirección efectiva, y MOD = 10 indica que los bytes tercero y cuarto contienen un
desplazamiento de 16 bits.

Podemos observar en la tabla el registro de segmento que es utiliza para cada una de las
combinaciones de MOD y R/M. Aunque la dirección efectiva de un operando en memoria
está determinada por los campos MOD y R/M, la dirección física de 20 bits se obtiene,
como ya vimos, sumando la dirección efectiva y el contenido de un registro de segmento
multiplicado por 16.
• El CS se utiliza siempre como registro de segmento para el cálculo de la próxima
instrucción que se va a ejecutar.

• Cuando se utiliza SP siempre se utiliza SS como registro de segmento.

• Para operaciones con cadenas siempre se utiliza ES como registro de segmento del
operando destino.

Para examinar con más claridad las instrucciones máquina del 8086, vamos a ver unos
ejemplos con la instrucción suma ( ADD ). Una suma ( ADD ) provoca que el contenido de la
posición indicada para el operando fuente sea sumado al contenido de la posición indicada
para el operando destino, y que la suma reemplace a ésta última.

Esta instrucción puede adoptar uno de los tres formatos que se muestran el la siguiente
figura, dependiendo del modo de direccionamiento.

a) Suma de un registro con un registro o con memoria, y almacenamiento del resultado en


un registro o en una memoria.
b) Suma inmediata con registro (memoria) y colocación del resultado en un
registro (memoria).

• El campo DESP puede ocupar uno o dos bytes, dependiendo del campo MOD.

* El byte alto del campo DAT es opcional, y estará presente si S:W = 01.

c) Suma inmediata con AX(AL) y almacenamiento del resultado en AX(AL). Caso


especial para el acumulador.

* El byte DATO de mayor orden es opcional, dependiendo de si W = 1.


DIAGRAMA DE CONEXIONADO DEL 8086. SEÑALES Y TERMINALES.

El 8086 puede configurarse de dos formas distintas: el modo máximo y el modo mínimo. El
modo queda determinado al colocar el terminal MN/MX a tierra o a la tensión de
alimentación.
En modo mínimo no admite la multitarea, mientras que en modo máximo es
capaz de soportar un bus local, para ampliar directamente el 8086, y un bus de
sistema MULTIBUS, que permite configuraciones con varios procesadores, más
concretamente el 8086 debe estar en modo máximo si quiere trabajar en
colaboración con el procesador de datos 8087 y el procesador de entrada / salida
8089.

En el modo máximo, el 8086 depende de otros chips adicionales como es el


controlador de bus 8288 para generar el conjunto completo de señales de control
de bus. El modo mínimo permite al 8086 trabajar de una forma más autónoma.
En ambos modos, las señales del 8086 se pueden agrupar de la siguiente manera:
• Alimentación.
• Reloj.
• Control y estado.
• Direcciones.
• Datos.

Hay tres terminales para la alimentación: tierra ( GND ) en los terminales 1 y 20, y una
tensión de entrada de 5 voltios ( Vcc ) en el terminal 40. El terminal de tierra es tierra a la
vez para la alimentación y para las señales.

Cuenta con una entrada de la señal de reloj ( CLK ) en el terminal 19.

El 8086 cuenta con 20 bits de dirección. Los 4 bits más significativos de la dirección
comparten terminales con algunas de las señales de estado. Los 16 bits menos significativos
son multiplexados tanto para las direcciones como para los datos, es decir, en ciertos
instantes tales terminales conducen parte de una dirección, y en otros son transmitidos los
datos.

Estos terminales pueden llevar información de una dirección e información sobre el estado
y los datos. El latch 8282 está diseñado para seleccionar la información sobre la dirección de
dichos terminales en el instante preciso e ignorar lo referente al estado y los datos.
EL LENGUAJE ENSAMBLADOR.

El lenguaje ensamblador es la forma más básica de programar un microprocesador para que


éste sea capaz de realizar las tareas o los cálculos que se le requieran.

El lenguaje ensamblador es conocido como un lenguaje de bajo nivel, esto significa que nos
permite controlar el 100 % de las funciones de un microprocesador, así como los periféricos
asociados a éste.

Ventajas del lenguaje ensamblador:

 Velocidad de ejecución de los programas


 Mayor control sobre el hardware de la computadora
 Desventajas del lenguaje ensamblador:
 Repetición constante de grupos de instrucciones
 No existe una sintaxis estandarizada
 Dificultad para encontrar errores en los programas (bugs)
La descripción del programa es como sigue:
1.- Las declaraciones SEGMENT y ENDS definen los segmentos a usar.
2.- La variable SALUDO en el segmento DATA, define la cadena a ser desplegada. El signo del
dolar al final de la cadena (denominado centinela) es requerido por la función de
visualización de la cadena de MS-DOS. La cadena incluye los códigos para carriage-return y
line-feed.
3.- La etiqueta START en el segmento de código marca el inicio de las instrucciones del
programa.
4.- La declaracion DW en el segmento de pila define el espacio para ser usado por el stack del
programa.
5.- La declaración ASSUME indica que registros de segmento se asociarán con las etiquetas
declaradas en las definiciones de segmentos.
6.- Las primeras dos instrucciones cargan la dirección del segmento de datos en el registro DS.
Estas instrucciones no son necesarias para los segmentos de código y stack puesto que la
dirección del segmento de código siempre es cargado en el registro CS y la dirección de la
declaración del stack segment es automáticamente cargada en el registro SS.
7.- Las últimas dos instrucciones del segmento CODE usa la función 4CH de MS-DOS para
regresar el control al sistema operativo. Existen muchas otras formas de hacer esto, pero ésta
es la más recomendada.
8.- La directiva END indica el final del código fuente y especifica a START como punto de
arranque.
USO DE MARCOS Y PROCEDIMIENTOS.

La manera más fácil de modularizar un programa es dividirlo en dos o más partes.


Para esto, es necesario que datos, símbolos, y demás valores de un módulo sean
reconocidos por el otro u otros módulos. Para este tipo de declaraciones globales existen
dos directivas:
PUBLIC nombre,,, que hace la variable, etiqueta o símbolo absoluto disponible para todos
los programas.
EXTRN nombre:tipo,,, que especifica una variable, etiqueta o símbolo externos
identificados por nombre y tipo (que puede ser BYTE, WORD, DWORD, QWORD, TBYTE,
NEAR, FAR, o ABS, éste último para números absolutos).

La declaración de macros se hace a través de las directivas MACRO y ENDM. Su sintaxis es:

nombre MACRO [parámetros,,,>


declaraciones
ENDM
parámetros son los valores que se substituirán en la macro cada vez que se haga referencia
a ésta.
Para la definición de procedimientos se emplean las directivas PROC y ENDP. Su sintaxis es:

nombre PROC [distancia>


sentencias
nombre ENDP
distancia, que puede ser NEAR (default) o FAR permiten indicar el tipo de acciones a realizar
en brincos y llamados a subrutinas. nombre se puede usar como dirección en llamados o
brincos.

INTERRUPCIONES.

Lla PC esta constituida lógicamente por su BIOS sistema operativo. La mayoría de las rutinas
que controlan al computador están grabadas en el ROM del BIOS, aunque muchas rutinas
son establecidas por el sistema operativo y se cargan en RAM al momento de encender al
computador. Estas rutinas son denominadas interrupciones y son activadas mediante la
instrucción: INT número. Una interrupción es una operación que invoca la ejecución de una
rutina específica que suspende la ejecución del programa que la llamó, de tal manera que el
sistema toma control del computador colocando en el stack el contenido de los registros CS
e IP.
El programa suspendido vuelve a activarse cuando termina la ejecución de la interrupción y
son restablecidos los registros salvados. Existen dos razones para ejecutar una interrupción:
(1) intencionalmente como petición para la entrada o salida de datos de un dispositivo, y (2)
un error serio y no intencional, como sobreflujo o división por cero.

El operando de una interrupción indica cúal es la rutina a activar. La dirección de la rutina es


localizada por medio de una tabla que el sistema mantiene a partir de la dirección
0000:0000h. Existen 256 entradas de 4 bytes de longitud, y cada interrupción proporciona
varias funciones. Las interrupciones de 00h a 1Fh correponden al BIOS y de 20h a FFh son
del DOS y BASIC. El apéndice F proporciona una lista de las interrupciones para equipo XT.

ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR


Un programa en lenguaje ensamblador se compone de las siguientes partes:
 Área de comentarios
 Definición del modelo de memoria
 Área de datos
 Cuerpo del programa

El área de comentarios sirve para incluir comentarios acerca del programa


que se está elaborando, comienza con la directiva .COMMENT y el
comentario es colocado entre
dos caracteres ‘*’.

La definición del modelo de memoria es la parte donde se indica que tipo


de código se va generar (16 o 32 bits). En este trabajo sólo se escribirán
programas ejecutables .COM, por lo que siempre se usa la directiva
.MODEL TINY.
El área de datos es el lugar donde deben ser declaradas las constantes y
variables del programa. Las variables son declaradas después de la
directiva .DATA y las constantes después de .CONST.

En el cuerpo del programa es donde se colocan las instrucciones en


lenguaje ensamblador que se encargarán de realizar las tareas deseadas. El
cuerpo del programa comienza con la directiva .CODE y termina con la
directiva END. Esta parte corresponde al Begin y End de un programa en
lenguaje Pascal.

Adicionalmente se debe indicar un punto de entrada al programa. El punto


de entrada se indica por medio de una etiqueta antes de la primer
instrucción real del programa. En el ejemplo anterior el punto de entrada es
INICIO: y el punto final de las instrucciones se indica por medio de la
instrucción END INICIO.
Cuando se requiere comentar las instrucciones de un programa, se debe
colocar un punto y coma (;) y así el ensamblador interpreta todo lo que
sigue como un comentario de una sola línea. Si requiere comentarios de
más de una línea puede usar la directiva
.COMMENT.
INSTRUCCIONES DE TRANSFERENCIA DE DATOS

Los microprocesadores 80x86 cuentan con algunas instrucciones básicas de transferencia de


información de acuerdo con los modos de direccionamiento. Las instrucciones más
representativas del grupo de transferencia son:

MOV.- Transfiere (copia) contenidos. Su formato es MOV OP1,OP2. Esta instrucción copia el
contenido de OP2 en OP1. Ejemplo:
Mov AX,0 ; AX=0

LEA.- Carga un registro con la dirección de desplazamiento de alguna variable en memoria.


Su formato es LEA REG,Variable. Ejemplo:
.Data
Mensaje db ‘Hola’,’$’
.Code
----------
----------
XCHG.- Intercambia contenidos. Su formato es XCHG OP1,OP2. El resultado es que el
contenido de OP2 se pasa a OP1 y el de OP1 se pasa a OP2.

Ejemplo:
XCHG AX,BX ; AX->BX, BX->AX
COMMENT
*Programa: Trans1.ASM
Descripción: Este programa ilustra es uso de las operaciones para transferencia de datos.
El programa realmente no hace nada que sea visible al usuario, es solo con fines
ilustrativos.
*
.MODEL tiny
.DATA
Array1 db 10 dup (0) ;Arreglo de 10 elementos inicializados en cero.
.CODE
inicio: ;Punto de entrada al programa
mov AX,10 ;Copiar el número 10 dentro de AX
mov BX,5 ;Copiar le número 5 dentro de BX
lea DX,Array1 ;DX contiene la dirección efectiva de Array1[0]
xchg AX,BX ;Intercambiar los valores contenidos en AX y BX
mov ax,4C00h ;Terminar programa y salir al DOS
int 21h
END inicio
Instrucciones aritméticas
Existen 8 instrucciones aritméticas básicas: ADD (Suma), SUB (Resta), MUL (Multiplicación sin
signo), DIV (División sin signo), IMUL (Multiplicación con signo), IDIV (División con signo), INC
(Incremento unitario) y DEC (Decremento unitario).
Las instrucciones ADD y SUB permiten realizar sumas y restas sencillas y tienen el siguiente
formato:

ADD Destino, Fuente

SUB Destino, Fuente

Ejemplos:

ADD AX,BX ;AX=AX+BX

ADD AX,10 ;AX=AX+10

SUB AX,BX ;AX=AX-BX

SUB AX,10 ;AX=AX-10


En las operaciones de suma y resta el resultado siempre es almacenado en el operando de
destino, el cual puede ser un registro o una variable.
Las instrucciones INC y DEC permiten incrementar los contenidos de los registros y de las
variables almacenadas en memoria.

Ejemplos:

INC AX ;AX=AX+1

INC VAR1 ;VAR1=VAR1+1

DEC AX ;AX=AX-1

DEC VAR1 ;VAR1=VAR1-1

Ejemplo: El siguiente programa muestra la forma de utilizar estas instrucciones básicas:

.COMMENT
*Programa: Addsub.ASM
Descripción: Este programa ilustra el uso de las instrucciones ADD, SUB, INC y DEC.
*MODEL TINY
.DATA
.DATA
Var1 DW 10 ;Declaración de una variable de tipo entero
;inicializada con 10.
.CODE
Inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX=10
Add AX,BX ;AX=AX+BX
Mov CX,8 ;CX=8
Add CX,Var1 ;CX=CX+Var1
Inc AX ;AX=AX+1
Dec BX ;BX=BX-1
Inc Var1 ;Var1=Var1+1
Dec Var1 ;Var1=Var1-1
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ;
END Inicio
END
Por otro lado, las operaciones de multiplicación y división son un poco más complejas de
utilizar, esto se debe a que debemos tomar en cuenta el tamaño de los operandos para no
sobrepasar la capacidad de almacenamiento de los registros del microprocesador.

Existen dos instrucciones para la multiplicación, estas son: MUL e IMUL. MUL permite
realizar operaciones de multiplicación entre operandos sin signo e IMUL permite realizar
operaciones entre operandos con signo.

En la multiplicación de 8 bits, con o sin signo, el multiplicando está siempre en el registro AL.
El multiplicador puede ser cualquier registro de 8 bits o cualquier variable. El resultado de la
multiplicación se almacena en el registro AX, que es de doble ancho que los operandos
involucrados.

Ejemplos válidos de operaciones de multiplicación son los siguientes:


MOV BL,5 ;Cargar datos
MOV AL,10 ;
MUL BL ; AX=AL*BL
MOV AL,10
MUL número1 ; AX=AL*número1
; donde número1 es una variable de tipo byte.

También podría gustarte