Apuntes de Lenguajes de Interfaz

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 83

Instituto Tecnológico de Ciudad

Madero

Capítulo I.

Organización de la
computadora digital.

1
1.1.- Introducción.

La organización de una computadora digital y su arquitectura están íntimamente


relacionadas; sin embargo, son dos conceptos diferentes que muchas veces se toman como
sinónimo.

La organización de una computadora digital se refiere a las unidades lógicas que la


componen (como la Unidad Central de Proceso, la Unidad de Memoria y la Unidad de
Entrada/ Salida), las funciones que realizan, su operación y la forma en que se relacionan y
se comunican unas con otras.

La arquitectura de las computadoras se enfoca en la forma de construir cada una de


estas unidades lógicas para que realicen las funciones especificadas por su organización, así
como la manera en que estas unidades van a comunicarse para interactuar entre ellas.

1.2.- Organización de una computadora.

Una computadora digital, en su forma más simple, consta de una Unidad Central de
Proceso, una Unidad de Memoria y una Unidad de Entrada/ Salida. Estas unidades están
interconectadas mediante un conjunto de líneas de comunicación que recibe el nombre de
BUS.

La Unidad Central de Proceso (CPU) internamente contiene la Unidad de Control


(CU), la Unidad Aritmética/ Lógica (ALU) y varios registros. Esta organización básica se
muestra en forma esquemática en la figura. 1.1.

2
Figura 1.1. Organización Básica.
Dentro del BUS existen líneas para dirección, datos y señales de control.

1.2.1.- Unidad de Memoria.

La unidad de memoria está organizada como un conjunto de celdas, conocidas


también como palabras, cada una de las cuales pueden almacenar un dato o una instrucción.
Las celdas de la memoria tienen asociada una dirección única. Las direcciones de memoria
están asignadas en forma secuencial empezando con la dirección “0”.

Pueden realizarse dos tipos de operaciones sobre la unidad de memoria. Estas


operaciones son lectura de memoria y escritura a memoria. Para esto, la unidad de memoria
tiene varias líneas las cuales se conecta al BUS.

Un conjunto de líneas sirve para especificar la dirección de una celda, otro conjunto
sirve para transferir el dato que se desea leer o escribir en esa celda y otras líneas se usan
para indicar el tipo de operación que se desea realizar. Existen, además, otras líneas que se
utilizan para controlar y sincronizar la operación de la memoria con el resto de la
computadora digital.

Una operación de lectura de la unidad de memoria permite obtener el dato o código de


instrucción que se encuentra almacenado en una celda particular de la memoria. Cuando se
desea leer un dato o una instrucción de una celda específica, las líneas de dirección deben
tener la dirección de la celda de memoria cuyo contenido se desea obtener, la línea de
lectura se activa (indicando este tipo de operación) y las líneas de sincronización controlan
el inicio de la operación.

Cuando la unidad de memoria termina de realizar la operación de lectura, coloca en


las líneas de transferencia de datos una copia del contenido de la celda de memoria cuya
dirección se especificó mediante la línea de dirección. El contenido de la celda de memoria
no se modifica.

Una operación de escritura a la unidad de memoria permite almacenar un dato o una


instrucción en una celda en particular de la unidad de memoria. El dato o instrucción que
contiene la celda de memoria antes de realizar la operación de escritura será reemplazado
con el dato o instrucción que se desea almacenar en dicha celda, perdiéndose el contenido
original.

Para realizar este tipo de operación sobre la memoria, las líneas de dirección deben
tener la dirección de la celda en la cual se desea almacenar el dato o la instrucción, que se
desea guardar y las líneas de transferencia de datos deben tener el dato o instrucción que se
desea guardar y la línea de escritura se activa. Cuando se inicia la operación mediante las
líneas de sincronización, la unidad de memoria almacena el dato o la instrucción en la celda
de memoria especificada.

3
1.2.2.- Unidad Central de Proceso (CPU).

La función de la unidad central de proceso es ejecutar instrucciones para procesar


datos y controlar toda la operación de la computadora digital. Para realizar las funciones de
control, la unidad central de proceso cuenta precisamente con una unidad de control (CU)
que es la que se encarga de coordinar la ejecución de las instrucciones y la transferencia de
datos entre las diferentes unidades de la computadora.
Para realizar las operaciones aritméticas y lógicas, la unidad central de proceso
contiene la unidad aritmética y lógica (ALU).

1.2.3.- Registros.

La unidad central de proceso también cuenta con una serie de registros utilizados para
ciertos propósitos. Un registro es una celda similar a una de las celdas de memoria y puede
almacenar un dato o una instrucción, dependiendo del registro de que se trate.

1.2.4.- Unidades de Entrada/ Salida.

Para que un usuario de una computadora digital pueda ver y analizar los resultados de
un programa, es necesario que se envíen a algún dispositivo periférico como una pantalla
de video o una impresora. Cada dispositivo periférico debe tener asignada una dirección
única para poder identificarlo.
La forma en que estos datos serían enviados al dispositivo es similar a la forma en que
se guardarían en la unidad de memoria.

Dentro del bus existen líneas que indican si la operación de lectura o escritura debe
ser realizar por la unidad de memoria o por la unidad de entrada/ salida.

1.3.- Interconexión de BUS.


Un BUS es una vía de comunicación que conecta a dos o más dispositivos. Una
característica clave del bus es que es un medio de transmisión compartido. Múltiples
dispositivos se conectan al bus y están disponible una señal transmitida por cualquier
dispositivo para la recepción de todos los otros dispositivos conectados al bus. Si dos
dispositivos transmiten durante el mismo periodo de tiempo, sus señales se trasplantan y su
información será engañosa (basura). Por lo tanto, solo dispositivo puede transmitir con
éxito a la vez.

1.3.1.- Estructura de Bus.

Aunque hay diferentes diseños de bus, las líneas de cualquier bus pueden clasificarse
en tres grupos de función (fig. 1.2): datos, dirección y líneas de control. Además existen
líneas de distribución de potencia que suministran energía a los módulos conectados.

4
Figura 1.2. Buses principales de una computadora.

Las líneas de datos proporcionan un camino para mover los datos entre los módulos
del sistema. Estas líneas se llaman en conjunto, el “BUS DE DATOS”. El bus de datos
consta de por ejemplo 8, 16, o 32 líneas separadas, a este número de líneas se hacen
referencia como la “anchura del bus de datos”.

5
Como cada línea puede llevar sólo un bit a la vez, el número de líneas determina el
número de bits que pueden transferir a un tiempo. La anchura del bus de datos es un factor
clave para determinar la ejecución general del sistema.

Por ejemplo, si el bus de datos es de 8 bits de ancho y cada instrucción es de 16 bits


de longitud, entonces la CPU debe acceder dos veces el módulo de memoria durante cada
ciclo de instrucción.

Las líneas de dirección se utilizan para designar el origen o el destino de los datos en
el bus de datos. Por ejemplo, si la CPU desea leer una palabra de datos (8,16,32 bits) de la
memoria, coloca la dirección de la palabra deseada en la línea de dirección. Es claro que la
anchura del bus de direcciones determina la máxima capacidad posible de memoria del
sistema, aplicado la siguiente ecuación:

Cantidad de memoria direccionable = 2N

Donde:
N= Número de líneas del bus de dirección.

Además, por general las líneas de dirección son empleadas también para direccionar
los puertos de E/S.

Las líneas de control se utilizan para controlar el acceso y el uso de los datos y las
líneas de dirección. Puesto que los datos y las líneas de dirección se comparten por todos
los componentes, debe existir un medio para controlar su uso. Las señales de control
transmiten tanto el comando como la información de temporización entre módulos del
sistema. Las señales de temporización indican la validez de los datos y de la información de
dirección. Las señales de comando especifican las operaciones a efectuarse. Es común que
las líneas de control incluyan:

 Lectura de memoria: Causa que se coloquen en el bus los datos de la localidad


direccionada.

 Escritura a E/S: Causa que los datos que están en el bus salgan hacia el puerto de
E/S direccionando.

 Lectura de E/S: Causa que se coloquen en el bus los datos del puerto de E/S
direccionar.

6
 Solicitud de interrupción: Indica que una interrupción esta pendiente.

 Reloj: Se utiliza para sincronizar operaciones.

 Reinicializar: Inicializa todos los módulos.

En el aspecto físico, en bus del sistema es un número de conductores eléctricos


paralelos. Estos conductores son líneas de metal grabadas en una tarjeta o tablero ( tarjeta
con circuito impreso).

El bus se extiende a través de todos los componentes del sistema, cada uno de los cuales
se conecta a algunos o todas las líneas del bus. Un arreglo físico muy común se describe en
la figura 1.3.

BUS

CPU

MEMORIA

E/S

Figura 1.3. Realización física típica de una arquitectura de bus.

1.3.2.- Tipos de buses.

Las líneas de buses pueden separarse en dos tipos genéricos: “dedicadas” y


“multiplexadas”. Una línea de bus dedicada se asigna permanentemente ya sea a una
función o a un subconjunto físico de componentes de la computadora.

7
Un ejemplo de dedicación funcional es el uso de líneas de dirección y de datos separados
dedicados, lo cual es común para muchos buses. Sin embargo, la información de datos y de
dirección puede transmitirse sobre el mismo conjunto de líneas usando una línea de control de
dirección valida.

A este método de usar las mismas líneas para múltiples propósitos se le conoce
como multiplexeo en tiempo.

La ventaja del multiplexeo en tiempo es el uso de muy pocas líneas, lo cual ahorra
espacio y, casi siempre, costo. La desventaja es que se necesita circuitería más compleja
dentro de cada módulo. También hay una disminución potencial en el desempeño ya que
ciertos sucesos que comparten las mismas líneas no pueden tener lugar en paralelo.

Dedicación física se refiere al uso de múltiples buses, cada uno de los cuáles
conecta solo un subconjunto de módulos. Un ejemplo característico es el uso de un bus de
E – S para interconectar todos los módulos de E – S; este bus se conecta al bus principal
por medio de algún tipo de módulo adaptador de E – S. La ventaja potencial de la
dedicación física es un rendimiento alto, debido a que hay menos contención de bus. Una
desventaja, sin embargo, es el incremento en el tamaño y costo del sistema.
Tabla 1.1. Elementos de diseño de buses.

Tipo Anchura del bus


Dedicado Dirección
Multiplexado Datos

Método de arbitraje Tipo de transferencia de datos


Centralizado Lectura
Distribuido Escritura
Leer – modificar – escribir
Temporización Leer – después – escribir
Síncrona Bloque
Asíncrona

Método de arbitraje.

En todos, excepto en los sistemas demasiado simples, más de un módulo podría


necesitar control, del bus. Por ejemplo, un módulo de E – S puede necesitar leer o escribir
directo a memoria, sin enviar los datos a la CPU. Puesto que solo una unidad a la vez puede
transmitir con éxito sobre el bus, se necesita algún método de arbitraje. Los diversos
métodos pueden clasificarse como centralizados o distribuidos. En un esquema
centralizado, un solo dispositivo de hardware, al que se hace referencia como controlador
del bus o árbitro, es responsable de asignar tiempo en el bus. El dispositivo puede ser un
módulo separado o parte de la CPU. En un esquema distribuido, no hay un controlador
central. En su lugar, cada módulo contiene lógica de control de acceso y los módulos
actúan juntos para compartir el bus. Con ambos métodos de arbitraje, el propósito es

8
designar a un dispositivo como maestro (o amo), ya sea la CPU o un módulo de E – S.
Entonces, el maestro puede iniciar una transferencia de datos (lectura o escritura, por
ejemplo) con algún otro dispositivo, el cuál actúa como esclavo para este intercambio en
particular.
Temporización.

La temporización se refiere a la forma en la que se coordinan los eventos en el bus.


Con la temporización síncrona, la ocurrencia de los eventos en el bus está determinada por
un reloj. El bus incluye una línea de reloj sobre la cuál un reloj transmite una secuencia
regular de unos y ceros alternados de igual duración. A una transmisión simple 1 – 0 se le
conoce como un ciclo de reloj o ciclo de bus y define una ranura de tiempo. Todos los
otros dispositivos en el bus pueden leer la línea de reloj y, por consiguiente, todos los
eventos inician al principio de un ciclo de reloj. Otras señales de bus pueden cambiar en el
flanco de subida de la señal de reloj (con una ligera reacción de retraso).

Con una temporización asíncrona, la sucesión de un evento en un bus sigue y


depende de la ocurrencia de un evento previo.

La temporización síncrona es más sencilla para implantar y probar. Sin embargo, es


menos flexible que la temporización asíncrona. Como todos los dispositivos en un bus
síncrono están sujetos a una frecuencia de reloj fija, el sistema no puede tomar ventaja de
avances en el desempeño del dispositivo. Con la temporización asíncrona, una mezcla de
dispositivos lentos y rápidos puede compartir un bus, usando una tecnología antigua y
nueva.

Anchura del bus.

La anchura del bus de datos tiene un impacto en el desempeño del sistema: entre
más amplio sea, mayor será el número de bits que se transfieran a la vez. La anchura del
bus de dirección tiene un impacto en la capacidad del sistema: entre más amplio sea, más
grande será el rango de localidades que puedan ser referenciadas.

Tipos de transferencia de datos.

Todos los buses soportan transferencias tanto de escritura (maestro a esclavo) como
de lectura (esclavo a maestro). En el caso de un bus multiplexado de dirección – datos,
primero se utiliza el bus para especificar la dirección y después para la transferencia de
datos. Para una operación de lectura, hay por lo general una espera mientras el esclavo está
buscando los datos para colocarlos en el bus. Para una lectura o escritura, también puede
haber un retraso si es necesario pasar por el arbitraje a fin de ganar el control del bus para el
resto de la operación (por ejemplo, apoderarse del bus para solicitar una lectura o una
escritura, después apoderarse él otra vez para llevar a cabo una lectura o escritura).

En el caso de buses dedicados de dirección y de datos, la dirección se coloca en el


bus de dirección y permanece ahí mientras que los datos se colocan en el bus de datos. Para

9
una operación de escritura, el maestro pone los datos en el bus de datos tan pronto como la
dirección se ha estabilizado y el esclavo ha tenido la oportunidad de reconocer su dirección.
Para una operación de lectura, el esclavo pone los datos sobre el bus de datos tan pronto
como ha reconocido su dirección y ha buscado los datos.

También existen varias combinaciones de operaciones que algunos buses permiten.


Una operación de lectura – modificar – escritura es tan sólo una lectura seguida de
inmediato por una escritura a la misma dirección. La dirección sólo se emite una vez al
principio de la operación. Toda la operación como un todo es indivisible para prevenir el
acceso de otros maestros potenciales de bus al elemento de datos. El propósito principal de
esta capacidad es el proteger recursos de memoria compartida en un sistema de
multiprogramación.

Lectura – después – escritura es una operación indivisible que consiste en una


escritura seguida de inmediato por una lectura de la misma dirección. La operación de
lectura bien puede ejecutarse para propósitos de cualquier verificación.

Algunos sistemas de bus también soportan la transferencia de un bloque de datos.


En este caso, un ciclo de dirección es seguido por n ciclos de datos. El primer ítem de los
datos se transfiere a o desde la dirección especificada; los ítems de datos restantes son
transferidos a o desde direcciones subsecuentes.

1.4 La memoria.

La memoria es aquella parte del sistema computacional que se utiliza para el


almacenamiento y la recuperación subsiguiente de datos e instrucciones.

1.4.1.- Características de los sistemas de memoria.

El tema de la memoria de la computadora se hace más manejable si clasificamos los


sistemas de memoria de acuerdo con sus características clave. Las más importantes se listan
en la tabla 1.2.

Tabla 1.2. Características de los sistemas de memoria.

Ubicación Desempeño.
CPU Tiempo de acceso.
Interna (principal) Tiempo de ciclo.
Externa (secundaria) Razón de transferencia.

Capacidad Tipo Físico.


Tamaño de la palabra Semiconductor
Numero de palabras Superficie magnética.

10
Unidad de Transferencia Características físicas.
Palabra Volátil / No volátil
Bloque Borrable / No borrable
Iniciemos con el aspecto más visible de la memoria: su localización. Hay tanto
memoria interna como externa para la computadora. La memoria interna se considera
equivalente con frecuencia a la memoria principal. La memoria externa consiste en
dispositivos periféricos de almacenamiento, tales como disco y cinta, que son accesibles a
la CPU vía controladores de E – S.

Una característica obvia de la memoria es su capacidad. Para la memoria interna,


esto se expresa de manera característica en términos de bytes (un byte = 8 bits) o palabras.
Las longitudes comunes de palabra son 8, 16 y 32 bits. La capacidad de la memoria externa
se expresa típicamente en términos de bytes.

Un concepto relacionado es el de la unidad de transferencia. Para la memoria


interna, la unidad de transferencia es igual al número de líneas de datos dentro y fuera del
módulo de memoria. Esto es con frecuencia igual a la longitud de palabra, pero puede no
ser así. Para esclarecer este punto, considere los tres conceptos relacionados con la
memoria interna:

 Palabra: Es la unidad “natural” de organización de la memoria. El tamaño de la


palabra es casi siempre igual al número de bits que se utilizan para representar un
número y para la longitud de instrucción.

 Unidades direccionables: En varios sistemas, la unidad direccionable es la palabra.


Sin embargo, algunos sistemas permiten el direccionamiento a nivel byte. De
cualquier modo, la relación entre la longitud “A” de una dirección y el número “N”
de unidades direccionables es 2A = N.

 Unidad de transferencia: Para la memoria principal, éste es el número de bits que se


leen de o se escriben en la memoria en una sola vez. La unidad de transferencia no
necesita ser igual a una palabra o una unidad direccionable. Para la memoria
externa, los datos se transfieren a menudo en unidades mucho más grandes que una
palabra, se habla entonces de bloques.

Una de las distinciones más agudas entre tipos de memoria es el método de acceso a
las unidades de datos. Pueden distinguirse tres tipos:

 Acceso Secuencial: La memoria está organizada en unidades de datos, llamadas


registros. El acceso debe hacerse en una secuencia lineal específica. Información de
direccionamiento almacenada se utiliza para separar los registros y auxiliar en el
proceso de recuperación. Se utiliza un mecanismo compartido de lectura – escritura,
y este debe ser motivo de su posición actual a la posición deseada, pasando y
desechando cada registro intermedio. De este modo, el tiempo para accesar un

11
registro arbitrario es altamente variable. Las unidades de cinta son de acceso
secuencial.

 Acceso Directo: Al igual que en el acceso secuencial, el acceso directo implica un


mecanismo compartido de lectura – escritura. Sin embargo, los bloques o registros
individuales tienen una dirección única que se basa en la localización física. De
nuevo, el tiempo de acceso, es variable. Las unidades de disco son de acceso
directo.

 Acceso Aleatorio: Cada localidad direccionable en la memoria tiene un mecanismo


único de direccionamiento, interalambrado físicamente. El tiempo para accesar una
localidad dada es independiente de la secuencia de accesos anteriores y es
constante. Así, cualquier localidad puede ser seleccionada de manera aleatoria y
accesarse y direccionarse en forma directa. Los sistemas de memoria principal son
de acceso aleatorio.
Desde el punto de vista del usuario, las dos características más importantes de la
memoria son capacidad y desempeño. Se usan tres parámetros de desempeño:

 Tiempo de acceso: Para la memoria de acceso aleatorio, es el tiempo que le toma el


efectuar una operación de lectura o escritura, es decir, el tiempo desde el instante en
que una dirección se presenta a la memoria hasta el instante en que se han
almacenado los datos o están disponibles para su uso. Para la memoria de acceso no
aleatorio, el tiempo de acceso es el tiempo que le lleva el colocar al mecanismo de
lectura – escritura en la localidad deseada.

 Tiempo del ciclo de memoria: Éste concepto se aplica primeramente a la memoria


de acceso aleatorio y consiste en el tiempo de acceso más cualquier tiempo
adicional que se necesita, antes de que comience un segundo acceso.

 Razón de transferencia: Ésta es la razón a la cuál pueden transferirse datos hacia o


desde una unidad de memoria. Para la memoria de acceso aleatorio, es igual a
1 / (tiempo de ciclo). Para la memoria de acceso no aleatorio, se mantiene la
siguiente relación:

TN = TA + (N/R)

Donde:

TN = Tiempo promedio para leer o escribir N bits.


TA = Tiempo promedio de acceso.
N = Número de bits.
R = Razón de transferencia, en bits por segundo (bps).

12
Una variedad de tipos físicos de memoria se ha empleado. Los dos más comunes en
la actualidad, son la memoria de semiconductor, que utiliza la tecnología LSI o VLSI, y la
memoria de superficie magnética, que se utiliza para el disco y la cinta.
Varias características físicas de almacenamiento de datos son importantes. En una
memoria volátil, la información decae en forma natural o se pierde cuando la potencia
eléctrica se apaga. En una memoria no volátil, la información una vez registrada permanece
sin deterioro hasta que se cambia de manera deliberada. No se necesita potencia eléctrica
para retener la información. Las memorias de superficie magnética son no volátiles. La
memoria de semiconductor puede ser volátil o no volátil. La memoria no borrable no puede
ser alterada, excepto mediante la destrucción de la unidad de almacenamiento. La memoria
de semiconductor de este tipo se conoce como memoria de solo lectura (ROM, read – only
– memory). Por necesidad, una memoria práctica no borrable también debe ser no volátil.

Para la memoria de acceso aleatorio, la organización es un asunto clave de diseño.


Por organización se da a entender el arreglo físico de los bits para formar palabras.

1.4.2.- Memoria principal de semiconductor.


https://es.wikipedia.org/wiki/Memoria_de_semiconductor

Tipos de memoria de semiconductor de acceso aleatorio.

Todos los tipos de memoria que se estudiarán son de acceso aleatorio. Es decir, las
palabras individuales de la memoria se accesan en forma directa por medio de la lógica de
direccionamiento interalambrada.

La tabla 1.3 lista los principales tipos de memoria de semiconductor. Él más común se
conoce como memoria de acceso aleatoria (RAM, Random Access Memory), Esto es, claro
está, un error en el uso del término, pues todos los tipos enlistados son de acceso aleatorio.

Una característica que distingue a la RAM es que permite tanto leer desde la memoria
como escribir con facilidad y rapidez información nueva en la memoria. Tanto la lectura como
la escritura se logran mediante el uso de señales eléctricas.

La otra característica distintiva de la RAM es que es volátil. Una RAM debe contar
con un suministro de energía constante. Si el suministro de energía se interrumpe, los datos
se pierden. Por ello, la RAM solo se puede usar como medio de almacenamiento temporal.

13
La tecnología de la RAM se ha dividido en dos: estática y dinámica. Una RAM
dinámica se compone de celdas que almacenan datos bajo la forma de cargas en
capacitores. La presencia o ausencia de carga en un capacitor se interpreta como un 1 o un
0 binario. Como los capacitores tienen una tendencia natural a descargarse, las RAM
dinámicas necesitan refrescado de cargas periódico para actualizar el almacenamiento de
datos.

En una RAM estática, los valores binarios se almacenan al usar configuraciones


con compuertas lógicas (flip – flop´s). Una RAM estática alojará los datos, siempre y
cuando se le suministre energía.

La RAM estática y dinámica son volátiles. Una celda de memoria dinámica es más
simple y por ello más pequeña que una celda de memoria estática. Por eso, una RAM
dinámica es más densa (celdas más pequeñas = más celdas por unidad de área) y menos
costosa que la RAM estática correspondiente. Por otra parte, la RAM dinámica requiere el
apoyo de circuitos de refrescado. Por último, las RAM estáticas, en general, son en cierta
forma más veloces que las dinámicas.

Existen varios tipos de chips de RAM dinámica. El tipo más antiguo que continua
en uso es la DRAM FPM. (Modo de página rápida, Fast Page Mode) internamente, la
organización es una matriz de bits; el hardware presenta una dirección de renglón y luego
recorre las direcciones de columna.

La DRAM FPM esta siendo reemplazada gradualmente por la DRAM EDO (salida
de datos extendida, Extended Data Output), que permite iniciar una segunda referencia a la
memoria antes de que la anterior se haya completado.

Este sencillo uso de conductos nos hace que una sola referencia a la memoria sea
más rápida, pero si mejora el ancho de banda de la memoria, que produce las palabras por
segundo.

Tanto los chips FPM como los EDO son asíncronos, lo que significa que las líneas
de dirección y de datos no están controladas por un mismo reloj. En contraste, la SDRAM
(DRAM sincrónica) es un híbrido de RAM estática y dinámica y es controlado por un solo
reloj sincrónico.

La SDRAM se usa a menudo en las caches grandes y podría ser la tecnología


preferida para las memorias principales en el futuro.

14
Tabla 1.3. Tipos de Memorias de Semiconductor.

Tipo de Memoria Categoría Borrado Mecanismo de Volatibilidad


Escritura
Memoria de acceso Memoria de Eléctrico a De manera Volátil
Aleatorio (RAM) Lectura/ Nivel Electrónica
Escritura byte
Memoria de solo Máscaras
Lectura /ROM No es
ROM Programable Memoria de solo Posible
(PROM) lectura

ROM Programable Luz UV a De No


(EPROM) Nivel chip Manera Volátil
Electrónica
Memoria Flash Electrónico
Memoria de nivel bloque
PROM borrable Lectura Eléctrico a
Eléctricamente Principalmente nivel byte
(EEPROM)

En contraposición de la RAM, está la memoria de solo lectura (ROM, Read Only


Memory). Como su nombre lo sugiere, una ROM contiene un patrón permanente de datos
que no se pueden cambiar. Aunque es posible leer una ROM, en su operación normal, no es
posible escribir nuevos datos en ella.

Los datos de una ROM se insertan durante su fabricación, básicamente, exponiendo


un material fotosensible a través de una máscara que contiene un patrón de bits deseado. La
única forma de modificar el programa de una ROM es cambiar el chip.

Las ROM son mucho más económicas que las RAM, cuando se producen en
grandes cantidades, pues así el costo de elaborar una máscara se diluye. Sin embargo, estas
memorias son inflexibles, por que no pueden modificarse después de su fabricación, no hay
espacio para errores, si un bit es incorrecto, todo el lote de la ROM se debe desechar.

Una alternativa menos cara es usar la PROM ( ROM Programable). Una PROM es
parecida a una ROM, excepto que puede programarse (una vez) en el campo, lo que elimina
el retraso por surtido.

15
Muchas PROM contienen una matriz de diminutos fusibles. Un fusible específico puede
quemarse seleccionando su renglón y columna y aplicando después un voltaje alto a una
terminal especial del chip.

Al igual que la ROM, la PROM no es volátil y solo se puede escribir en ella una vez. En
la PROM el proceso de escritura se ejecuta de manera eléctrica y lo puede llevar a cabo un
consumidor o un distribuidor después de la fabricación del chip original. Se requiere equipo
especial en el proceso de escritura o de “programación”. Las PROM proporcionan flexibilidad
así como ventajas. La ROM es conveniente para altos volúmenes de producción.

Otra variante de la memoria de solo lectura es la memoria de lectura –


principalmente, que es útil en aplicaciones donde las operaciones de lectura son mucho más
frecuentes que las de escritura y en las que se requiere almacenamiento no volátil. Hay tres
formas comunes de memoria de lectura – principalmente: EPROM, EEPROM y memoria
flash.

En la memoria de solo lectura programable y borrable en forma óptica (EPROM,


erasable programmable read – only – memory) se lee y se escribe de manera eléctrica, al igual
que la PROM. Sin embargo, antes de efectuar una operación de escritura, todas las celdas de
almacenamiento se deben borrar hasta alcanzar el mismo estado inicial; para ello, se expone el
circuito integrado (que posee una ventana de vidrio) a una radiación ultravioleta. Éste proceso de
borrado se puede realizar varias veces, cada borrado quizá tarde algunos minutos en llevarse a
cabo. Así, la EPROM se puede alterar en múltiples ocasiones y, al igual que la ROM y la
PROM, almacena los datos de manera indefinida. Para cantidades comparables de
almacenamiento, la EPROM resulta má cara que la PROM; pero tiene la ventaja de la capacidad
de actualización múltiple.

La memoria de solo lectura programable y borrable eléctricamente (EEPROM,


electrically erasable programmable read – only – memory). Es unan memoria de lectura
principalmente en la cual se puede escribir en cualquier momento, sin tener que borrar el
contenido anterior; solo el byte o los bytes direccionados se actualizan. La EEPROM es más
cara y menos densa que la EPROM, por lo que soporta menos bits por chip.

Una de las formas más reciente de memoria de semiconductor es la memoria flash


(denominada así por la velocidad a la que se puede volver a programar). Introducida por primera
vez a principios de la década de los ochentas, la memoria flash ocupa un sitio intermedio entre la
EPROM y la EEPROM, tanto en costo como en funcionalidad. Al igual que la EEPROM, la
memoria flash usa una tecnología de borrado eléctrico. Una memoria flash completa se puede
borrar en algunos segundos, por lo que es mucho más veloz que la EEPROM. Además , es

16
posible borrar bloques de memoria en vez de un chip completo. Sin embargo, la memoria flash
no proporciona borrado a nivel de byte. Como la EPROM, la memoria flash sólo usa un
transistor por bit y por ello logra la densidad alta (en comparación con la EEPROM) de la
EPROM.

Organización.

El elemento básico de una memoria semiconductora es la celda de memoria. Aunque se


utilizan diversas tecnologías electrónicas, todas las celdas de memoria comparten ciertas
propiedades:

 Presentan dos estados estables (o semi – estables), que pueden emplearse para
representar el 1 y el 0 binarios.

 Puede escribirse en ellas (al menos una vez) para fijar su contenido.

 Pueden leerse para detectar su estado.

La figura 1.4. describe el funcionamiento de una celda de memoria. Lo más común es


que la celda tenga tres terminales para transportar señales eléctricas. La terminal de selección,
como su nombre lo indica, selecciona la celda para la operación de escritura o de lectura. La
terminal de control indica el tipo de operación. Para la escritura, la tercera Terminal proporciona
la señal que fija el estado de la celda a 1 o a 0. En una lectura, la tercera terminal se utiliza como
salida del estado de la celda. Los detalles sobre estructura interna, funcionamiento y
temporización de la celda de memoria dependen de cada tecnología específica de circuitos
integrados. Hasta éste momento, daremos por entendido que las celdas individuales pueden
seleccionarse para operaciones de lectura y de escritura.

17
Figura 1.4. Funcionamiento de una celda de memoria.

Instituto Tecnológico de Ciudad


Madero

Capítulo II.

El  P 8086/8088.

18
2.1 Historia de los microprocesadores Intel.

Historia de los Microprocesadores y Microcontroladores - YouTube


http://atc2.aut.uah.es/~avicente/asignaturas/ects/pdf/ects_t2.pdf

Intel inició sus operaciones siendo un fabricante de memoria para computadoras. En


1971 fue la primera compañía en lograr la integración de suficientes transistores como para
vender un microprocesador programable completo con un juego de instrucciones de 4 bits,
que se volvería muy común en calculadoras de bolsillo: El Intel 4004.

Al 4004 lo sucedieron el 8008 en 1972 y en 1974 el 8080, cada vez logrando mayor
capacidad. En 1978, Intel comenzó a comercializar el procesador 8086, un ambicioso chip
de 16 bits potencialmente capaz de ser el corazón de computadoras de propósito múltiple.
El 8086 se comercializó en versiones desde 5 y hasta 10MHz.

IBM adoptó al hermano menor del 8086 (el 8088, un procesador con un bus de
datos interno de 16 bits, pero con el bus externo de 8 bits, lo que permitía aprovechar
diseños y circuitos para sistemas de 8 bits) para basarse en él y lanzar la línea de
computadoras más exitosa de la historia: el IBM PC (1981) y el IBM PC/XT (eXtended
Technology) (1983).

El éxito de esta serie fue tal que a partir de ese momento, todos los CPU’s de Intel
mantuvieron una estricta política de compatibilidad hacia atrás - Todo CPU fabricado por
Intel desde ese momento y hasta el 2001 es capaz de ejecutar código compilado para
cualquiera de sus predecesores.

Al 8086 lo sucedió el 80286 en 1982 (en el cual se basó la IBM PC/AT, 1985). Este
chip, de 24/16 bits, implementó el modo protegido de ejecución, sentando las bases para la

19
aparición de los verdaderos sistemas multitarea de escritorio. El 80286 apareció a 6MHz, y
a lo largo de los años llegó hasta los 12MHz. Hubo varios sistemas operativos que
aprovecharon su modo protegido para ofrecer multitarea real, tales como las primeras
versiones de OS/2, o Xenix.

Pero el verdadero boom de la multitarea no llegó hasta el nacimiento del 80386


(1985) - Un avance tan fuerte que hoy en día es común referirse como i386 a toda la línea
de procesadores que le siguieron (también es común la referencia IA32, Intel Arquitecture
of 32 bits). El 386 fue el primer procesador de Intel de 32 bits, y -magníficas noticias para
los desarrolladores- utilizarlo para aplicaciones de multitarea sería ya mucho más fácil de lo
que lo fue con el 80286. El 80386 maneja velocidades de 16 a 33MHz.

El 80486 apareció en 1989. Fue un cambio relativamente menor frente al 80386 -


Hasta su aparición, todas las computadoras PC tenían la opción de comprar un -bastante
caro- coprocesador numérico - para las XT, el 8087. Para las AT, el 80287. Para las 386, el
80387. A partir del 80486, el coprocesador numérico, así como la memoria caché fueron
integrados al CPU, trayendo como resultado un gran aumento en la velocidad percibida por
los usuarios, sin cambios arquitectónicos de fondo importantes. El 486 existe en versiones
desde 25 y hasta 100MHz.

En 1993 apareció el Pentium. ¿Por qué ya no se llamó 80586? Porque muchas


empresas competidoras de Intel comenzaron a producir CPUs con el mismo nombre que los
de Intel. Ante el fallo de que un número no puede ser tomado como marca registrada, a
partir de entonces los procesadores llevan un nombre propio. Este procesador incorporaba
bastantes novedades, entre ellas un coprocesador muy mejorado y un doble sistema de
prefetch, lo que le permitía en ciertas situaciones ejecutar dos instrucciones simultáneas,
con el consiguiente aumento de rendimiento (desgraciadamente, ésto solo era posible bajo
ciertas combinaciones muy estrictas de instrucciones, con lo que el aumento de rendimiento
sólo era apreciable en aplicaciones compiladas específicamente para él). El Pentium llegó
desde los 60 hasta los 225MHz.

Poco después hizo su aparición el Pentium Pro, una versión orientada a servidores
que incluía la caché de segundo nivel en el mismo encapsulado que el procesador.
Desgraciadamente su elevado precio supuso un freno a su expansión.

Desde entonces, la tendencia al aparecer el Pentium II (1997), Pentium III (1999) y


Pentium 4 (2000) ha sido la integración de más componentes, la adición de instrucciones
específicas de multimedia y a elevar la velocidad de reloj tanto como sea posible. El
Pentium II llegó desde 200 hasta 450MHz. El Pentium III desde 550 a 1200 (1.2GHz). El
Pentium 4 debutó a 1.3GHz y actualmente (agosto del 2003) llega ya a los 3.2GHz.

20
Paralelamente al Pentium II dos familias de CPU’s fueron anunciadas: El Celeron,
que es similar a los Pentium pero con menos memoria caché y, por consiguiente, menor
precio y velocidad, y el Xeon, orientado a servidores, con más memoria caché - y claro
está, mucho mayor costo.

En 2001, tras una muy larga etapa de desarrollo fue anunciado el Itanium. Este es el
primer CPU desde 1978 que produce Intel que no es compatible con la arquitectura x86 -
esta nueva arquitectura de 64 bits es denominada IA64. Esta nueva arquitectura no ha
tenido el efecto que se vaticinaba en un principio, en parte por la carencia de software listo
para ser utilizado y en parte porque la velocidad es ligeramente menor a la de la
arquitectura i386. Hoy en día, la competencia se pone más difícil aún para Intel, pues AMD
-compañía rival de Intel- anunció la arquitectura x86-64, que es una extensión a la i386
(compatible con todo el software ya existente) permitiéndole ejecutar código de 64 bits.

2.2 Características del microprocesador 8086.

 Capacidad de direccionamiento de 1 Mb de memoria.

 Arquitectura diseñada para operar con un lenguaje ensamblador muy potente


y operar con lenguajes de alto nivel.

 Contiene 14 registros de 16 bits con operación simétrica.

 Tiene 8 muy comunes modos de direccionamiento.

 Operación a nivel de bit, byte, word y block.

 Operaciones aritméticas binarias o decimales de 8 y 16 bits con signo o sin


signo, incluyendo multiplicaciones y divisiones.

 Rango de frecuencia de reloj.

 5 Mhz para el 8086.


 8 Mhz para el 8086 – 2
 10 Mhz para el 8086 – 1

 Interfase compatible con sistemas multibus.

21
2.3.- Operación general.

Las funciones internas del microprocesador 8086 estas divididas lógicamente en dos
unidades de procesamiento. La primera es la Unidad de Interfase del Bus (BIU) y la segunda es
la Unidad de Ejecución (EU) como se muestra en la figura 2.1.

Estas unidades pueden interactuar directamente, pero en la mayor parte de la


ejecución operan como microprocesadores separados y asíncronos.

La unidad de Interfase del Bus provee las funciones relacionadas con la búsqueda
de instrucciones y de cola, búsqueda de operandos, almacenamiento y reubicación de
direcciones. Esta unidad también provee las señales básicas para el bus de control.

El mecanismo de colocación de instrucciones en la fila de espera o cola de


instrucciones (QUEUE) permite que la unidad de interfase del bus utilice la memoria muy
eficientemente. En cualquier instante hay espacio cuando menos para dos bytes en la fila de
espera.

La unidad de interfase del bus intenta traer una palabra en el ciclo de búsqueda de
la memoria, esto reduce gradualmente el tiempo muerto en el bus de memoria. La cola de
instrucciones actúa como buffer de instrucciones según como lo requiera.

La Unidad de Ejecución, recibe instrucciones prebuscadas por la BIU y provee un


direccionado de operandos relocalizado para la BIU. Los operandos en memoria son
pasados a través de la BIU para procesarlas por el EU, la cual pasa el resultado a la BIU
para su almacenamiento.

22
Figura 2.1. Diagrama de bloques del microprocesador 8086.

2.4.- Requisitos de suministro de corriente.

Los microprocesadores 8086 y 8088 requieren de un suministro de voltaje de +5


Volts con una tolerancia de  10 %. El 8086 tiene un consumo máximo de corriente de 360
mA, mientras que el 8088 usa un máximo de 340 mA. Ambos microprocesadores
funcionan en temperaturas ambientales entre 0º C y alrededor de 82 º C (32º a 180º F
respectivamente). Este rango de operación no es lo suficientemente amplio como para
permitir su uso en exteriores durante el invierno o aun en verano, pero están disponibles las
versiones de los microprocesadores 8086 y 8088 de rango de temperatura extendido.
También existe una versión CMOS, la cual requiere una corriente muy baja de alimentación
y posee un intervalo de temperatura extendido. El 80C88 y 80C86 son versiones CMOS

23
que requieren solamente 10 mA de corriente de alimentación y operan bajo condiciones
extremas de temperatura de – 40º C hasta 107º C.

2.5.- Características de CD.

Es imposible conectar algo a las terminales del microprocesador sin saber cuál es la
corriente de entrada requerida en una terminal de entrada y cuál es la capacidad de corriente
de salida en una terminal de salida. Este conocimiento permite al diseñador seleccionar los
componentes de interfase adecuados para el microprocesador sin miedo de dañar algo.

Características de la entrada. - Las características de entrada de estos


microprocesadores son compatibles con todos los componentes estándar lógicos
disponibles actualmente. Los valores de corriente de entrada son muy bajos porque las
entradas son las conexiones de compuerta de transistores MOSFET y representan
solamente corrientes de fuga.

Características de la salida. - El nivel de voltaje “1 lógico” de los 8086 y 8088 es


compatible con el de la mayor parte de las familias lógicas estándar, pero el nivel lógico
“0” no lo es. Los circuitos lógicos estándar tienen un voltaje “0 lógico” máximo de 0.4 V y
en los 8086/8088 es un máximo de 0.45 V. Por tanto, hay una diferencia de 0.05 V.

Esta diferencia reduce la inmunidad al ruido de un nivel estándar de 400 a 350 mV


(0.8 V – 0.45 V). (La inmunidad al ruido es la diferencia entre los valores de salida y
entrada correspondientes a 0 lógico). Dicha inmunidad al ruido reducida puede causar
problemas con conexiones de cables largos o con demasiadas cargas. Por ello se
recomienda no conectar más de 10 cargas de cualquier tipo o combinación de tipos a una
terminal de salida sin una compuerta de reforzamiento (“buffer”). Si este factor de carga
fuera excedido, el ruido empezaría a tener efectos en problemas de temporización.

La mejor elección en tipos de componentes para la conexión a una terminal de


salida de estos microprocesadores es un componente de la familia lógica LS, 74ALS,
74AHC. Se recomienda que, si requiere un abanico de salida de más de 10 cargas
unitarias, el sistema debe contener un buffer.

2.6 Distribución de terminales de los microprocesadores 8086 / 8088.

En la figura 2.2 se ilustran los diagramas de terminales de los microprocesadores


8086 y 8088. Al observar con cuidado, se verá que son pocas las diferencias entre estos dos
microprocesadores, ambos se presentan en encapsulados de 40 terminales en doble línea
(DIP).

24
Figura 2.2. Distribución de terminales de los microprocesadores (a) 8086, (b)
8088.

El 8086 es un microprocesador con un canal de datos externos de 16 bits y el


microprocesador 8088 tiene un canal de datos externos de 8 bits. Como se ilustra, el
8086 tiene las terminales AD0-AD15, mientras que el 8088 tiene las terminales AD 0-AD7,
por lo que el canal de datos es la diferencia más importante entre estos microprocesadores.

Pero hay una pequeña diferencia en una de las señales de control. El 8086 tiene una
terminal mientras que el 8088 tiene una terminal .
Otra diferencia en sus terminales aparece en la terminal 34 de ambos circuitos
integrados, en el 8088 es la terminal , mientras que en el 8086 es / S7.

2.7.- Organización de la memoria del P 8086.

El microprocesador provee 20 bits para direccionamiento a memoria. La memoria


está organizada como un arreglo lineal de hasta 1 millón de bytes, diseccionándose a partir
de la localidad OOOOOH hasta la localidad FFFFFH, a esto se le conoce como distribución
lógica.

25
La memoria además está dividida lógicamente en segmentos llamados: segmento de
código, segmento de datos, segmento extra-datos y segmentos de stack; estos segmentos
son de hasta 64 Kb cada uno.

El inicio de cada uno de estos segmentos es, por lo común, un límite de párrafo
(cualquier localidad de memoria divisible entre (16)10 o (10)16). La distribución lógica de la
memoria se presenta en la figura 2.3.

Figura 2.3. Distribución lógica de la memoria del μP 8086.

Físicamente, la memoria está organizada en bancos, cuya cantidad depende


directamente del número de líneas del bus de datos externo del microprocesador (por cada 8
líneas de datos externos, existe un banco de memoria). Entonces, para el microprocesador
8088, que tiene 8 líneas de datos externos, se tiene un solo banco de memoria, por lo que la
organización lógica y física de la memoria en dicho microprocesador es prácticamente la
misma. En el caso del 8086, que tiene 16 líneas de datos externas, se tienen dos bancos
(cada banco tiene un tamaño de 512 Kb): El banco par, también llamado banco bajo, que
guarda las direcciones de memoria pares y el banco impar, llamado banco alto, que guarda
las direcciones impares (ver figura 2.4).

El microprocesador provee dos señales de habilitación y A0 para permitir


selectivamente una lectura desde o una escritura dentro de cualquiera de las localidades par
o impar, o en ambas. El flujo de instrucciones es buscado desde la memoria como palabras
y son direccionadas internamente por el procesador a nivel de byte si es necesario.

26
En la figura 2.4 se muestra la organización física de la memoria de los
microprocesadores 8086, 8088, 80286, 80386 y 80486.

Para microprocesadores de 32 líneas de datos externas (80386DX, 80486SX y


80486DX), se tienen cuatro bancos de datos.

Figura 2.4. Sistemas de memoria física de diversos microprocesadores Intel.

2.8.- Modo mínimo y modo máximo.

Los requerimientos para soporte mínimo y máximo de los sistemas 8086. Son tan
diferentes que no pueden trabajar eficientemente con únicamente 40 terminales definidas.
En consecuencia, el 8086 es equipado con una terminal de opción , la cual define
la configuración del sistema. La definición de un cierto subconjunto de terminales depende
de la condición de la terminal de opción.

Cuando la terminal es conectada a tierra, el 8086 trabaja con las


terminales 24 a la 31 en modo máximo. Un controlador del bus interpreta el estado de la

27
información codificado con S0, S1, y S2 para generar un tiempo en el bus de señales de
control compatibles con la arquitectura del multibus.
Cuando la terminal es conectada a VCC, el 8086 genera señales de
control de bus por sí mismo, usando las terminales 24 a la 31.

Tabla 2.1. Tabla que muestra los segmentos de memoria y los registros de
segmento.

Registro de segmento Regla de selección usada


Segmento de memoria
seleccionado según la referencia
Automáticamente con todas las
Instrucciones CODIGO (CS) instrucciones prebuscadas.
Todos los pushes and pops en el
stack. Referencia a memoria
Stack Stack (SS)
relativa a BP, excepto
referencias a memoria de datos.
Referencia a datos cuando: es
Datos locales DATA (DS) relativo al stack, destino de
operaciones de cadena.
Datos Externos Destino de operaciones de
EXTRA (ES)
(Globales) cadena.

Todas las referencias a memoria son hechas en base a un direccionamiento relativo


en los registros de segmento de alta velocidad. El registro de segmento a ser seleccionado
es escogido automáticamente de acuerdo con las reglas de la tabla 2.1.

2.9.- Direccionamiento de localidades de memoria.

Dependiendo del modelo, el procesador puede acceder uno o más bytes de memoria
a la vez.
Considere él número decimal 1,025. La representación hexadecimal de esta cifra,
0401H, requiere de 2 bytes (o una palabra) de memoria. Consta de un byte de orden alto
(más significativo), 04, y un byte de orden bajo (menos significativo), 01. El sistema
almacena en memoria estos bytes en secuencia inversa de bytes: el byte de orden bajo en la
dirección baja de memoria y el byte de orden alto en la dirección alta de memoria. Por

28
ejemplo, el procesador transferiría 0401H de un registro a las localidades de memoria 5612
y 5613 como:

5611 5612 5613 5614


XX 01 04 XX
Código de Inst. Dato = 8 bits Si Dato =16 bits

Figura 2.5. Almacenamiento de los datos en la memoria.

El procesador espera que los datos numéricos en la memoria estén en secuencia


inversa de bytes y los procesa de acuerdo con esto. Cuando el procesador recupera la
palabra de la memoria, otra vez invierte los bytes, restableciéndolos de manera correcta en
el registro como 0401H.

Aunque esta característica es enteramente automática, tiene que estar alerta cuando
programe y depure programas en lenguaje ensamblador.

Al programar el lenguaje ensamblador se tiene que distinguir claramente entre la


dirección y los contenidos de una localidad de memoria. En el ejemplo anterior, el
contenido de la localidad 5612 es 01 y el contenido de la localidad 5613 es 04.

2.10.- Segmentos y direccionamiento.

Un segmento es un área especial en un programa que inicia en un límite de un


párrafo, esto es, en una localidad regularmente divisible entre (16)10 o (10)16. Aunque un
segmento puede estar ubicado casi en cualquier lugar de la memoria y, en modo real, puede
ser hasta de 64K, solo necesita tanto espacio como el programa requiera para su ejecución.

Se puede tener cualquier número de segmentos, para direccionar un segmento en


particular basta cambiar la dirección en el registro del segmento apropiado. Los tres
segmentos principales son los segmentos de código, de datos y de la pila.

Segmento de código.

El segmento de código (CS) contiene las instrucciones de máquina que son


ejecutadas. Por lo común, la primera instrucción ejecutable está en el inicio del segmento, y
el sistema operativo enlaza a esa localidad para iniciar la ejecución del programa. Como su
nombre indica, el registro de CS direcciona el segmento de código.

29
Segmento de datos

El segmento de datos (DS) contiene datos, constantes y áreas de trabajo definidos


por el programa. El registro de DS direcciona el segmento de datos.

Segmento de pila (Stack).

En términos sencillos, la pila contiene los datos y direcciones que necesita guardar
temporalmente o para uso de las “llamadas” a subrutinas. El registro de segmento de la
Pila (SS) direcciona el segmento de la pila.

2.10.1.-Límites de los segmentos.

Los registros de segmentos contienen la dirección inicial de cada segmento. Un


segmento inicia en un límite de párrafo, que es una dirección por lo común divisible entre
(16)10 o (10)16. Suponga que un segmento de datos inicia en la localidad de memoria
045F0H. Ya que en éste y todos los demás casos el último dígito hexadecimal de la derecha
es 0, los diseñadores de computadoras decidieron que sería innecesario almacenar el dígito
mencionado en el registro del segmento. Así, 045F0H se almacena como 045FH, con el
cero de la derecha sobrentendido.

2.10.2.- Desplazamiento de segmentos.

En un programa, todas las localidades de memoria están referidas a una dirección


inicial de segmento. La distancia en bytes desde la dirección del segmento se define como
el desplazamiento (offset). Un desplazamiento de dos bytes (16 bits) puede estar en el
rango de 0000H hasta FFFFH, o bien, desde 0 hasta 65,535.

Así, el primer byte del segmento de código tiene un desplazamiento 00, el segundo
byte tiene un desplazamiento 01, etc., hasta el desplazamiento 65,535. Para referir cualquier
dirección de memoria en un segmento, el procesador combina la dirección del segmento en
un registro de segmento con un valor de desplazamiento.

En el ejemplo siguiente, el registro DS contiene la dirección inicial del segmento de


datos en 045F[0]H y una instrucción hace referencia a una localidad con un desplazamiento
de 0032H bytes dentro del segmento de datos.

Por tanto, la localidad real de memoria referida por la instrucción es 04622H:

Dirección del ssegmento DS: 045F[0]H


Desplazamiento: 003 2 H
Dirección Real: 0462 2 H

30
2.11.- Registros.

Los registros del procesador se emplean para controlar instrucciones en ejecución,


manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros
son direccionables por medio de un nombre. En el P8086 existen 14 registros (todos de 16
bits), como se aprecia en la figura 2.6.

Figura 2.6. Registros del Microprocesador 8086.


2.11.1.- Registros de segmento.

Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para


direccionamiento conocida como el segmento actual. Como hemos dicho, un segmento se
alinea en un límite de un párrafo y su dirección en un registro de segmento supone cuatro
bits 0 a su derecha.

Registro CS.- El DOS almacena la dirección inicial del segmento de código de un


programa en el registro CS. Esta dirección de segmento, más un valor de desplazamiento en

31
el registro apuntador de instrucción (IP), indica la dirección de una instrucción que es
buscada para su ejecución.

Registro DS.- la dirección inicial de un segmento de datos del programa es


almacenada en el registro DS. En términos sencillos, esta dirección, más un valor de
desplazamiento en una instrucción, genera una referencia a la localidad de un byte
específico en el segmento de datos.

Registro SS.- El registro SS permite la colocación en memoria de una pila, para


almacenamiento temporal de direcciones y datos. El DOS almacena la dirección de inicio
del segmento de pila de un programa en el registro SS. Esta dirección de segmento, más un
valor de desplazamiento en el registro del apuntador de la pila (SP), indica la palabra actual
en la pila que está siendo direccionada.

Registro ES.- Algunas operaciones con cadenas de caracteres (datos de caracteres)


utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este
contexto, el registro ES esta asociada con el registro DI (índice destino).

2.11.2.- Registro Apuntador de Instrucciones.

El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de


dirección de la siguiente instrucción que se ejecuta. El IP esta asociado con el registro CS
en el sentido de que el IP indica la instrucción actual dentro del segmento de código que sé
esta ejecutando actualmente.

En el ejemplo siguiente, el registro CS contiene 25A4 [0]H y el IP contiene 412H.


Para encontrar la siguiente instrucción que será ejecutada, el procesador combina las
direcciones en CS y el IP.

Dirección de segmento en el registro CS: 25A40H


Dirección de desplazamiento en IP :+ 412H
Dirección de la siguiente instrucción : 25E52H

2.11.3.- Registros apuntadores.

Los registros SP (apuntador de pila) y BP (apuntador base) están asociados con el


registro SS y permite al sistema accesar datos en el segmento de la pila.

Registro SP.- El apuntador de la pila de 16 bits esta asociada con el registro SS y


proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo
preparada en la pila.

32
En el ejemplo siguiente, el registro SS contiene la dirección de segmento 27B3[0]H
y el SP, el desplazamiento 312H. Para encontrar la palabra actual que esta siendo procesada
en la pila, la computadora combina las direcciones en el SS y el SP.

Dirección de segmento en el registro SS: 27B30H


Desplazamiento en el registro SP : + 312H
Dirección en la pila : 27E42H

Registro BP.- El registro BP de 16 bits facilita la referencia de parámetros, los


cuales son datos y direcciones transmitidos vía la pila.

2.11.4.- Registros de propósito general.

Los registros de propósito general AX, BX, CX y DX son los caballos de batalla del
sistema, son únicos en el sentido de que se pueden direccionar como una palabra o como
una parte de un byte.

El byte de la izquierda es la parte “alta”, y el byte de la derecha es la parte “baja”.


Por ejemplo, el registro CX consta de una parte alta (CH) y una parte baja (CL), y puede
referirse a cualquier parte por su nombre.

Registro AX.- El registro AX, el acumulador principal, es utilizado para


operaciones que implican entrada / salida y la mayor parte de la aritmética. Por ejemplo, las
instrucciones para multiplicar; dividir y traducir suponen el uso del AX. También, algunas
operaciones generan código más eficiente si se refiere al AX en lugar de a los otros
registros.

Registro BX.- El BX es conocido como el registro base ya que es el único registro


de propósito general que puede ser índice para direccionamiento indexado. También es
común emplear el BX para cálculos.

Registro CX.- El CX conocido como el registro contador. Puede contener un valor


para controlar él número de veces que un ciclo se repite o un valor para corrimiento de bits
o rotaciones, hacia la derecha o hacia la izquierda. El CX también es usado en muchos
cálculos.
Registro DX.- El DX es conocido como el registro de datos. Algunas operaciones
de entrada / salida requieren su uso, y las operaciones de multiplicación y división con
cifras grandes suponen al DX y al AX trabajando juntos.

2.11.5.- Registros de Índice.

Los registros SI y DI están disponibles para direccionamiento indexado y para


sumas y restas.

33
Registro SI. - El registro índice fuente de 16 bits es requerido para algunas
operaciones con cadenas de caracteres. En este contexto, el SI está asociado con el registro
DS.

Registro DI.- El registro índice destino también es requerido por algunas


operaciones con cadenas de caracteres. En este contexto, DI está asociado con el registro
ES.

2.11.6.- Registro de banderas.

Las banderas indican la condición del microprocesador a la vez que controlan su


funcionamiento. En la figura 2.7 se ilustran los registros de todas las versiones de los
microprocesadores 8086 a 80486. Se debe tener en cuenta que las banderas son compatibles
hacia arriba desde el 8086/8088 hasta el 80486. El 8086-80286 contiene un registro de
banderas, FLAG (16 bits) y los 80386-80486 contienen un registro EFLAG (registro de
bandera extendido, de 32 bits).

Los bits de bandera cambian después de ejecutar muchas de las instrucciones


aritméticas y lógicas. Algunas de las banderas se utilizan para controlar ciertas
características del microprocesador.

Figura 2.7. Registro de banderas para diversos tipos de microprocesadores.

De los 16 bits del registro de banderas del microprocesador 8086/8088, nueve son
comunes a toda la familia de estos procesadores, y sirven para indicar el estado actual de la
computadora y el resultado del procesamiento. Muchas instrucciones que piden
comparaciones y aritmética cambian el estado de las banderas, algunas de cuyas
instrucciones pueden realizar pruebas para determinar la acción subsecuente.

A continuación, aparece una lista con cada bit de bandera, con una breve
descripción de su función:

34
C (cargo o acarreo). - Indica un “acarreo” después de una suma o un “préstamo”
después de una resta.

P(paridad). - Es un cero para una paridad impar y un uno para paridad par. La
paridad es un conteo de “unos” expresado como un número par o impar. Por ejemplo, si un
número contiene 3 bits con uno binario, tiene paridad impar. Si un número contiene cero
bits con valor uno, se considera que tiene paridad par.

A (acarreo auxiliar). - Tiene un acarreo después de una suma o un “préstamo”


después de una resta entre las posiciones de los bits 3 y 4 en el resultado. Éste indicador
muy especializado se prueba con las instrucciones DAA y DAS para ajustar el valor de
registro AL después de una suma o una resta en BCD.

Z(cero). - Indica si el resultado de una operación aritmética o lógica es cero. Si


Z=1, el resultado es cero y si Z=0, el resultado es diferente de cero.

S(signo). - Indica el signo aritmético del resultado después de una suma o una resta. Si
S=1, el resultado es negativo. Si S=0, el resultado es positivo. Se debe tener en cuenta que el
valor del bit más significativo del resultado se coloca en el bit de signo para cualquier
instrucción que afecte a las banderas.

T(trampa). - Permite la operación del procesador el modo de un paso, los


programas depuradores, como DEBUG, activan esta bandera de manera que puedan
avanzar en la ejecución de una sola instrucción a un tiempo, y así, examinar el efecto de esa
instrucción sobre los registros y la memoria.

I(interrupción). - Controla el funcionamiento de la terminal de la entrada INTR


(interrupción). Si I=1, se habilita la entrada INTR y si I=0, se deshabilita la entrada INTR.
El estado de la bandera I se controla con las instrucciones STI (activar la bandera I) y CLI
(desactivar la bandera I).

D(dirección). - Controla la selección de incremento o decremento automático de los


registros de índice, DI o SI, durante las instrucciones de cadenas o arreglos. Si D=1 hay
decremento automático en los registros y si D=0 hay incremento automático. La bandera D
se activa con la instrucción STD y se desactiva con la instrucción CLD.

OF (sobre flujo). - Es una condición que ocurre cuando se suman o restan números
con signo. Un sobreflujo indica que el resultado ha excedido de la capacidad de la máquina.
Para operaciones sin signo, no se toma en cuenta ésta bandera.

Las banderas más importantes para la programación en ensamblador son O, S, Z y C


para operaciones de comparación y aritmética, y D para operaciones con cadenas de
caracteres.

2.12.- Tipos de programas ejecutables.

35
El DOS soporta a dos tipos de programas ejecutables: .COM y .EXE. Un
programa .COM consta de un segmento de memoria (64Kb) que contiene código, datos, y
la pila. Si se necesita un pequeño programa de utilería o un programa residente en memoria
(un programa que es instalado permanentemente y esta disponible mientras otros programas
estén ejecutándose), se escribe un programa .COM. Un programa .EXE consta de
segmentos de código, datos y de la pila separados y es el método usado por la mayoría de
los programas serios.

2.13.- La pila (stack)

Los programas .COM y .EXE, requieren un área en el programa reservado como


una pila (stack). El propósito de la pila es mantener un espacio para el almacenamiento
temporal de direcciones y datos.

El DOS define de manera automática la pila para un programa .COM, mientras que
para un programa .EXE se debe definir en forma explícita la pila. Cada elemento de dato en
la pila es una palabra (2 bytes). El registro SS como es inicializado por el DOS, contiene la
dirección del inicio de la pila.

Inicialmente, el SP contiene el tamaño de la pila, un valor que apunta al byte que


está pasando al final de la pila. La pila difiere de otros segmentos en su método de
almacenar los datos: empieza en la localidad más alta y almacena los datos hacia abajo por
la memoria.

….........

SS SP
Dirección del segmento de la Tope de la pila
pila

La instrucción PUSH (entre otras) disminuye el SP en 2 (hacia abajo), hacia la


siguiente palabra almacenada de la pila y coloca (o empuja, push) un valor ahí. La
instrucción POP (entre otras) regresa el valor de la pila e incrementa el SP en 2 hacia arriba,
hacia la siguiente palabra almacenada.

El ejemplo siguiente ilustra como meter el contenido de los registros AX y BX a la


pila y la subsecuente extracción de ellos. Suponga que el AX contiene 015AH, el BX
contiene 03D2H y el SS contiene 28H (Aquí no nos concierne la dirección en el SS).

36
1.- Al comienzo, la pila está vacía se ve así:

….........

SS SP=28
Dirección del segmento de la Tope de la pila
pila

2.- PUSH AX. - Disminuye el SP en 2 (a 26H) y almacena el contenido del AX, 015AH, en
la pila. Observe que la operación invierte la secuencia de bytes almacenados, de modo
que 015A se almacena como 5A01:

….........
5A01

SS SP=26
Dirección del segmento de la Tope de la pila
pila

3.- PUSH BX.- Disminuye el SP en 2 (a 24H) y almacena el contenido del BX, 03D2H en
la pila:

….........
D203 5A01

37
SS SP=24
Dirección del segmento de la Tope de la pila
pila

4.- POP BX.- Regresa la palabra que se encuentra en la pila, en donde apunta el SP, y la
envía al registro BX e incrementa el SP en 2 (a 26H). El BX ahora contiene 03D2H, con los
bytes correctamente invertidos.

….........
D203 5A01

SS SP=26
Dirección del segmento de la Tope de la pila
pila

5.- POP AX. - Regresa la palabra que se encuentra en la pila, en donde apunta el SP, y la
envía al registro AX e incrementa el SP en (a 28H). El AX ahora contiene 0154H, con los
bytes correctamente invertidos:

….........
D203 5A01

SS SP=28
Dirección del segmento de la Tope de la pila
pila

Note que las instrucciones POP son codificadas en secuencia inversa a las
instrucciones PUSH. Así, en el ejemplo se guardaron AX y BX, pero se sacaron el BX y
AX, en ese orden. Además, los valores sacados de la pila aún están allí, aunque el SP ya no
apunta a ellos.

Siempre debe asegurarse que el programa coordine los valores que guarda en la pila
con los valores que saca de ella. Como éste es un requisito directo, un error puede causar
que un programa no funcione. También, para un programa .EXE se tiene que definir una
pila que sea suficientemente grande para contener todos los valores que podrían ser
guardados en ella.

38
2.14.- Modos de direccionamiento de datos.

Para explicar los modos de direccionamiento se usará la instrucción MOV ya que es


la más sencilla y flexible; proporciona el principio para la explicación de los modos de
direccionamiento de datos.

MOV operando destino, operando fuente

MOV AX, BX

Figura 2.8. La instrucción MOV AX, BX, para explicar


el sentido del flujo de la información.

En la figura 2.8 se muestra la instrucción MOV y define el sentido del flujo de


datos. La fuente está a la derecha y el destino a la izquierda, juntos al código de operación
MOV, un código de operación le indica al microprocesador la operación que debe ejecutar.

El sentido del flujo es, al principio, una confusión porque se supone que las cosas se
mueven naturalmente de izquierda a derecha, mientras que, en este caso, se mueven de
derecha a izquierda. En una instrucción, siempre hay una coma (,) que separa el destino de
la fuente.

Los siete modos de direccionamiento más utilizados son:

1.- Direccionamiento de registros. Transfiere un byte o palabra desde el registro


fuente, hasta el registro destino. Ejemplo: la instrucción MOV CX, DX copia el contenido
de tamaño palabra en el registro DX y lo pasa al registro CX.

39
Es importante que para las instrucciones se utilicen registros que sean de tamaño
uniforme. Nunca mezcle un registro de 8 bits con uno de 16 bits porque no lo permite el
conjunto de instrucciones del 8086.

En la tabla 2.2 se muestran algunas versiones de instrucciones MOV entre registros.


El único tipo de instrucción MOV para registro que no se permite, es una instrucción MOV
entre registros de segmento. También se debe tener en cuenta que el contenido del registro
de segmento de código no se puede cambiar con una instrucción MOV.

Tabla 2.2. Ejemplos de instrucciones que usan el direccionamiento de registros.

Lenguaje Ensamblador Operación


MOV AL,BL Copia BL en AL
MOV CH,CL Copia CL en CH
MOV AX,CX Copia CX en AX
MOV SP,BP Copia BP en SP
MOV DS,AX Copia AX en DS
MOV DI,SI Copia SI en DI
MOV BX,ES Copia ES en BX
MOV ES,DS No se permite (segmento a segmento)
MOV BL,BX No se permite (tamaños mixtos)
MOV CS,AX No se permite (CS no se puede usar como registro
destino)

En la figura 2.9 se aprecia lo que sucede después de que se utiliza la instrucción


MOV BX, CX. Por ejemplo, si CX tiene 1234H y BX tiene el valor 73CDH, el 1234H
pasará a BX y se eliminará lo que contenía.

DX

CX 1234

BX (73CD) 1234
AX

Figura 2.9. Ejecución de la instrucción MOV BX, CX.


2.- Direccionamiento inmediato. Transfiere un byte o palabra de datos inmediatos
de la fuente, hacia el registro o localidad de la memoria en el destino. Por ejemplo, la
instrucción MOV AL, 22H, copia el 22H de tamaño byte en el registro AL.

40
El término inmediato significa que los datos siguen inmediatamente al código
hexadecimal de operación en la memoria. El direccionamiento inmediato actúa en un byte o
palabra de datos.

La instrucción inmediata MOV transfiere una copia de los datos inmediatos a un


registro o a una localidad en la memoria.

En la Fig. 2.10 se muestra que el registro AX contiene FECDH y le estamos


ordenando al P que le ponga a AX el dato 3456H; el contenido de AX cambiará y en lugar
de tener FECDH, tendrá 3456H. Al mismo tiempo se muestra el funcionamiento de la
instrucción MOV AX, 3456H en AX.

BX A895 PROGRAMA

AX (FECD) 3456 B85634 MOV AX,3456H

Figura 2.10. Ejecución de la instrucción MOV AX,3456H.

El ensamblador simbólico recibe los datos inmediatamente en varias formas. La


letra “H” es flujo de los datos hexadecimales. Si estos datos empiezan con una letra, se
inicia con un “0”. Por ejemplo, para representar un F2H, se tiene que colocar un 0 primero,
quedando 0F2H para que el procesador sepa que el operando es un número y no una
etiqueta. Para los datos decimales no se coloca sufijo. También se pueden poner caracteres
ASCII entre apóstrofos y a los datos binarios se les pone una “B” al final.

En la tabla 2.3 se presenta varias instrucciones MOV con diferentes datos inmediatos.

Tabla 2.3. Ejemplos de direccionamiento inmediato.

41
Lenguaje Ensamblador Operación
MOV BL, 44 Mueve 44 decimal (2CH) al BL
MOV AX, 44H Mueve 0044 hexadecimal a AX
MOV SI, 0 Mueve 0000H hacia SI
MOV CH, 100 Mueve 100 (64H) hacia CH
MOV AL, ´A´ Mueve ASCII (41H) hacia AL
MOV AX, ´AB´ Mueve BA ASCII (4241H) hacia AX
MOV CL, 11001110B Mueve 11001110 Binario hacia CL

Cuando se utiliza el programa DEBUG y se desea enviar un dato inmediato hacia


algún lugar de la memoria, es necesario agregar a la instrucción el operador PTR y uno de
sus tipos: BYTE, cuando los datos a mover a la localidad de la memoria sean de 8 bits o
bien WORD, cuando los datos sean de 16 bits.

Lo anterior no es necesario cuando el operando destino es un registro, ya que el


tamaño del movimiento lo determina precisamente el tamaño del registro utilizado.

Si no se agrega el operador y alguno de los tipos mencionados, al ensamblar se


producirá un error. A continuación, se muestra un ejemplo que mueve hacia la localidad de
la memoria 200H el número 64H. Cabe mencionar que en el programa DEBUG, todos los
datos numéricos se consideran como números del sistema hexadecimal.

MOV BYTE PTR [200],64

Se observa también que el número de la dirección seleccionada se coloca entre


corchetes.

3.- Direccionamiento Directo. - Mueve un byte o palabra entre una localidad de


memoria y un registro. Por ejemplo, la instrucción MOV CX, LIST copia el contenido
tamaño palabra de la localidad de memoria asociada con LIST y lo coloca en el registro
CX.

En la mayor parte de las instrucciones se pueden emplear el modo de


direccionamiento directo.

Aunque el direccionamiento directo es solo uno, podemos realizar una clasificación


en dos tipos básicos:

Direccionamiento directo que solo se aplica a una instrucción MOV entre una
localidad de memoria y AL ó AX, y Direccionamiento por desplazamiento para casi
cualquier instrucción en el conjunto de instrucciones del 8086. En cualquier caso, para

42
formar la dirección se suma el desplazamiento a la dirección del segmento de datos
implícito o en un segmento alterno.

a). - Direccionamiento directo. Solo se permite con una instrucción MOV que
transfiere datos entre una localidad en la memoria situada dentro del segmento de datos y
un registro AL (8 bits) o AX (16 bits).

La instrucción MOV AL, DATO tal como se emplea en la mayor parte de los
ensambladores, transfiere una copia del byte almacenado en la localidad DATO de la
memoria y lo pone en el registro AL. En la figura 2.11 se ilustra algunos ejemplos de
direccionamiento directo.

Figura 2.11. (a) Ejecución de MOV AL, DATO y (b) ejecución de MOV AX,DATO.

43
En la tabla 2.3 aparecen instrucciones con direccionamiento directo.

Tabla 2.3. Ejemplos de direccionamiento directo.

Lenguaje Ensamblador Operación


Copia el contenido tamaño byte de la
MOV AL, NUMERO dirección NUMERO en AL.

Copia en AX el contenido tamaño palabra de


MOV AX, ALGO la dirección ALGO.

Copia AL en la localidad de memoria


MOV NOTAS, AL NOTAS

MOV AH, AX Copia AX en la localidad de memoria AH.

b). - Direccionamiento por desplazamiento. El direccionamiento por desplazamiento


es muy semejante al direccionamiento directo, además de ser mucho más flexible, porque se
utiliza en la mayor parte de las instrucciones. En la figura 2.12 se muestra el funcionamiento de
la instrucción MOV CL, 2000H.

Figura 2.12. Ejecución de la instrucción MOV CL, [2000H].

44
MOV AX,[200]
MOV [200],AH

Tabla 2.4. Ejemplos de direccionamiento directo por desplazamiento.

Lenguaje Ensamblador Operación


Carga en el registro CH, el contenido de la
MOV CH, CAN
localidad de memoria CAN
Carga en el registro el contenido de la
MOV CH, [1000]
localidad de memoria 1000H
Carga en ES el contenido tamaño palabra de
MOV ES, DATO6
la localidad de memoria DATO6
Se carga a BP en la localidad de memoria
MOV DATO, BP
DATO
Se carga SP en la localidad de memoria
MOV NUMERO, SP
NUMERO

4.- Direccionamiento indirecto de registros

Transfiere un byte o palabra entre un registro y una localidad de memoria


direccionada por el contenido de un registro de índice (DI o SI) o uno de base (BX o BP).
Por ejemplo, la instrucción MOV AX, [BX] copia los datos de tamaño palabra en una
dirección del segmento de datos con un desplazamiento dado por BX y lo pasa al registro
AX.

Como ya se mencionó, el direccionamiento indirecto de registros permite direccionar


datos en cualquier localidad de la memoria por medio de cualquiera de los registros de base
o índice.

Por ejemplo, si el registro BX contiene 1000H y se ejecuta la instrucción


MOV AX, [BX], el contenido tamaño palabra de la dirección con desplazamiento 1000H
en el segmento de dato, se copia en el registro AX.

Si el μP funciona en modo real y DS = 0100 H, esta instrucción direcciona a la


palabra almacenada en los bytes 2000H y 2001H de la memoria y los transfiere al registro
AX, como se muestra en la figura 2.13.

45
En la figura se aprecia que se mueve el contenido de 2000H hacia AL y el 2001H
hacia AH.

Registros Memoria

AX 6A 42 6A 02001H

BX 20 00 42 02000H

Figura 2.13. Ejecución de MOV AX, [BX].

En la tabla 2.5 aparecen algunas instrucciones típicas que emplean direccionamiento


indirecto de registros.

Tabla 2.5. Ejemplos de modos de direccionamiento indirecto de registros.

Lenguaje Ensamblador. Operación


Se carga en CX una palabra de la localidad
MOV CX, [BX]
de la memoria seleccionada por BX
Se carga el byte del registro DL en la
MOV [BP], DL
localidad de memoria direccionada por BP.
Se carga el byte del registro BH en la
MOV [DI], BH
localidad de memoria direccionada por DI
No se permiten las transferencias de
memoria, excepto con instrucciones de
MOV [DI], [BX]
cadena
Esta instrucción no se permite, porque el
registro utilizado para el direccionamiento
MOV DL, [DI] indirecto de la memoria no se puede cambiar
con la misma instrucción.

46
La instrucción MOV BYTE PTR [DI],10H muestra con claridad que la localidad
direccionada por DI es una localidad de tamaño byte en la memoria.
5.- Direccionamiento Base más Índice.

Transfiere un byte o palabra entre un registro y la localidad de memoria direccionada


por el contenido de un registro base (BX o BP) más un registro índice (DI o SI).

Por ejemplo, la instrucción MOV [BX + DI], CL, copia el contenido de tamaño byte
del registro CL y lo pasa a la localidad de memoria direccionada por BX + DI en el
segmento de datos.

En la figura 2.14 se muestra como la instrucción MOV DX, [BX + DI] direcciona a
los datos cuando el μP funciona en modo real. En este ejemplo, BX = 1000H, DI = 0010H
y DS = 0100H, por lo que la dirección de memoria que forman es 02010H. Esta
instrucción transfiere una copia de la palabra contenida en las localidades 02010H (DL) y
02011H (DH) al registro DX. En la tabla 2.6 aparecen algunas instrucciones utilizadas para
el direccionamiento base más índice.

Figura 2.14. Ejecucion de la instrucción MOV DX, [BX + DI].

47
Tabla 2.6. Ejemplos de modos de direccionamiento Base + Índice.

Lenguaje Ensamblador. Operación


Se carga en CX el contenido palabra de la
MOV CX, [BX + DI] localidad de memoria direccionada por BX +
DI.
Se carga CH el contenido byte de la
MOV CH, [BP + SI] localidad de memoria direccionada por BP +
SI.
Se carga el contenido palabra de SP, en la
MOV [BX + SI], SP localidad de memoria direccionada por BX +
SI
Se almacena el contenido palabra de CX en
la localidad de memoria direccionada por BP
MOV [BP + DI], CX
+ DI.

6.- Direccionamiento Relativo por Registros.

Transfiere un byte o una palabra entre un registro y una localidad en la memoria


direccionada por el contenido de un registro índice o un registro base y además un
desplazamiento. Por ejemplo, MOV AX, [BX + 4] o MOV AX, ARREGLO[BX]. La
primera instrucción copia una palabra de datos de una dirección en el segmento de datos,
formada por el contenido de BX más 4 y la pone en el registro AX. La segunda instrucción
transfiere el contenido de la localidad de memoria asociada con ARREGLO más el
contenido de BX, hacia el registro AX.

El direccionamiento relativo por registro es similar al direccionamiento base más


índice y el direccionamiento por desplazamiento. En el direccionamiento relativo por
registros, para direccionar datos en el segmento de memoria se agrega un desplazamiento al
contenido de un registro base o índice (BP, BX, DI o SI). En la figura 2.15 se muestra el
funcionamiento de la instrucción MOV AX, [BX + 1000H], en este ejemplo, BX= 0100H y
DS= 0200H, por lo cual la dirección generada es la suma de DS x 10H, BX y el
desplazamiento de 1000H, que es 03100H.

48
Registros Memoria

AX A0 76 A0 03101H

BX 03 00 76 03100H

Figura 2.15. Ejecución de la instrucción MOV AX, [BX + 100H].

En la tabla 2.7 se presenta algunas instrucciones en las que se utiliza el


direccionamiento relativo por registro. Un desplazamiento es un número que se suma al
registro dentro de los corchetes como en la instrucción MOV AL, [DI+2] o que se resta del
registro como en la instrucción MOV AL, [SI -1]. Un desplazamiento también es una
dirección de desplazamiento delante de los [] como en MOV AL, DATO[DI]. Ambas
formas de desplazamiento pueden aparecer al mismo tiempo como en la instrucción
MOV AL, DATO [DI + 3]. En todos los casos, ambas formas de desplazamientos se suman
al registro base o índice dentro de los corchetes []. Cabe mencionar que el desplazamiento
DATO debe ser declarado previamente en el segmento de datos.

Tabla 2.7. Ejemplos de direccionamiento relativo por registros.

Lenguaje ensamblador. Operación.


Se transfiere a AX el contenido palabra de la
MOV AX, [DI + 100H] localidad de memoria, direccionada por DI +
100H
Se carga el contenido byte de BL en la
MOV ARRAY [SI], BL
localidad direccionada por ARRAY más SI.
Se carga el contenido byte de CL en la
MOV LIST [SI + 2], CL localidad direccionada por la suma de LIST,
SI y 2.
Se carga DI en el contenido de la localidad
MOV [DI], SETS[BX]
de memoria direccionada por SETS más BX.

49
7.- Direccionamiento Relativo Base más Índice.

Transfiere un byte o una palabra entre un registro y la localidad en la memoria


direccionada por el contenido de un registro Base más uno de Índice más un
desplazamiento. Por ejemplo, MOV AX, ARREGLO [BX + DI] ó MOV AX, [BX + DI +
4]. Ambas instrucciones copian una palabra de datos de una localidad de memoria y la
coloca en el registro AX. En la primera instrucción se emplea una dirección formada al
sumar ARREGLO, BX y DI, y en la segunda al sumar BX, DI y 4.

El direccionamiento relativo base más índice es similar al direccionamiento base más


índice, pero además suma un desplazamiento para formar una dirección en la memoria.

El direccionamiento relativo base más índice es el modo de direccionamiento menos


utilizado. La figura 2.16 muestra la forma en que se hace referencia a los datos si la
instrucción ejecutada por el μP es MOV AX, [BX + SI + 100H]. El desplazamiento 100H
se suma a BX y SI para formar la dirección del desplazamiento dentro del segmento de
datos. Los registros BX = 0020H, SI= 0010H y DS= 1000H, con lo que la dirección
efectiva para esta instrucción es 10130H, o sea la suma de estos registros más un
desplazamiento de 100H. Este modo de direccionamiento es en extremo complejo para
emplearse con frecuencia en un programa.

Registros Memoria

AX A0 76 A0 10131H

BX 00 20 76 10130H

SI 00 10

Figura 2.16. Ejecución de la instrucción MOV AX,[BX + SI + 100H].

En la tabla 2.8 aparecen algunas instrucciones típicas en las que se emplea el


direccionamiento relativo base más índice.
Tabla 2.8. Ejemplos de direccionamiento relativo base más índice.

50
Lenguaje Ensamblador. Operación.
Se carga DX con el contenido de la localidad
MOV DX, [BX + DI + 20H]
direccionada por BX + DI + 20H.
Se carga AX con el contenido de la localidad
MOV AX, ARCHIVO [BX + DI]
direccionada por ARCHIVO + BX + DI
Se carga el contenido de CL en la localidad
MOV LISTA [BP + DI], CL
direccionada por LISTA + BP + DI.
Se carga el contenido de DH en la localidad
MOV LISTA [BP + SI + 4], DH de memoria direccionada por LISTA + BP +
SI + 4.

2.15.- El operador PTR.

El operador PTR puede ser usado en variables de datos y en etiquetas de instrucción.


Utiliza los especificadores de tipo BYTE y WORD para determinar un tamaño en un
operando ambiguo o para pasar por encima del tipo definido (DB o DW) para variables.
También usa los especificadores tipo NEAR, FAR y PROC para pasar por alto la distancia
implicada de etiquetas. El formato general es:

Tipo PTR expresión

El tipo es el nuevo atributo, tal como BYTE. La expresión es una variable o


constante. A continuación, están unos ejemplos del operador PTR.

Mueve el valor inmediato 25H a las


MOV WORD PTR [120H], 25H
localidades de memoria 120H y 121H.
Mueve el valor inmediato 30H a la
MOV BYTE PTR [122H], 30H
localidad de memoria 122H

51
2.16.- El conjunto de instrucciones.

El conjunto de instrucciones de la familia 8086/8088 incluye equivalentes de las


instrucciones que se encuentran en 8085 o en casi cualquier μP de 8 bits, más algunas
operaciones nuevas. Las categorías de instrucciones incluyen: transferencia de datos,
aritmética, manipulación de bits, cadenas o arreglos, transferencia de programa y control
del procesador.

Transferencia de datos.

El conjunto de instrucciones del 8086 incluye instrucciones para transferencia de


datos que transfieren bytes o palabras de datos entre la memoria y los registros así como
entre el acumulador y los puertos de E/S. En la tabla 2.9 aparecen algunas de estas
instrucciones y se describen en forma breve las características de funcionamiento de cada
una.

Tabla 2.9. Instrucciones para transferencia de datos.

Instrucción Función
Mete datos al acumulador desde un dispositivo de
IN
Entrada.
LAHF Cargas banderas en AH
LEA Carga la dirección efectiva.
MOV Mueve byte o palabra.
OUT Saca datos del acumulador a un dispositivo de Salida.
POP Recupera una palabra de la pila.
POPF Recupera las banderas de la pila.
PUSH Salvan las palabras en la pila.
PUSHF Salva banderas en la pila.
SAHF Carga AH en las banderas.
XCHG Intercambia bytes o palabras.

52
Aritmética.

La familia 8086 puede sumar, restar, multiplicar y dividir datos como bytes o
palabras. El sistema suma y resta con el empleo de datos con signo o sin signo y datos BCD
o ASCII. Multiplica y divide números ASCII y números con signo y sin signo. En la tabla
2.10 se encuentran algunas de las instrucciones aritméticas utilizadas en la familia de
procesadores 8086.

Tabla 2.10. Instrucciones aritméticas.

Instrucción Función
AAA Ajuste ASCII para la suma.
AAD Ajuste ASCII para la división.
AAM Ajuste ASCII para la multiplicación.
AAS Ajuste ASCII para resta.
ADD Suma datos entre registros o la memoria y otros registros.
ADC Suma datos con la bandera de acarreo.
CBW Convierte byte a palabra.
CMP Compara los datos.
DAA Ajuste decimal de AL después de una suma BCD.
DAS Ajuste decimal de AL después de una resta BCD.
DEC Decrementar.
DIV División sin signo.
IDIV División con signo.
IMUL Multiplicación con signo.
INC Incrementar.
MUL Multiplicación sin signo.
NEG Cambia el signo (lo vuelve negativo)
SBB Resta con préstamo.
SUB Resta datos entre los registros y la memoria u otro registro.

Manipulación de bits.

Las instrucciones para la manipulación de bits binarios se utilizan para controlar los
datos hasta el nivel de bits en la familia de microprocesadores 8086. Estas instrucciones
incluyen operaciones lógicas, corrimientos y rotaciones. En la tabla 2.11 aparece una breve
descripción de algunas instrucciones y su código simbólico de funcionamiento.

53
Instrucciones para cadenas.

Las instrucciones para cadenas o arreglos se emplean para manipular cadenas de datos
en la memoria. Cada cadena consta, ya sea, de bytes o de palabras y tiene hasta 64 K bytes
de longitud. En las instrucciones para la cadena se emplean los registros SI y DI para
direccionar los datos y el registro CX para contar el número de bytes o de palabras en que
se trabajó. Las instrucciones para las cadenas ocurren una vez salvo que tengan uno de los
prefijos REP, REPE/REPZ o REPN/REPNZ. Si una instrucción para cadena tiene uno de
esos prefijos, se repite el número de veces contenido en el registro de conteo CX. En la
tabla 2.12 se presentan algunas operaciones para cadena disponibles en la familia de
microprocesadores 8086.

Tabla 2.11. Instrucciones para manipulación de bits.

Instrucción. Función.
AND Y (AND) lógica.
NOT Invertir (complemento a 1).
OR O lógica.
SAR Corrimiento aritmético a la derecha.
SHL/SAL Corrimiento a la izquierda.
SHR Corrimiento lógico a la derecha.
RCL Rotación a la izquierda con acarreo.
ROL Rotación a la izquierda.
RCR Rotación a la derecha con acarreo.
ROR Rotación a la derecha.
TEST Operación con el AND lógico, pero solo afectando banderas.
XOR O exclusivo.

Tabla 2.12. Instrucciones para cadenas.

Instrucción. Función.
CMPS Comparación entre memoria y memoria.
LODS Carga al acumulador.
MOVS Mover de memoria a memoria.
SCAS Comparación entre la memoria y el acumulador.
STOS Almacenar en el acumulador.

54
Transferencia de programa.

Las instrucciones para la transferencia de programa incluyen saltos, llamadas (CALL)


a procedimientos y retorno de procedimientos. En la tabla 2.13 se presentan instrucciones
para transferencia de programa.

Tabla 2.13. Instrucciones para transferencia de programa.

Instrucción. Función.
CALL Llama a un procedimiento (subrutina)
INT Interrumpir.
INT3 Interrupción tipo 3.
INTO Interrumpir por sobre flujo.
IRET Retornar de una interrupción.
JA Brinca si en mayor.
JAE Brinca si es mayor o igual que.
JB Brinca si es menor.
JBE Brinca si es menor o igual.
JC Brinca si hay acarreo.
JE/JZ Brinca si es igual o saltar si es cero.
JG Brinca si es mayor que.
JGE Brinca si es mayor o igual.
JL Brinca si es menor que.
JLE Brinca si es menor o igual.
JMP Brinca a otra parte del programa.
JNC Brinca si no hay acarreo.
JNE/JNZ Brinca si no es igual o si no es cero.
JNO Brinca si no hay desbordamiento.
JNP Brinca si no hay paridad (impar).
JNS Brinca si no es signo positivo.
JO Brinca si hay desbordamiento.
JP Brinca si hay paridad (par).
JS Brinca si tiene signo (negativo).
LOOP Repite ciclo CX veces
JCXZ Brinca si CX es cero.
RET Retorna de un procedimiento (subrutina).

55
Control de procesador.

Las instrucciones para control del procesador habilitan y deshabilitan las


interrupciones, modifican los bits de bandera y sincronizan los eventos externos. En la tabla
2.14 se presenta una lista de instrucciones de control del procesador.

Tabla 2.14. Instrucciones de control del procesador.

Instrucción. Función.
CLC Borrar bandera de acarreo.
CLD Habilitar incremento automático.
CLI Deshabilitar terminal INTR.
CMC Complementa bandera de acarreo.
LOCK Controla terminal LOCK en el 8086/8088.
NOP No operación.
STC Activa bandera de acarreo.
STD Selecciona modo de decremento automático.
STI Habilitar interrupciones.
WAIT Espera a que la terminal TEST = 0.

56
Instituto Tecnológico de Ciudad Madero

Capítulo III.

Operadores y Directivas

En
Lenguaje Ensamblador.

57
3.1.- Ensambladores y compiladores.

Primero identificaremos dos clases de lenguajes de programación: alto nivel y bajo


nivel. Los programadores que escriben en un lenguaje de alto nivel, como C y Pascal,
codifican comandos poderosos, cada uno de los cual puede generar muchas instrucciones
en lenguaje máquina. Por otro lado, los programadores que escriben en un lenguaje
ensamblador de bajo nivel codifican instrucciones simbólicas, cada una de las cuales genera
una instrucción en lenguaje de máquina. A pesar del hecho de que codificar en un lenguaje
de alto nivel es más productivo, algunas ventajas de codificar en lenguaje ensamblador son:

 Proporciona más control sobre el manejo particular de los requerimientos de


hardware.
 Genera módulos ejecutables más pequeños y más compactos.
 Con mayor probabilidad tiene una ejecución más rápida.

Una práctica común es combinar os beneficios de ambos niveles de programación:


codificar el grueso de un proyecto en un lenguaje de alto nivel y los módulos críticos
(aquellos que provocan notables retardos) en lenguaje ensamblador.

Sin importar el lenguaje de programación que utilice, de todos modos es un lenguaje


simbólico que tiene que traducirse a una forma que la computadora pueda ejecutar. Un
lenguaje de alto nivel utiliza un compilador para traducir el código fuente a lenguaje de
máquina (técnicamente, código objeto). Un lenguaje de bajo nivel utiliza un ensamblador
para realizar la traducción. Un programa enlazador para ambos niveles, alto y bajo,
completa el proceso al convertir el código objeto en lenguaje ejecutable de máquina.

3.2.- Comentarios en lenguaje ensamblador.

El uso de comentarios a lo largo de un programa puede mejorar su claridad, en


especial en lenguaje ensamblador, donde el propósito de un conjunto de instrucciones con
frecuencia no es claro. Un comentario empieza con un punto y coma (;) y, en donde quiera
que lo codifique, el ensamblador supone que todos los caracteres a la derecha en esa línea
son comentarios. Un comentario puede contener cualquier carácter imprimible, incluyendo
el espacio en blanco.

Un comentario puede aparecer solo en una línea o a continuación de una instrucción


en la misma línea, como lo muestra en dos ejemplos siguientes:

1. ; Toda esta línea es un comentario.

2. ADD AX, BX ; Comentario en la misma línea que la instrucción.

58
Ya que un comentario aparece solo en un listado de un programa fuente en
ensamblador y no genera código de máquina, puede incluir cualquier cantidad de
comentarios sin afectar el tamaño o la ejecución del programa ensamblado

Técnicamente se está en libertad de usar letras mayúsculas o minúsculas


indistintamente para las instrucciones y comentarios.

Otra manera de proporcionar comentarios es por medio de la directiva COMMENT.

3.3.- Palabras reservadas.

Ciertas palabras en lenguaje ensamblador están reservadas para sus propósitos


propios, y solo son usados bajo condiciones especiales. Por categorías las palabras
reservadas incluyen:

 Instrucciones, como MOV y ADD, que son operaciones que la computadora


puede ejecutar.

 Directivas, como END o SEGMENT, que se emplean para proporcionar


comandos al ensamblador.

 Operadores, como FAR y SIZE, que se utilizan en expresiones.

 Símbolos predefinidos, como @Data y @Model, que regresan información a su


programa.

El uso de una palabra reservada para un propósito equivocado provoca que el


ensamblador genere un mensaje de error.

3.4.- Identificadores.

Un identificador es un nombre que se aplica a elementos en el programa. Los dos


tipos de identificadores son: nombre, que se refiere a la dirección de un elemento de dato,
y etiqueta, que se refiere a la dirección de una instrucción. Las mismas reglas se aplican
tanto para los nombres como para las etiquetas. Un identificador puede utilizar los
siguientes caracteres:

 Letras de alfabeto: Desde la A hasta la Z.

59
 Dígitos: Desde el 0 hasta el 9 (no puede ser el primer carácter).

 Caracteres especiales: Signo de interrogación (?).


subrayado( _ ).
signo de pesos ($).
arroba (@).
punto (.) (no puede ser el primer carácter).

El primer carácter de un identificador debe ser una letra o un carácter especial,


excepto el punto. Ya que el ensamblador utiliza algunos símbolos especiales en palabras
que inician con el símbolo @, debe evitar usarlo en sus definiciones.

El ensamblador trata las letras mayúsculas y minúsculas como iguales. La longitud


máxima de un identificador es de 31 caracteres (247 desde el MASM 6.0). Se recomienda
que los nombres sean descriptivos y con significado. Los nombres de registros como AX,
DI y AL, están reservados para hacer referencia a esos mismos registros. En consecuencia,
en una instrucción tal como: ADD AX, BX el ensamblador sabe de forma automática que
AX y BX se refieren a los registros. Sin embargo, en una instrucción como: MOV DATOS,
AX el ensamblador puede reconocer el nombre, DATOS solo si se define en algún lugar del
programa.

3.5.- Instrucciones.

Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los


dos tipos de enunciados son:

1. Instrucciones, tal como MOV y ADD, que el ensamblador traduce a código objeto.

2. Directivas, que indican el ensamblador que realice una acción específica, como definir
un elemento de dato.

A continuación esta el formato general de un enunciado, en donde los corchetes


indican una entrada opcional.

[Identificador] Operación [operando(s)] [;comentario]

60
Un identificador (si existe), una operación y un operando (si existe) están separados
por al menos un espacio en blanco o un carácter de tabulador. Existe un máximo de 132
caracteres en una línea (512 desde MASM 6.0), aunque la mayoría de los programadores
prefiere permanecer en los 80 caracteres ya que es el número máximo que cabe en la
pantalla. A continuación se presentan dos ejemplos de enunciados:

Identificador Operación Operando Comentario


Directiva: COUNT DB 1 ; Nombre, operación, operando
Instrucción: MOV AX,0 ; Operación, dos operandos.

Identificador.

Como ya se explicó, el termino nombre se aplica al nombre de un elemento o


directiva definida mientras que el termino etiqueta se aplica al nombre de una instrucción.

Operación.

La operación que debe ser codificada, es con mayor frecuencia usada para la
definición de áreas de datos y codificación de instrucciones. Para un elemento de datos, una
operación tal como DB o DW define un campo, de área de trabajo o constante. Para una
instrucción, una operación como MOV o ADD indica una acción a realizar.

Operando.

El operando (si existe) proporciona información para la operación que actúa sobre el.
Para un elemento de datos, el operando identifica su valor inicial. Por ejemplo, en la
definición siguiente de un elemento de datos llamado CONTADOR, la operación DB
significa "definir byte", y el operando inicializa su contenido con un valor cero:

Nombre Operación Operando Comentario


Contador DB 0 ; Define un byte (DB) con el valor cero

61
Para una instrucción un operando indica en donde realizar la acción. Un operando
de una instrucción puede tener una, dos o tal vez ninguna entrada. Aquí están tres ejemplos:

Operación Operando Comentario Operando


RET ; Regresa Ninguno
INC CX ; Incrementa al registro CX Uno
ADD AX,12 ; Suma 12 a AX Dos

3.6.- Directivas.

El lenguaje ensamblador permite usar diferentes enunciados que permiten controlar la


manera en que un programa ensambla y lista. Estos enunciados, llamados directivas, actúan
solo durante el ensamblado de un programa y no generan código ejecutable de máquina.
Las directivas más comunes son explicadas a continuación:

3.6.1. Directivas para listar: PAGE y TITLE.

Las directivas PAGE y TITLE ayudan a controlar el formato de un listado de un


programa en ensamblador. Este es su único fin, y no tiene efecto sobre la ejecución
subsecuente del programa.

PAGE.- Al inicio de un programa, la directiva PAGE designa el número máximo de líneas


para listar en una página y el número máximo de caracteres en una línea. Su
formato general es:
PAGE [longitud] [, ancho]

El ejemplo siguiente proporciona 60 líneas por página y 132 caracteres por línea:

PAGE 60, 132

El número de líneas por página puede variar desde 10 hasta 255, mientras que el
número de caracteres por línea desde 60 hasta 132. La omisión de un enunciado PAGE
causa que el ensamblador tome PAGE 50, 80.

También puede forzar un salto de página en una línea específica en el listado del
programa, como al final de un segmento. En la línea requerida, solo codifique PAGE sin
operandos.

62
TITLE.- Se puede emplear la directiva TITLE para hacer que un título para que un
programa se imprima en la línea dos de cada pagina en el listado del programa.
Puede codificar TITLE de una vez, al inicio del programa. Su formato general es:

TITLE texto

3.6.2. Directiva SEGMENT

Un programa ensamblado en formato .EXE consiste en uno o más segmentos. Un


segmento de pila define el almacén de la pila , un segmento de datos, define los elementos
de datos y un segmento de código proporciona un código ejecutable. Las directivas para
definir un segmento, SEGMENT y ENDS, tienen el formato siguiente:

NOMBRE OPERACION OPERANDO COMENTARIO


Nombre SEGMENT [opciones] ;inicia el segmento
.
.
.
Nombre ENDS ;Fin del segmento

El enunciado SEGMENT define el inicio de un segmento. El nombre del segmento


debe estar presente, ser único y cumplir las convenciones para nombres del lenguaje. El
enunciado ENDS indica el final del segmento y contiene el mismo nombre del enunciado
SEGMENT.

El operando de un enunciado SEGMENT puede tener tres tipos de opciones:


alineación, combinar y clase, codificadas en este formato:

Nombre SEGMENT alineación combinar ‘clase’

Tipo alineación.- La entrada alineación indica el límite en el que inicia el


segmento. Para el requerimiento típico, PARA, alinea el segmento con el límite de un
párrafo. En ausencia de un operando hace que el ensamblador por omisión tome PARA.

Tipo combinar.- La entrada combinar indica si se combina el segmento con otros


segmentos cuando son enlazados después de ensamblar. Los tipos combinar son STACK,
COMMON, PUBLIC y la expresión AT. Por ejemplo, el segmento de la pila por lo
común es definido como:

Nombre SEGMENT PARA STACK

63
Puede utilizar PUBLIC y COMMON en donde tenga el propósito de combinar de
forma separada programas ensamblados cuando los enlaza. En otros casos, donde un
programa no es combinado con otros, puede omitir la opción o codificar NONE.

Tipo clase.- La entrada clase, encerrada entre apóstrofos, se utiliza para agrupar
segmentos cuando se enlazan. Se utilizan la clase 'code' para el segmento de códigos
(recomendado por Microsoft), 'data' para el segmento de datos y 'stack' para el segmento
de la pila.

El ejemplo siguiente define un segmento de pila con tipos alineación, combinar y


clase.

Nombre SEGMENT PARA STACK 'stack'

3.6.3. Directiva PROC

El segmento de código contiene el código ejecutable de un programa. También tiene


uno o más procedimientos, definidos con la directiva PROC. Un segmento que tiene solo
un procedimiento puede aparecer como sigue:

Nombre Operación Operando Comentario


Nomsegmto SEGMENT PARA
Nomproc PROC FAR ;un procedimiento
. ;dentro del segmento.
. ;de código
.
Nomproc ENDP
Nomsegmto ENDS

El nombre del procedimiento debe estar presente, ser único y seguir las reglas para la
formación de nombres del lenguaje. El operando FAR en este caso esta relacionado con la
ejecución del programa. Cuando solicita la ejecución de un programa, el cargador de
programas del DOS utiliza el nombre del procedimiento como el punto de entrada para la
primera instrucción a ejecutar.

La directiva ENDP indica el fin de un procedimiento y contiene el mismo nombre que


el enunciado PROC para permitir que el ensamblador relacione a los dos. Ya que los
procedimientos deben estar por completo dentro de un segmento, ENDP define el final de
un procedimiento antes que ENDS defina el final de un segmento.

64
El segmento de código puede contener cualquier número de procedimientos usados
como subrutinas cada uno de los cuales va con su característico conjunto de enunciados
PROC y ENDP. Cada PROC adicional por lo común se codifica con (o por omisión) el
operando NEAR.

3.6.4. Directiva ASSUME

Un programa utiliza al registro SS para direccionar la pila, al registro DS para


direccionar el segmento de datos y al registro CS para direccionar el segmento de código.
Para este fin, se tiene que indicar al ensamblador el propósito de cada segmento en el
programa. La directiva para este propósito es ASSUME, codificada en el segmento de
código como sigue:

Operación Operando

ASSUME SS:nompila, DS:nomsegdatos, CS:nomsegcodigo,...

SS: nompila significa que el ensamblador asocia el nombre del segmento de la pila
con el registro SS, y de manera similar, con los otros operandos mostrados. Los operandos
pueden aparecer en cualquier orden. ASSUME también puede contener una entrada para el
ES, tal como ES:nomsegdatos; si el programa no utiliza el registro ES, se puede omitir su
referencia o codificar ES: NOTHING.

Directiva END.

Como ya se menciono, la directiva ENDS finaliza un segmento y la directiva ENDP


finaliza un procedimiento. Una directiva END finaliza todo el programa. Su formato
general es:

Operación Operando

END [nomproc]

En la mayoría de los programas, el operando contiene el nombre del primero o único


procedimiento (PROC) designado como FAR, donde inicia la ejecución del programa.

65
3.7.- Definición de Datos.

Como ya se estudió, el propósito del segmento de datos de un programa. EXE es


definir constantes, áreas de trabajo y áreas de entrada/salida. El ensamblador permite la
definición de elementos de varias longitudes de acuerdo con el conjunto de directivas que
defina datos. Por ejemplo, DB define un byte y DW define una palabra. Un elemento de
datos puede contener un valor indefinido (no inicializado) o una constante, definida como
una cadena de caracteres o como un valor numérico. A continuación está el formato general
para la definición de datos:

[nombre] Dn Expresión

Nombre.- Un programa que hace una referencia a un elemento de dato lo hace por medio
de un nombre. Por otro lado, el nombre de un elemento es opcional.

Directivas.- Las directivas que definen elementos de datos son DB (byte) y DW (palabra).
Cada uno indica de manera explícita la longitud del elemento definido.

Expresión.- La expresión es un operando que puede contener un signo de interrogación


para indicar un elemento no utilizado, como:

FLD1 DB ? ; Elemento no inicializado

En este caso, cuando el programa inicie la ejecución el valor inicial de FLD1 no es


conocido. En la práctica, lo normal antes de usar este elemento es mover algún valor a el.

También puede utilizar el operando para definir una constante como:

FLD2 DB 25 ; Elemento inicializado

Puede usar con libertad este valor inicializado en su programa y aun puede cambiar el
contenido de FLD2.

Una expresión puede contener varios valores constantes separados por comas y
limitados solo por la longitud de la línea, como sigue:

FLD3 DB 11, 12, 13, 14, 15, 16,....

66
El ensamblador define estas constantes en bytes contiguos. Una referencia a FLD3
es a la primera constante de un byte (FLD3 + 0), y una referencia a FLD3 + 1 es a la
segunda constante, 12. Por ejemplo la instrucción

MOV AL, FLD3 + 3

Carga el valor 14 (OEH) en el registro AL. También la expresión permite


duplicación de constantes en un enunciado de la forma general.

[nombre] Dn Contador de repeticiones DUP (expresión)...

Los ejemplos siguientes ilustran la duplicación:

DW 10 DUP (?) ; Diez palabras, no inicializadas


DB 5 DUP (14) ;Cinco bytes con OEOEOEOEOE hexadecimal
DB 3 DUP (4 DUP (8)) ;Doce 8

El tercer ejemplo genera cuatro copias del dígito 8 (8888) y duplica el valor tres
veces, produciendo un total doce 8.

Cadenas de caracteres.

Las cadenas de caracteres son usadas para datos descriptivos como nombres de
personas y títulos de páginas. La cadena esta definida dentro de apóstrofos, como 'PC', o
dentro de comillas, como "PC". El ensamblador traduce las cadenas de caracteres en código
objeto en formato ASCII normal.

Extrañamente, DB es el único formato que define una cadena de caracteres que


excede a dos caracteres y los almacenes en la secuencia normal de izquierda a derecha. En
consecuencia, DB es el formato convencional para la definición de datos de caracteres de
cualquier longitud. Un ejemplo es:

DB 'cadena de caracteres'

3.7.1. Directivas para la definición de datos.

67
Las directivas convencionales usadas para definir datos, junto con los nombres
introducidos por MASM 6.0 son:

Descripción Directivas convencionales Directivas MASM 6.0


Definir byte (s) DB BYTE
Definir una palabra DW WORD

El programa ensamblado de la figura 3.1 proporciona ejemplos de las directivas que


definen cadenas de caracteres y constantes numéricas.

PAGE 60, 132


TITLE PO4DEFIN (EXE) Define data items
.MODEL SMALL
; Se definen Bytes_DB:
; ----------------------------------- -----------------------------------
FLD1DB DB ? ;No se inicia
FLD2DB DB 32 ; Constante decimal
FLD3DB DB 20H ; Constante hexadecimal
FLD4DB DB 01011001B ; Constante binaria
FLD5DB DB 10DUP (0) ; Diez ceros
FLD6DB DB 'Personal Computer' ; Cadena de caracteres
FLD7DB DB '326554' ; Número como caracteres
; Se define words - DW
FLD1DW DW OFFOH ; Constante hexadecimal
FLD2DW DW 01011001B ; Constante binaria
FLD3DW DW FLD7DB ; Constante de dirección
FLD4DW DW 3,4,7,8,9 ; Tabla de cinco constantes
FLD5DW DW 5 DUP (0) ; Cinco ceros

Figura 3.1.- Definición de cadenas de caracteres y valores numéricos.

3.8.- La Directiva EQU.

68
La directiva EQU no define elementos de datos. En lugar de eso, define un valor que
el ensamblador puede usar para sustituir en otras instrucciones. Considere el enunciado
EUQ siguiente, codificado en el segmento de datos:

TIMES EQU 10

El nombre en este caso TIMES, puede ser cualquier nombre aceptable por el
ensamblador. Ahora, siempre que una instrucción o en otra directiva aparezca la palabra
TIMES, el ensamblador la sustituye por el valor 10. Por ejemplo, el ensamblador convierte
la directiva.

FIELDA DB TIMES DUP (?)

Su valor equivalente

FIELDA DB 10 DUP (?)

Una instrucción también puede tener un operador con EQU, como en el siguiente :

COUNTR EQU 05
.
.
.
MOV CX,COUNTR

El ensamblador reemplaza COUNTR en el operando MOV con el valor 05, haciendo


del operando un valor inmediato, como si estuviera codificado.

MOV CX, 05 ; El ensamblador sustituye 05

La ventaja de EQU es que muchos enunciados pueden utilizar valores definidos por
COUNTR. Si el valor ha sido cambiado, solo necesita cambiar el enunciado EQU. No
necesita decirse que puede usar un valor igualado (con EQU) solo en donde una sustitución
tenga sentido para el ensamblador. También se puede igualar (con EQU) nombres
simbólicos como el siguiente código:

TOTALPAY DW 0
.
.
.
TP EQU TOTALPAY
MPY EQU MUL

El primer EQU hace equivalente (iguala) el alias TP al elemento definido


TOTALPAY. Para cualquier instrucción que tenga el operando TP, el ensamblador lo
reemplaza con la dirección TOTALPAY.

69
El segmento EQU permite a un programa usar la palabra MPY en lugar de la
instrucción simbólica MUL.

3.9.- Como inicializar un programa para su ejecución.

La figura 3.2. proporciona una estructura de un programa .EXE que muestra los
segmentos de la pila, de los datos y del código.

Examinemos las instrucciones del programa por numero de línea:

LÍNEA EXPLICACIÓN
1 La directiva PAGE para este listado establece 60 líneas y 132 columnas por
página.
2 La directiva TITLE identifica el nombre del programa PO4ASM1.
3 Las líneas 3,7,11 son comentarios que califican la declaración de los
segmentos definidos.
4-6 Estos enunciados definen el segmento de pila, STACKSG(pero no su
contenido).
8-10 Estos enunciados definen el segmento de datos, DATASG(pero no su
contenido).
12-21 Estos enunciados definen el segmento de código, CODESG.
13-20 Estos enunciados definen el segmento del código del único procedimiento,
llamado BEGIN. Este procedimiento ilustra los requisitos comunes de
inicialización y de salida para dar programa. EXE. Los dos requisitos para
inicializar son (1) avisar al ensamblador que segmentos asocia con los registros
de segmentos y (2) cargar el DS con la dirección de segmentos de datos.
14 La directiva ASSUME avisa al ensamblador que asocie ciertos segmentos con
ciertos registros de segmentos. Al asociar segmentos con registros de
segmentos, el ensamblador puede determinar en le pila, para los elementos en
el segmento de datos y para las instrucciones en el segmento de código.
15-16 Dos Instrucciones inicializan la dirección al segmento de datos en el registro
DS:
MOV DS, AX; Almacena la dirección en DS.
El primer MOV carga la dirección del segmento de datos en el registro AX y el
segundo MOV copia la dirección del AX al DS. Se requieren dos MOV ya que
ninguna instrucción puede mover datos de forma directa de la memoria a un
registro de segmento.
18-19 Estas dos instrucciones hacen la petición de terminación del programa y
regresan al DOS.
22 El enunciado END indica al ensamblador que este es el final del programa y el
operando BEGIN proporciona el punto de entrada para la ejecución
subsecuente del programa.

1 PAGE 60,132
2 TITLE PO4ASM1 Estructura de un programa. EXE

70
3 ;---------------------------------------------------------------------------------------------
4 STACKSG SEGMENT PARA STACK ‘stack’
5 .
.
.
6 STACKSG ENDS
7 ;---------------------------------------------------------------------------------------------
8 DATASG SEGMENT PARA ‘data’
9 .
.
.
10 DATASG ENDS
11 ;----------------------------------------------------------------------------------------------
12 CODESG SEGMENT PARA "code"
13 BEGIN PROC FAR
14 ASSUME SS:STACKSG, DS:DATASG, CS:CODESG
15 MOV AX,DATASG
16 MOV DS, AX
17 .
.
.
18 MOV AX, 4C00H
19 INT 21H
20 BEGIN ENDP
21 CODESG ENDS
22 END BEGIN

Figura 3.2.-Estructura de un programa .EXE

71
Instituto Tecnológico de Ciudad Madero

Capítulo III.

Manejo Básico de

Pantalla y Teclado.

4.1.- Introducción al procesamiento de pantalla y teclado.

72
Hasta este punto nuestros programas han definido datos ya sea en el área de datos o
como datos inmediatos en un operando de instrucción. Sin embargo, la mayoría de los
programas necesitan entradas desde un teclado, ratón o módem y proporcionan salidas en
un formato útil en la pantalla, impresora o disco.

Existen varios requisitos para especificar un dispositivo al sistema y solicitar una


operación de entrada o salida. La instrucción INT (interrupción), para la mayoría de los
propósitos, maneja entrada y salida.

Los dos tipos de interrupciones que se tratarán son las funciones de la INT 10H del
BIOS para manejar la pantalla y las funciones de la INT 21H del DOS para mostrar salidas
en pantalla y aceptar entradas desde el teclado. Estas funciones (o servicios) solicitan una
acción; para identificar el tipo de operación que la interrupción va a realizar, inserte un
número de función en el registro AH.

4.2.- La pantalla.

La pantalla es una malla de posiciones direccionables, en cualquiera de las cuales se


puede colocar el cursor. Por ejemplo, un monitor común de video tiene 25 renglones
(numerados del 0 hasta el 24) y 80 columnas (numeradas desde 0 hasta 79). A continuación
se muestran varios ejemplos de ubicaciones del cursor.

Formato Decimal Formato Hexadecimal


Ubicación en pantalla
Renglón Columna Renglón Columna
Esquina superior izquierda 00 00 00H 00H
Esquina superior derecha 00 79 00H 4FH
Centro de la pantalla 12 39 / 40 OCH 27H / 28H
Esquina inferior izquierda 24 00 18H 00H
Esquina inferior derecha 24 79 18H 4FH

4.3. Funciones más comunes del BIOS (INT 10H) para el manejo de la pantalla.

73
4.3.1.- Colocación del cursor.

La colocación del cursor es un requisito común en modo de texto, ya que su posición


determina en donde será desplegado el siguiente caracter. (El modo gráfico no permite el
uso del cursor). La INT 10H es la operación del BIOS para manejo de la pantalla, y la
función 02H en el registro AH indica la operación que coloca el cursor. Se carga el número
de página (o pantalla), por lo común 0, en el registro BH y en el registro DX el renglón y
columna requeridos. Los contenidos de los otros registros no son importantes.

Las instrucciones siguientes colocan el cursor en el renglón 05, columna 12

MOV AH ,02H ; Petición para colocar el cursor


MOV BH,00H ; número de página 0
MOV DH,05 ; renglón 05
MOV DL,12 ; columna 12
INT 10H

Para establecer el renglón y la columna en el DX también puede utilizar una


instrucción mov con un valor hexadecimal inmediato, como:

MOV DX, 050CH ; Renglón 05, Columna 12

4.3.2.- Limpiar la pantalla.

La función 06H del BIOS maneja el borrado o el recorrido de la pantalla; puede


limpiar todo o parte de un despliegue iniciando en cualquier localidad de la pantalla y
terminando en cualquier localidad con número mayor. Por ejemplo, para limpiar toda la
pantalla especifique el renglón : columna iniciales como 00:00H y el renglón : columna
finales como 18:4FH. Carga estos registros.

AH ; Función 06H.
AL ; 00H para la pantalla completa.
BH ; Número del atributo.
CX ; Renglón: columna iniciales.
DX ; Renglón: columna finales.
En el ejemplo siguiente el atributo 71H establece toda la pantalla con fondo blanco
(7) con primer plano azul (1).

74
MOV AH, 06H ; Función 06H
MOV AL, 00H ; Pantalla completa.
MOV BH, 71H ; Numero de atributo (fondo blanco, letras azules)
MOV CH, 00H ; Renglón inicial.
MOV CL, 00H ; Columna inicial.
MOV DH, 18H ; Renglón final.
MOV DL, 4FH ; Columna final.

También se puede codificar de la forma siguiente:

MOV AX,0600H
MOV BH,71H
MOV CX,0000H
MOV DX,184FH
INT 10H

4.4. Funciones más comunes del DOS (INT 21H) para captura de caracteres del
teclado y despliegue en pantalla.

4.4.1.- Función 09H del DOS para despliegue en pantalla.

La simplicidad de la función 09H del DOS, original para el despliegue, es lo que la


mantiene en uso común. Requiere la definición de cadena de despliegue en el área de datos.
La cadena es seguida inmediatamente por un delimitador de signo de pesos ($, 024H), el
cual utiliza la operación para finalizar el despliegue. El ejemplo siguiente lo ilustra:

Cadena DB 'Es una cadena','$' ; cadena de despliegue.

Puede codificar el signo de pesos inmediatamente después de la cadena de despliegue


como se mostró, como parte de la cadena en '¿Nombre del cliente?$', o en la línea
siguiente como en DB '$'. Sin embargo, el resultado es que no se puede utilizar esta función
para desplegar en la pantalla un carácter $.

Coloque la función 09H en el registro AH, utilice LEA para cargar la dirección de la
cadena de despliegue en el DX, y emita una instrucción INT 21H. La operación despliega
los caracteres de izquierda a derecha y reconoce el final de los datos al encontrar el
delimitador de signo de pesos ($). El código en los lenguajes ensamblador es:
MOV AH,09H ; Petición para desplegar
LEA DX,CADENA ; Carga la dirección de la indicación.
INT 21H ; Llama al DOS

75
La operación INT no cambia el contenido de los registros. Una cadena desplegada
que exceda la columna de la extrema derecha de la pantalla continúa de forma automática
en el siguiente renglón, recorriendo la pantalla tanto como sea necesario. Si al final de la
cadena se omite el signo de pesos la operación despliega caracteres de la memoria hasta
que encuentre un signo así, si existe alguno.

4.4.2.- Uso de caracteres de control para desplegar.

Una manera de hacer más eficaz el uso de despliegues es utilizar los caracteres de
control: Retorno de carro, Avance de línea y el Tabulador. Puede codificarlos como valores
ASCII o números hexadecimales, así:

Carácter de control ASCII HEX Efecto en el cursor


Retorno de carro 13 0DH Restablece a la posición de la extrema izquierda.
Avance de línea 10 0AH Avanza a la línea siguiente.
Tabulador 09 09H Avanza a la siguiente marca de tabulador

Siempre que se desplieguen salidas o acepten entradas, utilice estos caracteres de


control para el manejo de cursor. Aquí esta un ejemplo que despliega el contenido de una
cadena de caracteres llamada MENSAJE, seguida por un retorno de carro y un avance de
línea para colocar el cursor en la línea siguiente:

Mensaje DB 09, 'UAMSZ Ingeniería', 13, 10, '$'



MOV AH,09H ; Petición de despliegue.
LEA DX, MENSAJE ; Carga la dirección del titulo
INT 21H ; Llama al DOS.

El uso de EQU para redefinir los caracteres de control puede hacer que un programa
sea mas legible:

CR EQU 13 ; (o EQU 0DH)


LF EQU 10 ; (o EQU 0AH)
TAB EQU 09 ; (o EQU 09H)

76
Mensaje DB TAB, 'UAMSZ Ingeniería', CR, LF, '$'

4.4.3.- Función 02H del DOS para despliegue en pantalla.

Puede encontrar que la función 02H de la INT 21H, sea útil para despliegue de un
solo caracter. Cargue en el registro DL el caracter que será desplegado en la posición actual
del cursor, y solicite la INT 21H. Los caracteres de Tabulador, Retorno de carro y Avance
de
línea actúan normalmente, y la operación avanza de manera automática el cursor.

A
El código en lenguaje ensamblador es:

MOV AH,02H ; Petición de desplegar un carácter


MOV DL, char ; carácter desplegado
INT 21h ; Llama al DOS

El ejemplo siguiente muestra como utilizar este servicio para desplegar una cadena
de caracteres. La cadena a desplegar esta definida en CONAME. El programa carga la
dirección de CONAME en el registro DI y su longitud en el CX. El código es como sigue:

Coname DB 'Software services', 13, 10


.
.
.
MOV AH,02H ; Petición para desplegar un carácter
MOV CX,19 ; Longitud de la cadena de caracteres
LEA DI ,CONAME ; Dirección de la cadena de caracteres
A30: MOV DL,[DI] ; Caracteres que se despliegan.
INT21H ; Llama al DOS
LOOP A30 ; Si aun no termina, repite el ciclo

4.4.4.- Función 01H de la INT 21H: Entrada del teclado con eco en pantalla.

77
Esta operación acepta un carácter desde un buffer del teclado o, si no está presente
alguno, espera una entrada del teclado. La expresión con eco en pantalla, significa que
cuando se emplea otra función para desplegar el carácter capturado en la pantalla, éste
aparece repetido). La operación regresa uno de dos códigos de estado.

 AL = Un número distinto de cero, significa que un carácter ASCII estándar esta


presente, como una letra o un número, que la operación repite en la pantalla.

 AL =0, significa que el usuario a presionado una tecla de función extendida,


como Inicio FI o Repag, y el AH aún tiene la función original.

El código siguiente ilustra esta función:

MOV AH,01H ; Petición de entrada del teclado


INT 21H ; Llama al DOS

4.4.5.- Función 07Hde la INT 21H: Entrada del teclado sin eco.

Esta operación funciona igual que la 01H, excepto que el carácter ingresado no se
repite en la pantalla. Podría utilizar la operación para introducir una contraseña (o
password) que sea invisible o en donde no se quiere que la pantalla sea perturbada..

78
Instituto Tecnológico de Ciudad Madero

Capítulo V.

PROGRAMAS

ENSAMBLADORES.

En este capítulo podemos observar las reglas para ensamblar, enlazar, generar
archivos de referencias cruzadas y convertir programas .EXE a .COM. la versión de

79
ensamblador de Microsoft es MASM, la de Borland es TASM y la de SRL es OPTASM,
todas ellas son similares. Desde la versión 6.0 de Microsoft utiliza el comando ML, que
realiza un ensamblador y enlace en un comando.

5.1.- Ensamblado un programa.

Se puede utilizar una línea de comando para solicitar un ensamblador, aunque MASM
también proporciona indicaciones (prompts).

5.1.1.- Ensamblado un programa.

El formato general para usar una línea de comando para ensamblador es:

MASM/TASM [opciones] fuente [,objeto] [,listado] [,refcrz]

 las opciones son explicadas posteriormente.


 Fuente, identifica el programa fuente. El ensamblador supone la extensión .ASM así
que no necesita ingresarla. También puede teclear la unidad de disco o la ruta (ambas).
 Objetivo, proporciona un archivo OBJ. La unidad o rutina y el nombre del archivo
pueden ser los mismos o diferentes a los de la fuente
 Listado, provee de un archivo .LIST que contiene los códigos fuente y objeto. La
unidad o ruta y el nombre del archivo pueden ser los mismos o diferentes a los del
fuente.
 Referz, provee un archivo generado con los símbolos para un listado de referencias
cruzadas. La extensión .CRF para MASM y .XRF para TASM. La unidad y el nombre
del archivo pueden ser los mismos o diferentes.

Este ejemplo escribe todos los archivos.

MASM D: nombre, ASM: nombre,. OBJ,D: nombre, LST: nombre. CRF

El siguiente comando abreviado permite, por omisión, los valores para los archivos
objeto. De listado y referencias cruzadas, todos con el mismo nombre:

MASM D: nomarchivo, D:, D:, D:,

Este ejemplo solicita un archivo de referencias cruzadas pero no un archivo con el


listado:

80
MASM D: nomarchivo, D:,, D:

5.1.2.- Ensamblando con indicaciones.

También se pueden teclear los nombres del ensamblador sin línea de comando,
aunque TASM y MASM (hasta la versión 5.1) responden de manera diferente. TASM
muestra el formato general para la línea de comando y una explicación de las opciones,
mientras que MASM muestra una lista de indicaciones a las cuales hay que responder:

Source filename [.ASM]:


Objeto filename [source.OBJ]
Source listing [NUL.LST]
Cross-reference [NUL.CRF]

 Source filename identifica el archivo fuente. Teclee la unidad o ruta (si no es por
omisión) y el nombre del archivo fuente, sin la extensión ASM.
 Objet filename pregunta por el archivo objeto. La indicación supone el mismo nombre
de archivo, aunque se podría cambiar. Para obtener un archivo objeto en la unidad D,
teclee D: y presione Enter.
 Cross-reference provee de un listado de referencias cruzadas, aunque la petición supone
que no se quiere. Para obtener una en la unidad D, teclee D: y presione Enter.

Para las ultimas tres peticiones, solo presione Enter si quiere aceptar los valores por
omisión.

Ensamblando un programa.

Opciones de Ensamblador.

Las opciones de ensamblador para MASM, TASM y OPTAS incluyen las siguientes:

/A Acomoda los segmentos fuente en orden alfabético.


/C Crea un archivo de referencia cruzadas.
/D MASM: Produce archivos de listado de la pasada 1 y de la pasada 2 para localizar
errores. Para TASM, /Disimbolo significa define un símbolo.
/E Acepta instrucciones del procesador 80x87 y genera un enlace a BASIC, C o
FORTRAN para emular instrucciones de punto flotante.
/H Muestra opciones de ensamblador con una breve explicación. Ingrese /H (help,
ayuda) sin nombre de archivo u otras opciones.
/L Crea un listado de archivo normal.
/ML Hace todos los nombres sensibles a mayúsculas y minúsculas.
/MU Convierte todos los nombres en mayúsculas.

81
/MX Hace a los nombres públicos y externos sensibles a mayúsculas y minúsculas
/N Suprime la generación de la tabla de símbolos.
/R Proporciona soporte para procesador matemático.
/S Deja los segmentos fuente en la secuencia original.
/T (Breve) muestra diagnósticos al final del ensamblador solo si se encuentra un error.
/V (En extenso) al final del ensamblador, muestra el numero de líneas y símbolos
procesados. (no para OPTASM).
/Wn Establece el nivel de mensajes de advertencia: 0= muestra solo errores críticos; 1=
muestra errores críticos y advertencias graves (por omisión); 2= muestra errores
críticos, advertencias graves y advertencias de consulta.
/Z Muestra líneas fuente en la pantalla para errores.
/ZD Incluye información de números de líneas en archivo objeto para Code View,
TurboDebugger o SYMDEB.
/ZI Incluye información acerca de números de línea e información simbólica en el
archivo objeto para Code View, TurboDebugger o SYMDEB.

Puede solicitar opciones tanto en modo de línea e información de comandos. Para


eticiones, por ejemplo podría codificar MASM/V [Enter], después teclee el nombre del
archivo de la manera usual. O puede teclear las opciones en cualquier línea de petición; por
ejemplo, como:

Fuente nomarch [.ASM]:/A/V nomarch o nomarch/A/V [Enter]

Las opciones /A/V le indican al ensamblador que escriba segmentos en orden


alfabético y despliegue diagnósticos adicionales al final del ensamblador.

Características adicionales de Turbo Assembler.

Turbo assembler le permite ensamblar varios archivos, cada uno con sus propias
opciones, en una línea de comando. También puede usar los comodines del DOS (* y ?).
para ensamblar todos los programas fuente en el directorio actual, teclee TASM*. Para
ensamblar todos los archivos fuente PROG1.ASM., PROG2.ASM, etc., teclee TASM
prog?. Puede teclear grupos (o conjuntos) de nombres de archivos, con cada grupo separado
por punto y coma. El siguiente comando ensambla PROGRA y PROGB con la opción /C y
PROGC con la opción /A:

TASM/C PROGRA PROGB;/A PROGC

Microsoft Versión 6.x

82
ML [opciones] nomarchs [[opciones] nomarchs]...[/opciones enlace]

El ensamblador le permite ensamblar cualquier numero de programas en un modulo


ejecutable. Una opción útil es ML - ?, que despliega la sintaxis completa de la línea de
comando y las opciones.

Tablas.

Siguiendo a n listado de ensamblador .LST están una tabla de segmentos y grupos y


una tabla de símbolos.
Tabla de segmentos y grupos. Esta tabla tiene el encabezado siguiente:

Name Length Aling Combine Class

La columna Name de los nombres de todos los segmentos y grupos, en orden


alfabético. La columna Length da el tamaño en hexadecimal, de cada segmento. La
columna Align da el tiempo de alineación, tal como BYTE, WORD o PARA. Combine
lista el tipo combinar definido, tal como STACK para una pila, NONE en donde no esta
codificado tipo, PUBLIC para definiciones externas, o una dirección hexadecimal para
tipos A]T. La columna Class lista los nombres de clase de segmento, como están
codificados en la instrucción SEGMENT.

83

También podría gustarte