				 UNIVERSIDAD DE GUADALAJARA

		                  Coordinacin General de Sistemas de Informacin.





DIRECTORIO

Dr. Vctor Manuel Gonzlez Romero
Rector General de la Universidad de Guadalajara

Dr. Misael Gradilla Damy
Vicerrectora Ejecutiva

M en C. Jeffrey Steven Fernndez Rodrguez
Coordinador General de Sistemas de Informacin

Ing. Mnico Briseo Corts
Responsable del servidor Grfico
Cultura y Entretenimiento

Hugo Prez Prez
Autor del tutorial de Ensamblador

Ana Mara Peraza
Captura y revisin del texto

















					Derechos Reservados 1995


                           UNIVERSIDAD DE GUADALAJARA

                  Coordinacin General de Sistemas de Informacin.

Introduccin.

 El documento que est visualizando tiene la funcin primordial de introducirlo a la programacin en lenguaje Ensamblador, y est pensado en aquellas personas que nunca han trabajado con este lenguaje y probablemente con ningn otro.

El tutorial se enfoca completamente hacia las computadoras que operan con procesadores de la familia x86 de Intel y, considerando que el ensamblador basa su funcionamiento en los recursos internos del  procesador, los ejemplos descritos no son compatibles con ninguna otra arquitectura.

Se estructur la informacin en forma de unidades para permitir el fcil acceso a cada uno de los tpicos y facilitar el seguimiento del tutorial.

En la seccin introductoria se mencionan algunos de los conceptos elementales acerca de los sistemas de cmputo as' como del ensamblador mismo, y contina con el tutorial propiamente dicho.


CONTENIDO:

Descripcin bsica de un sistema de cmputo...................................................3

El porqu aprender lenguaje ensamblador.........................................................6


Acercamiento al lenguaje ensamblador.

Esta primera parte esta enfocada al conocimiento de algunas de las
caracter'sticas de las computadoras y del ensamblador.

 UNIDAD 1: Conceptos bsicos...................................................................................7
 UNIDAD 2: Programacin en ensamblador.........................................................28
                     
  

                                       Derchos Reservados.1995                                      1

                          
                            UNIVERSIDAD DE GUADALAJARA

                  Coordinacin General de Sistemas de Informacin.
                           

Las instrucciones del ensamblador.

En esta segunda parte se profundiza un poco mas en la descripcin de las instrucciones del lenguaje ensamblador.

 UNIDAD 3: Instrucciones de operacin sobre datos.......................................41
 UNIDAD 4: Instrucciones lgicas y aritmticas................................................50
 UNIDAD 5: Instrucciones para control de procesos........................................58


Interrupciones y manejo de archivos.

 UNIDAD 6: Interrupciones.........................................................................................74
 UNIDAD 7: Introduccin al manejo de archivos..............................................102


Introduccin a las macros.

 UNIDAD 8: Macros y procedimientos...................................................................109


Ejemplos.............................................................................................................................114

En esta seccin se exponen algunos programas de ejemplo en los que se utilizan los elementos explicados en el tutorial.

Desplegar un mensaje en pantalla
Desplegar nmeros hexadecimales del 15 al 0
Operaciones bsicas


Directorio y bibliograf'a..............................................................................................128

Comentarios y sugerencias........................................................................................129

                                   Derechos Reservados.1995                              2


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Descripcin bsica de un sistema de cmputo.


Esta seccin tiene como finalidad dar una breve resea de las partes
principales de un sistema de cmputo a un nivel bsico, que permita al
usuario un mayor entendimiento de los conceptos que se tratarn a lo largo
del tutorial.

   * Procesador Central

   * Memoria Central

   * Unidades de Entrada y Salida

   * Unidades de Memoria Auxiliar


Sistema de Cmputo.

Le llamamos sistema de cmputo a la configuracin completa de una
computadora, incluyendo las unidades perifricas y la programacin de
sistemas que la hacen un aparato til y funcional para un fin determinado.


Procesador Central.

Esta parte es conocida tambin como unidad central de procesamiento o UCP.
formada a su vez por la unidad de control y la unidad aritmtica y lgica.
Sus funciones consisten en leer y escribir contenidos de las celdas de
memoria, llevar y traer datos entre celdas de memoria y registros especiales
y decodificar y ejecutar las instrucciones de un programa.

El procesador cuenta con una serie de celdas de memoria que se utilizan con
mucha frecuencia y que, por ende, forman parte de la UCP. 

                                       Derechos Reservados.1995                                      3


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Estas celdas son conocidas con el nombre de registros. Un procesador puede tener una docena o dos de estos registros. La unidad aritmtica y lgica de la UCP realiza las operaciones relacionadas con los clculos numricos y simblicos. T'picamente estas unidades slo tienen capacidad de efectuar operaciones muy elementales como: suma y resta de dos nmeros de punto fijo, multiplicacin y divisin de punto fijo, manipulacin de bits de los registros y comparacin del contenido de dos registros.

Las computadoras personales pueden clasificarse por lo que se conoce como
tamao de palabra, esto es, la cantidad de bits que el procesador puede
manejar a la vez.


Memoria Central.

Es un conjunto de celdas (actualmente fabricadas con semiconductores) usadas
para procesos generales, tales como la ejecucin de programas y el
almacenamiento de informacin para las operaciones.

Cada una de las celdas puede contener un valor numrico y tienen la
propiedad de ser direccionables, esto es, que se pueden distinguir una de
otra por medio de un nmero nico o direccin para cada celda.

El nombre genrico de estas memorias es Random Access Memory (Memoria de acceso aleatorio) o RAM por sus siglas en ingls. La principal desventaja de
este tipo de memoria es que los circuitos integrados pierden la informacin
que tienen almacenada cuando se interrumpe la alimentacin elctrica. Esto
llev a la creacin de memorias cuya informacin no se pierda cuando se
apaga el sistema. Estas memorias reciben el nombre de Read Only Memory
(Memoria de solo lectura) o ROM.



                                       Derechos Reservados.1995                                      4



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Unidades de Entrada y Salida.

Para que una computadora nos sea til es necesario que el procesador se
comunique al exterior por medio de interfaces que permiten la entrada y la
salida de datos del procesador y la memoria. Haciendo uso de estas
comunicaciones es posible introducir datos para su procesamiento y la
posterior visualizacin de los datos ya procesados.

Algunas de las unidades de entrada mas comunes son teclados, lectoras de
tarjetas (ya en desuso), mouse, etc. Las unidades de salida mas comunes son
las terminales de video y las impresoras.



Unidades de Memoria Auxiliar.

Como la memoria central de una computadora es costosa y, considerando las
aplicaciones actuales, muy limitada, surge entonces la necesidad de crear
sistemas de almacenamiento de informacin prcticos y econmicos. Adems, la memoria central pierde su contenido al apagarse la mquina, por lo que no es conveniente utilizarla para almacenamiento permanente de datos.

Estos y otros incovenientes dan lugar a la creacin de unidades perifricas
de memoria que reciben el nombre de memoria auxiliar o secundaria. De estas
unidades perifricas las ms comunes son las cintas y los discos magnticos.

La informacin almacenada en estos medios magnticos recibe el nombre de
archivo. Un archivo est formado por un nmero variable de registros,
generalmente de tamao fijo; los registros pueden contener datos o
programas.



                                       Derechos Reservados.1995                                      5



                               UNIVERSIDAD DE GUADALAJARA

                    Coordincin General de Sistemasde Informacin.


Ventajas del Ensamblador


La primera razn para trabajar con ensamblador es que proporciona la
oportunidad de conocer ms a fondo la operacin de su PC, lo que permite el
desarrollo de software de una manera ms consistente.

La segunda razn es el control total de la PC que se tiene con el uso del
mismo.

Otra razn es que los programas de ensamblador son mas rpidos, ms
compactos y tienen mayor capacidad que los creados en otros lenguajes.

Por ltimo el ensamblador permite una optimizacin ideal en los programas
tanto en su tamao como en su ejecucin.



Software


En terminos de computacin es todo aquel proceso o programa que utiliza los
recursos de la computadora para lograr el objetivo trazado por su diseador
o programador.









                                       Derechos Reservados.1995                                      6




                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Conceptos bsicos


Informacin en las computadoras.
     Unidades de informacin
     Sistemas numricos
     Convertir nmeros binarios a decimales
     Convertir nmeros decimales a binarios
     Sistema Hexadecimal

Mtodos de representacin de datos en una computadora.
     Cdigo ASCII
     Mtodo BCD
     Representacin de punto flotante

Trabajando con el lenguaje ensamblador.
     Proceso de creacin de un programa
     Registros de la UCP
     La estructura del ensamblador
     Nuestro primer programa
     Guardar y cargar los programas
     Condiciones, ciclos y bifurcaciones
     Interrupciones



Unidades de informacin



Para que la PC pueda procesar la informacin es necesario que sta se
encuentre en celdas especiales llamadas registros.

Los registros son conjuntos de 8 o 16 flip-flops (basculadores o
biestables).
                                       Derechos Reservados.1995                                      7


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Un flip-flop es un dispositivo capaz de almacenar dos niveles de voltaje,
uno bajo, regularmente de 0.5 volts y otro alto comunmente de 5 volts. El
nivel bajo de energ'a en el flip-flop se interpreta como apagado o 0, y el
nivel alto como prendido o 1. A estos estados se les conoce usualmente como
bits, que son la unidad mas pequea de informacin en una computadora.

A un grupo de 16 bits se le conoce como palabra, una palabra puede ser
dividida en grupos de 8 bits llamados bytes, y a los grupos de 4 bits les
llamamos nibbles.



Sistemas numricos



El sistema numrico que utilizamos a diario es el sistema decimal, pero este
sistema no es conveniente para las mquinas debido a que la informacin se
maneja codificada en forma de bits prendidos o apagados; esta forma de
codificacin nos lleva a la necesidad de conocer el clculo posicional que
nos permita expresar un nmero en cualquier base que lo necesitemos.

Es posible representar un nmero determinado en cualquier base mediante la
siguiente formula:




Donde n es la posicin del d'gito empezando de derecha a izquierda y
numerando a partir de cero. D es el d'gito sobre el cual operamos y B es la
base numrica empleada.


                                       Derechos Reservados.1995                                     8



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Convertir nmeros binarios a decimales



Trabajando en el lenguaje ensamblador nos encontramos con la necesidad de
convertir nmeros del sistema binario, que es el empleado por las
computadoras, al sistema decimal utilizado por las personas.

El sistema binario est basado en unicamente dos condiciones o estados, ya
sea encendido (1) o apagado (0), por lo tanto su base es dos.

Para la conversin podemos utilizar la formula de valor posicional:

Por ejemplo, si tenemos el numero binario 10011, tomamos de derecha a
izquierda cada d'gito y lo multiplicamos por la base elevada a la nueva
posicin que ocupan:

Binario:       1       1       0       0       1

Decimal:     1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4

           =   1   +   2   +   0   +   0   +   16   =  19 decimal.

El caracter ^ es utilizado en computacin como s'mbolo de potenciacin y el
caracter * se usa para representar la multiplicacin.



Convertir nmeros decimales a binarios


Existen varios mtodos de conversin de nmeros decimales a binarios; aqu'
solo se analizar uno. 

                                       Derechos Reservados.1995                                      9


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Naturalmente es mucho mas fcil una conversin con una calculadora cient'fica, pero no siempre se cuenta con ella, as' que es conveniente conocer por lo menos una forma manual para hacerlo.

El mtodo que se explicar utiliza la divisin sucesiva entre dos, guardando
el residuo como d'gito binario y el resultado como la siguiente cantidad a
dividir.

Tomemos como ejemplo el nmero 43 decimal.

43/2 = 21 y su residuo es 1

21/2 = 10 y su residuo es 1

10/2 = 5 y su residuo es 0

5/2 = 2 y su residuo es 1

2/2 = 1 y su residuo es 0

1/2 = 0 y su residuo es 1

Armando el nmero de abajo hacia arriba tenemos que el resultado en binario
es 101011



Sistema hexadecimal



En la base hexadecimal tenemos 16 d'gitos que van del 0 al 9 y de la letra A
hasta la F (estas letras representan los nmeros del 10 al 15). Por lo
tanto, contamos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F.

                                       Derechos Reservados.1995                                      10


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



La conversin entre numeracin binaria y hexadecimal es sencilla. Lo primero
que se hace para una conversin de un nmero binario a hexadecimal es
dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de
que el ltimo grupo (el que quede mas a la izquierda) sea menor de 4 bits se
rellenan los faltantes con ceros.

Tomando como ejemplo el nmero binario 101011 lo dividimos en grupos de 4
bits y nos queda:

10; 1011

Rellenando con ceros el ltimo grupo (el de la izquierda):

0010; 1011

Despus tomamos cada grupo como un nmero independiente y consideramos su
valor en decimal:

0010 = 2; 1011 = 11

Pero como no podemos representar este nmero hexadecimal como 211 porque ser'a un error, tenemos que sustituir todos los valores mayores a 9 por su respectiva representacin en hexadecimal, con lo que obtenemos:

2BH (Donde la H representa la base hexadecimal)

Para convertir un nmero de hexadecimal a binario solo es necesario invertir
estos pasos: se toma el primer d'gito hexadecimal y se convierte a binario,
y luego el segundo, y as' sucesivamente hasta completar el nmero.



                                       Derechos Reservados.1995                                      11



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Cdigo ASCII



ASCII generalmente se pronuncia "aski", es un acrnimo de American Standard
Code for Information Interchange.

Este cdigo asigna a las letras del alfabeto, a los d'gitos decimales del 0
al 9 y a varios s'mbolos adicionales un nmero binario de 7 bits (ponindose
el bit 8 en su estado de apagado o 0).

De esta forma cada letra, d'gito o caracter especial ocupa un byte en la
memoria de la computadora.

Podemos observar que este mtodo de representacin de datos es muy
ineficiente en el aspecto numrico, ya que en formato binario nos basta un
solo byte para representar numeros de 0 a 255, en cambio con el cdigo ASCII
un byte puede representar unicamente un d'gito.

Debido a esta ineficiencia, el cdigo ASCII es principalmente utilizado en
la memoria para representar texto.



Metodo BCD



BCD es un acrnimo de Binary Coded Decimal.

En esta notacin se utilizan grupos de 4 bits para representar cada d'gito
decimal del 0 al 9. Con este mtodo podemos representar dos d'gitos por byte
de informacin.

                                       Derechos Reservados.1995                                      12


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


An cuando este mtodo es mucho mas prctico para representacin de nmeros en la memoria en comparacin al ASCII, todav'a se queda por debajo del binario, ya que con un byte en el mtodo BCD solo podemos representar
d'gitos del 0 al 99, en cambio, en formato binario podemos representar todos
los d'gitos desde 0 hasta 255.

Este formato es utilizado principalmente para representar nmeros muy
grandes en aplicaciones mercantiles ya que facilita las operaciones con los
mismos evitando errores de redondeo.


Representacin de punto flotante


Esta representacin esta basada en la notacin cient'fica, esto es,
representar un nmero en dos partes: su mantisa y su exponente.

Poniendo como ejemplo el nmero 1234000, podemos representarlo como
1.123*10^6, en esta ltima notacin el exponente nos indica el nmero de
espacios que hay que mover el espacio hacia la derecha para obtener el
resultado original.

En caso de que el exponente fuera negativo nos estar'a indicando el nmero
de espacios que hay que recorrer el punto decimal hacia la izquierda para
obtener el original.


Proceso de creacin de un programa


Para la creacin de un programa es necesario seguir cinco pasos: Diseo del
algoritmo, codificacin del mismo, su traduccin a lenguaje mquina, la
prueba del programa y la depuracin.


                                      Derechos Reservados.1995                                      13


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



 En la etapa de diseo se plantea el problema a resolver y se propone
la mejor solucin, creando diagramas esquemticos utilizados para el mejor
planteamiento de la solucin.

 La codificacin del programa consiste en escribir el programa en
algn lenguaje de programacin; en este caso espec'fico en ensamblador,
tomando como base la solucin propuesta en el paso anterior.

 La traduccin al lenguaje mquina es la creacin del programa
objeto, esto es, el programa escrito como una secuencia de ceros y unos que
pueda ser interpretado por el procesador.

 La prueba del programa consiste en verificar que el programa
funcione sin errores, o sea, que haga lo que tiene que hacer.

 La ltima etapa es la eliminacin de las fallas detectadas en el
programa durante la fase de prueba. La correccin de una falla normalmente
requiere la repeticin de los pasos comenzando desde el primero o el
segundo.

Para crear un programa en ensamblador existen dos opciones, la primera es
utilizar el MASM (Macro Assembler, de Microsoft), y la segunda es utilizar
el debugger, en esta primera seccin utilizaremos este ltimo ya que se
encuentra en cualquier PC con el sistema operativo MS-DOS, lo cual lo pone
al alcance de cualquier usuario que tenga acceso a una mquina con estas
caracteristicas.

Debug solo puede crear archivos con extensin .COM, y por las
caracter'sticas de este tipo de programas no pueden ser mayores de 64 kb,
adems deben comenzar en el desplazamiento, offset, o direccin de memoria
0100H dentro del segmento espec'fico.



                                      Derechos Reservados.1995                                      14


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Registros de la UCP



La UCP tiene 14 registros internos, cada uno de 16 bits. Los primeros
cuatro, AX, BX, CX, y DX son registros de uso general y tambien pueden ser
utilizados como registros de 8 bits, para utilizarlos como tales es
necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes
alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable
tambin a los registros BX, CX y DX.

Los registros son conocidos por sus nombres espec'ficos:

 AX Acumulador
 BX Registro base
 CX Registro contador
 DX Registro de datos
 DS Registro del segmento de datos
 ES Registro del segmento extra
 SS Registro del segmento de pila
 CS Registro del segmento de cdigo
 BP Registro de apuntadores base
 SI Registro 'ndice fuente
 DI Registro 'ndice destino
 SP Registro del apuntador de la pila
 IP Registro de apuntador de siguiente instruccin
 F  Registro de banderas

Es posible visualizar los valores de los registros internos de la UCP
utilizando el programa Debug. Para empezar a trabajar con Debug digite en el
prompt de la computadora:

C:\> Debug [Enter]

                                     Derechos Reservados.1995                                      15


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



En la siguiente linea aparecera un guin, ste es el indicador del Debug, en
este momento se pueden introducir las instrucciones del Debug. Utilizando el
comando:

- r [Enter]

Se desplegaran todos los contenidos de los registros internos de la UCP; una
forma alternativa de mostrarlos es usar el comando "r" utilizando como
parametro el nombre del registro cuyo valor se quiera visualizar. Por
ejemplo:

- rbx

Esta instruccin desplegar unicamente el contenido del registro BX y cambia
el indicador del Debug de " - " a " : "

Estando as' el prompt es posible cambiar el valor del registro que se
visualiz tecleando el nuevo valor y a continuacin [Enter], o se puede
dejar el valor anterior presionando [Enter] sin telclear ningn valor.

Es posible cambiar el valor del registro de banderas, as' como utilizarlo
como estructura de control en nuestros programas como se ver mas adelante.
Cada bit del registro tiene un nombre y significado especial, la lista dada
a continuacin describe el valor de cada bit, tanto apagado como prendido y
su relacin con las operaciones del procesador:

 Overflow
     NV = no hay desbordamiento;
     OV = s' lo hay
 Direction
     UP = hacia adelante;
     DN = hacia atras;
 

                                     Derechos Reservados.1995                                      16


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Interrupts
     DI = desactivadas;
     EI = activadas
 Sign
     PL = positivo;
     NG = negativo
 Zero
     NZ = no es cero;
     ZR = s' lo es
 Auxiliary Carry
     NA = no hay acarreo auxiliar;
     AC = hay acarreo auxiliar
 Parity
     PO = paridad non;
     PE = paridad par;
 Carry
     NC = no hay acarreo;
     CY = S' lo hay



La estructura del ensamblador



En el lenguaje ensamblador las lineas de cdigo constan de dos partes, la
primera es el nombre de la instruccin que se va a ejecutar y la segunda son
los parmetros del comando u operandos. Por ejemplo:

add ah bh

Aqu' "add" es el comando a ejecutar (en este caso una adicin) y tanto "ah"
como "bh" son los parmetros.

                                     Derechos Reservados.1995                                      17


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



El nombre de las instrucciones en este lenguaje esta formado por dos, tres o
cuatro letras. a estas instrucciones tambien se les llama nombres mnemnicos
o cdigos de operacin, ya que representan alguna funcin que habr de
realizar el procesador.

Existen algunos comandos que no requieren parametros para su operacin, as'
como otros que requieren solo un parmetro.

Algunas veces se utilizarn las instrucciones como sigue:

add al,[170]

Los corchetes en el segundo parmetro nos indican que vamos a trabajar con
el contenido de la casilla de memoria nmero 170 y no con el valor 170, a
sto se le conoce como direccionamiento directo.



Nuestro primer programa



Vamos a crear un programa que sirva para ilustrar lo que hemos estado
viendo, lo que haremos ser una suma de dos valores que introduciremos
directamente en el programa:

El primer paso es iniciar el Debug, este paso consiste unicamente en teclear
debug [Enter] en el prompt del sistema operativo.

Para ensamblar un programa en el Debug se utiliza el comando "a" (assemble);
cuando se utiliza este comando se le puede dar como parametro la direccin
donde se desea que se inicie el ensamblado. 


                                     Derechos Reservados.1995                                      18


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Si se omite el parametro el ensamblado se iniciar en la localidad especificada por CS:IP, usualmente 0100H, que es la localidad donde deben iniciar los programas con extensin .COM, y sera la localidad que utilizaremos debido a que debug solo puede crear este tipo espec'fico de programas.

Aunque en este momento no es necesario darle un parametro al comando "a" es recomendable hacerlo para evitar problemas una vez que se haga uso de los
registros CS:IP, por lo tanto tecleamos:

- a0100 [Enter]

Al hacer sto aparecer en la pantalla algo como: 0C1B:0100 y el cursor se
posiciona a la derecha de estos nmeros, ntese que los primeros cuatro
d'gitos (en sistema hexagesimal) pueden ser diferentes, pero los ltimos
cuatro deben ser 0100, ya que es la direccin que indicamos como inicio.
Ahora podemos introducir las instrucciones:

0C1B:0100 mov ax,0002 ;coloca el valor 0002 en el registro ax
0C1B:0103 mov bx,0004 ;coloca el valor 0004 en el registro bx
0C1B:0106 add ax,bx ;le adiciona al contenido de ax el contenido de bx
0C1B:0108 int 20 ; provoca la terminacin del programa.
0C1B:010A

No es necesario escribir los comentarios que van despues del ";". Una vez
digitado el ltimo comando, int 20, se le da [Enter] sin escribir nada mas,
para volver al prompt del debuger.

La ltima linea escrita no es propiamente una instruccin de ensamblador, es
una llamada a una interrupcin del sistema operativo, estas interrupciones
sern tratadas mas a fondo en un cap'tulo posterior, por el momento solo es
necesario saber que nos ahorran un gran nmero de lineas y son muy tiles
para accesar a funciones del sistema operativo.


                                       Derechos Reservados.1995                                      19


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Para ejecutar el programa que escribimos se utliza el comando "g", al
utilizarlo veremos que aparece un mensaje que dice: "Program terminated
normally". Naturalmente con un mensaje como ste no podemos estar seguros
que el programa haya hecho la suma, pero existe una forma sencilla de
verificarlo, utilizando el comando "r" del Debug podemos ver los contenidos
de todos los registros del procesador, simplemente teclee:

- r [Enter]

Aparecera en pantalla cada registro con su respectivo valor actual:

AX=0006BX=0004CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1BES=0C1BSS=0C1BCS=0C1BIP=010A NV UP EI PL NZ NA PO NC
0C1B:010A 0F DB oF

Existe la posibilidad de que los registros contengan valores diferentes,
pero AX y BX deben ser los mismos, ya que son los que acabamos de modificar.

Otra forma de ver los valores, mientras se ejecuta el programa es utilizando
como parmetro para "g" la direccin donde queremos que termine la ejecucin y muestre los valores de los registros, en este caso ser'a: g108, esta
instruccin ejecuta el programa, se detiene en la direccin 108 y muestra
los contenidos de los registros.

Tambin se puede llevar un seguimiento de lo que pasa en los registros
utilizando el comando "t" (trace), la funcin de este comando es ejecutar
linea por linea lo que se ensambl mostrando cada vez los contenidos de los
regitros.

Para salir del Debug se utiliza el comando "q" (quit).



                                      Derechos Reservados.1995                                      20



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Guardar y cargar los programas


No ser'a prctico tener que digitar todo un programa cada vez que se
necesite, para evitar eso es posible guardar un programa en el disco, con la
enorme ventaja de que ya ensamblado no ser necesario correr de nuevo debug para ejecutarlo.

Los pasos a seguir para guardar un programa ya almacenado en la memoria son:

 Obtener la longitud del programa restando la direccin final de la
 direccin inicial, naturalmente en sistema hexadecimal. Darle un nombre al               programa y extensin Poner la longitud del programa en el registro CX
 Ordenar a Debug que escriba el programa en el disco.

Utilizando como ejemplo el programa del cap'tulo anterior tendremos una idea
mas clara de como llevar estos pasos:

Al terminar de ensamblar el programa se ver'a as':

0C1B:0100 mov ax,0002
0C1B:0103 mov bx,0004
0C1B:0106 add ax,bx
0C1B:0108 int 20
0C1B:010A
- h 10a 100
020a 000a
- n prueba.com
- rcx
CX 0000
:000a
-w
Writing 000A bytes

                                       Derechos Reservados.1995                                      21


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Para obtener la longitud de un programa se utiliza el comando "h", el cual
nos muestra la suma y resta de dos nmeros en hexadecimal. Para obtener la
longitud del nuestro le proporcionamos como parmetros el valor de la
direccin final de nuestro programa (10A) y el valor de la direccin inicial
(100). El primer resultado que nos muestra el comando es la suma de los
parmetros y el segundo es la resta.

El comando "n" nos permite poner un nombre al programa.

El comando "rcx" nos permite cambiar el contenido del registro CX al valor
que obtuvimos del tamao del archivo con "h", en este caso 000a, ya que nos
interesa el resultado de la resta de la direccin inicial a la direccin
final.

Por ltimo el comando w escribe nuestro programa en el disco, indicandonos
cuantos bytes escribi.

Para cargar un archivo ya guardado son necesarios dos pasos:

 Proporcionar el nombre del archivo que se cargar.
 Cargarlo utilizando el comando "l" (load).

Para obtener el resultado correcto de los siguientes pasos es necesario que
previamente se haya creado el programa anterior.

Dentro del Debug escribimos lo siguiente:

- n prueba.com
- l
- u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20
                                      Derechos Reservados.1995                                       22


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



El ltimo comando, "u", se utiliza para verificar que el programa se carg
en memoria, lo que hace es desensamblar el cdigo y mostrarlo ya
desensamblado. Los parmetros le indican a Debug desde donde y hasta donde
desensamblar.

Debug siempre carga los programas en memoria en la direccin 100H, a menos
que se le indique alguna otra.


Condiciones, ciclos y bifurcaciones



Estas estructuras, o formas de control le dan a la mquina un cierto grado
de desicin basado en la informacin que recibe.

La forma mas sencilla de comprender este tema es por medio de ejemplos.

Vamos a crear tres programas que hagan lo mismo: desplegar un nmero
determinado de veces una cadena de caracteres en la pantalla.

- a100
0C1B:0100 jmp 125 ; brinca a la direccin 125H
0C1B:0102 [Enter]
- e 102 'Cadena a visualizar 15 veces' 0d 0a '$'
- a125
0C1B:0125 MOV CX,000F ; veces que se desplegara la cadena
0C1B:0128 MOV DX,0102 ; copia cadena al registro DX
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F LOOP 012D ; si CX>0 brinca a 012D
0C1B:0131 INT 20 ; termina el programa.


                                      Derechos Reservados.1995                                       23


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Por medio del comando "e" es posible introducir una cadena de caracteres en
una determinada localidad de memoria, dada como parmetro, la cadena se
introduce entre comillas, le sigue un espacio, luego el valor hexadecimal
del retorno de carro, un espacio, el valor de linea nueva y por ltimo el s'mbolo '$' que el ensamblador interpreta como final de la cadena. La
interrupcin 21 utiliza el valor almacenado en el registro AH para ejecutar
una determinada funcin, en este caso mostrar la cadena en pantalla, la
cadena que muestra es la que est almacenada en el registro DX. La instruccin LOOP decrementa automaticamente el registro CX en uno y si no ha llegado el valor de este registro a cero brinca a la casilla indicada como parmetro, lo cual crea un ciclo que se repite el nmero de veces especificado por el valor de CX. La interrupcin 20 termina la ejecucin del programa.

Otra forma de realizar la misma funcin pero sin utilizar el comando LOOP es
la siguiente:

- a100
0C1B:0100 jmp 125 ; brinca a la direccin 125H
0C1B:0102 [Enter]
- e 102 'Cadena a visualizar 15 veces' 0d 0a '$'
- a125
0C1B:0125 MOV BX,000F ; veces que se desplegara la cadena
0C1B:0128 MOV DX,0102 ; copia cadena al registro DX
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F DEC BX ; decrementa en 1 a BX
0C1B:0130 JNZ 012D ; si BX es diferente a 0 brinca a 012D
0C1B:0132 INT 20 ; termina el programa.

En este caso se utiliza el registro BX como contador para el programa, y por
medio de la instruccin "DEC" se disminuye su valor en 1. La instruccin
"JNZ" verifica si el valor de B es diferente a 0, esto con base en la
bandera NZ, en caso afirmativo brinca hacia la direccin 012D. En caso
contrario contina la ejecucin normal del programa y por lo tanto se
termina.
                                     Derechos Reservados.1995                                       24


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Una tima variante del programa es utilizando de nuevo a CX como contador,
pero en lugar de utilizar LOOP utilizaremos decrementos a CX y comparacin
de CX a 0.

- a100
0C1B:0100 jmp 125 ; brinca a la direccin 125H
0C1B:0102 [Enter]
- e 102 'Cadena a visualizar 15 veces' 0d 0a '$'
- a125
0C1B:0125 MOV DX,0102 ; copia cadena al registro DX
0C1B:0128 MOV CX,000F ; veces que se desplegara la cadena
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F DEC CX ; decrementa en 1 a CX
0C1B:0130 JCXZ 0134 ; si CX es igual a 0 brinca a 0134
0C1B:0132 JMP 012D ; brinca a la direcci&oaute;n 012D
0C1B:0134 INT 20 ; termina el programa

En este ejemplo se us la instruccin JCXZ para controlar la condicin de
salto, el significado de tal funcin es: brinca si CX=0

El tipo de control a utilizar depender de las necesidades de programacin
en determinado momento.



Interrupciones



Definicin de interrupcin:
     Una interrupcin es una instruccin que detiene la ejecucin de un
     programa para permitir el uso de la UCP a un proceso prioritario. Una
     vez concluido este ltimo proceso se devuelve el control a la
     aplicacin anterior.
                                     Derechos Reservados.1995                                       25


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Por ejemplo, cuando estamos trabajando con un procesador de palabras y en
ese momento llega un aviso de uno de los puertos de comunicaciones, se
detiene temporalmente la aplicacin que estabamos utilizando para permitir
el uso del procesador al manejo de la informacin que est llegando en ese
momento. Una vez terminada la transferencia de informacin se reanudan las
funciones normales del procesador de palabras.

Las interrupciones ocurren muy seguido, sencillamente la interrupcin que
actualiza la hora del d'a ocurre aproximadamente 18 veces por segundo. Para
lograr administrar todas estas interrupciones, la computadora cuenta con un
espacio de memoria, llamado memoria baja, donde se almacenan las direcciones de cierta localidad de memoria donde se encuentran un juego de instrucciones que la UCP ejecutar para despues regresar a la aplicacin en proceso.

En los programas anteriores hicimos uso de la interrupcion nmero 20H para
terminar la ejecucin de nuestros programas, ahora utilizaremos otra
interrupcin para mostrar informacin en pantalla:

Utilizando Debug tecleamos:

- a100
2C1B:0100 JMP 011D
2C1B:0102 [ENTER]
- E 102 'Hola, como estas.' 0D 0A '$'
- A011D
2C1B:011D MOV DX,0102
2C1B:0120 MOV AH,09
2C1B:0122 INT 21
2C1B:0123 INT 20

En este programa la interrupcin 21H manda al monitor la cadena localizada
en la direccin a la que apunta el registro DX.

                                   Derechos Reservados.1995                                       26
 

                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



El valor que se le da a AH determina cual de las opciones de la interrupcin
21H sera utilizada, ya que esta interrupcin cuenta con varias opciones.

El manejo directo de interrupciones es una de las partes mas fuertes del
lenguaje ensamblador, ya que con ellas es posible controlar eficientemente
todos los dispositivos internos y externos de una computadora gracias al
completo control que se tiene sobre operaciones de entrada y salida.
























                                   Derechos Reservados.1995                                       27

                 



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Programacin en ensamblador


Requerimientos para la programacin en ensamblador.
     Software necesario.
     Utilizacin del MASM
     Uso del enlazador (linker)

Formato de un programa en ensamblador.
     Formato interno
     Formato externo
     Ejemplo prctico de un programa

Proceso de ensamblado.
     Segmentos
     Tabla de s'mbolos

Tipos de instrucciones.
     Movimiento de datos
     Operaciones lgicas y aritmticas
     Saltos, ciclos y procedimientos



Software necesario



Para poder crear un programa se requieren varias herramientas:

Primero un editor para crear el programa fuente. Segundo un compilador que no es mas que un programa que "traduce" el programa fuente a un programa objeto. Y tercero un enlazador o linker, que genere el programa ejecutable a partir del programa objeto.
                                        Derechos Reservados.1995                                     28


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



El editor puede ser cualquier editor de textos que se tenga a la mano, como
compilador utilizaremos el MASM (macro ensamblador de Microsoft) ya que es
el mas comn, y como enlazador utilizaremos el programa link.

La extensin usada para que MASM reconozca los programas fuente en
ensamblador es .ASM; una vez traducido el programa fuente, el MASM crea un
archivo con la extensin .OBJ, este archivo contiene un "formato intermedio"
del programa, llamado as' porque aun no es ejecutable pero tampoco es ya un
programa en lenguaje fuente. El enlazador genera, a partir de un archivo
.OBJ o la combinacin de varios de estos archivos, un programa executable,
cuya extensin es usualmente .EXE aunque tambin puede ser .COM, dependiendo de la forma en que se ensambl.

Este tutorial describe la forma de trabajar con la versin 5.0 o posterior
del MASM, la diferencia principal de esta versin con otras anteriores es la
forma en que se declaran los segmentos de cdigo, datos y la pila, pero la
estructura de programacin es la misma.



Utilizacin del MASM



Una vez que se cre el programa objeto se debe pasar al MASM para crear el
cdigo intermedio, el cual queda guardado en un archivo con extensin .OBJ.
El comando para realizar esto es:

MASM Nombre_Archivo; [Enter]

Donde Nombre_Archivo es el nombre del programa fuente con extensin .ASM que se va a traducir. 

                                        Derechos Reservados.1995                                     29



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


El punto y coma utilizados despues del nombre del archivo le indican al macro ensamblador que genere directamente el codigo intermedio, de omitirse este caracter el MASM pedir el nombre del archivo a traducir, el nombre del archivo que se generar as' como opciones de listado de informacin que puede proporcionar el traductor.

Es posible ejecutar el MASM utilizando parmetros para obtener un fin
determinado, toda la lista de los mismos se encuentra en el manual del
programa. Solo recordar en este tutorial la forma de pasar dichos
parmetros al MASM:

Todo parmetro va despues del simbolo "/". Es posible utilizar varios
parmetros a la vez. Una vez tecleados todos los parmetros se escribe el
nombre del archivo a ensamblar. Por ejemplo, si queremos que el MASM
ensamble un programa llamado prueba, y ademas deseamos que despliege el
numero de lineas fuente y s'mbolos procesados (eso lo realiza con el
parametro /v), y si ocurre un error que nos diga en que linea ocurri (con
el parametro /z), entonces tecleamos:

MASM /v /z prueba;



Uso del enlazador (linker)


El MASM unicamente puede crear programas en formato .OBJ, los cuales no son
ejecutables por si solos, es necesario un enlazador que genere el cdigo
ejecutable.

La utilizacin del enlazador es muy parecida a la del MASM, unicamente se
teclea en el indicador del DOS:

LINK Nombre_Archivo ;

                                       Derechos Reservados.1995                                     30


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Donde Nombre_Archivo es el nombre del programa intermedio (OBJ). Esto
generara directamente un archivo con el nombre del programa intermedio y la
extensin .EXE



Formato interno de un programa



Para poder comunicarnos en cualquier lenguaje, incluyendo los lenguajes de
programacin, es necesario seguir un conjunto de reglas, de lo contrario no
podr'amos expresar lo que deseamos.

En este apartado veremos algunas de las reglas que debemos seguir para
escribir un programa en lenguaje ensamblador, enfocandonos a la forma de
escribir las instrucciones para que el ensamblador sea capaz de
interpretarlas.

Basicamente el formato de una linea de cdigo en lenguaje ensamblador consta
de cuatro partes:

 Etiqueta, variable o constante: No siempre es definida, si se define
es necesario utilizar separadores para diferenciarla de las otras partes,
usualmente espacios, o algn simbolo especial.

 Directiva o instruccin: es el nombre con el que se conoce a la
instruccin que queremos que se ejecute.

 Operando(s): la mayoria de las instrucciones en ensamblador trabajan
con dos operandos, aunque hay instrucciones que funcionan solo con uno. El
primero normalmente es el operando destino, que es el depsito del resultado
de alguna operacin; y el segundo es el operando fuente, que lleva el dato
que sera procesado. Los operandos se separan uno del otro por medio de una
coma ",".
                                       Derechos Reservados.1995                                     31


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


 Comentario: como su nombre lo indica es tan solo un escrito informativo, usado principalmente para explicar que est haciendo el programa en determinada linea; se separa de las otras partes por medio de un punto y coma ";". Esta parte no es necesaria en el programa, pero nos ayuda a depurar el programa en caso de errores o modificaciones.

Como ejemplo podemos ver una linea de un programa escrito en ensamblador:

Etiq1: MOV AX,001AH ; Inicializa AX con el valor 001A

Aqui tenemos la etiqueta "Etiq1" (Identificable como etiqueta por el simbolo
final ":"), la instruccin "MOV", y los operandos "AX" como destino y "001A"
como fuente, ademas del comentario que sigue despues del ";".

Un ejemplo de una declaracin de una constante esta dado por:

UNO EQU 0001H

Donde "UNO" es el nombre de la constante que definimos, "EQU" es la
directiva utilizada para usar a "UNO" como constante, y "0001H" es el
operando, que en este caso sera el valor que guarde UNO.



Formato Externo de un programa



Ademas de definir ciertas reglas para que el ensamblador pueda entender una
instruccin es necesario darle cierta informacin de los recursos que se van
a utilizar, como por ejemplo los segmentos de memoria que se van a utilizar,
datos iniciales del programa y tambien donde inicia y donde termina nuestro
cdigo.

                                      Derechos Reservados.1995                                     32



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Un programa sencillo puede ser el siguiente:

     .MODEL SMALL
     .CODE
     Programa:
     MOV AX,4C00H
     INT 21H
     .STACK
     END Programa

El programa realmente no hace nada, unicamente coloca el valor 4C00H en el
registro AX, para que la interrupcin 21H termine el programa, pero nos da
una idea del formato externo en un programa de ensamblador.

La directiva .MODEL define el tipo de memoria que se utilizar; la directiva
.CODE nos indica que lo que esta a continuacin es nuestro programa; la
etiqueta Programa indica al ensamblador el inicio del programa; la directiva
.STACK le pide al ensamblador que reserve un espacio de memoria para las
operaciones de la pila; la instruccin END Programa marca el final del
programa.


Ejemplo prctico de un programa


Aqui se ejemplificar un programa que escriba una cadena en pantalla:

.MODEL SMALL
.CODE
Programa:
MOV AX, @DATA
MOV DS, AX
MOV DX, Offset Texto

                                      Derechos Reservados.1995                                     33



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



MOV AH, 9
INT 21H
MOV AX,4C00H
INT 21H
.DATA
Texto DB 'Mensaje en pantalla.$'
.STACK
END Programa

Los primeros pasos son iguales a los del programa anterior: se define el
modelo de memoria, se indica donde inicia el cdigo del programa y en donde
comienzan las instrucciones.

A continuacin se coloca @DATA en el registro AX para despues pasarlo al
registro DS ya que no se puede copiar directamente una constante a un
registro de segmento. El contenido de @DATA es el nmero del segmento que
ser utilizado para los datos. Luego se guarda en el registro DX un valor dado por "Offset Texto" que nos da la direccin donde se encuentra la cadena de caracteres en el segmento de datos. Luego utiliza la opcin 9 (Dada por el valor de AH) de la interrupcin 21H para desplegar la cadena posicionada en la direccin que contiene DX. Por ltimo utiliza la opcin 4CH de la interrupcin 21H para terminar la ejecucin del programa (aunque cargamos al registro AX el valor 4C00H la interrupcin 21H solo toma como opcin el contenido del registro AH).

La directiva .DATA le indica al ensamblador que lo que est escrito a
continuacin debe almacenarlo en el segmento de memoria destinado a los
datos. La directiva DB es utilizada para Definir Bytes, sto es, asignar a
cierto identificador (en este caso "Texto") un valor, ya sea una constante o
una cadena de caracteres, en este ltimo caso deber estar entre comillas
sencillas ' y terminar con el simbolo "$".


                                      Derechos Reservados.1995                                     34



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Segmentos



La arquitectura de los procesadores x86 obliga al uso de segmentos de
memoria para manejar la informacin, el tamao de estos segmentos es de
64kb.

La razn de ser de estos segmentos es que, considerando que el tamao mximo de un nmero que puede manejar el procesador esta dado por una palabra de 16 bits o registro, no ser'a posible accesar a ms de 65536 localidades de memoria utilizando uno solo de estos registros, ahora, si se divide la memoria de la pc en grupos o segmentos, cada uno de 65536 localidades, y utilizamos una direccin en un registro exclusivo para localizar cada segmento, y entonces cada direccin de una casilla espec'fica la formamos
con dos registros, nos es posible accesar a una cantidad de 4294967296 bytes
de memoria, lo cual es, en la actualidad, ms memoria de la que veremos
instalada en una PC.

Para que el ensamblador pueda manejar los datos es necesario que cada dato o
instruccin se encuentren localizados en el rea que corresponde a sus
respectivos segmentos. El ensamblador accesa a esta informacin tomando en
cuenta la localizacin del segmento, dada por los registros DS, ES, SS y CS,
y dentro de dicho registro la direccin del dato espec'fico. Es por ello que
cuando creamos un programa empleando el Debug en cada linea que vamos
ensamblando aparce algo parecido a lo siguiente:

1CB0:0102 MOV AX,BX

En donde el primer nmero, 1CB0, corresponde al segmento de memoria que se est utilizando, el segundo se refiere la la direccin dentro de dicho
segmento, y a continuacin aparecen las instrucciones que se almacenaran a
partir de esa direccin.

                                      Derechos Reservados.1995                                     35


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


La forma de indicarle al ensamblador con cuales de los segmentos se va a
trabajar es por medio de las directivas .CODE, .DATA y .STACK.

El ensamblador se encarga de ajustar el tamao de los segmentos tomando como base el nmero de bytes que necesita cada instruccin que va ensamblando, ya que ser'a un desperdicio de memoria utilizar los segmentos completos. Por ejemplo, si un programa unicamente necesita 10kb para almacenar los datos, el segmento de datos unicamente sera de 10kb y no de los 64kb que puede manejar.



Tabla de s'mbolos


A cada una de las partes de una linea de cdigo en ensamblador se le conoce
como token, por ejemplo en la linea de cdigo

MOV AX,Var

tenemos tres tokens, la instruccin MOV, el operando AX, y el operando VAR.
El ensamblador lo que hace para generar el cdigo OBJ es leer cada uno de
los tokens y buscarlo en una tabla interna de "equivalencias" conocida como
tabla de palabras reservadas, que es donde se encuentran todos los
significados de los mnemnicos que utilizamos como instrucciones.

Siguiendo este proceso, el ensamblador lee MOV, lo busca en su tabla y al
encontrarlo lo identifica como una instruccin del procesador, asi mismo lee
AX y lo reconoce como un registro del procesador, pero al momento de buscar
el token Var en la tabla de palabras reservadas no lo encuentra y entonces
lo busca en la tabla de s'mbolos que es una tabla donde se encuentran los
nombres de las variables, constantes y etiquetas utilizadas en el programa
donde se incluye su direccin en memoria y el tipo de datos que contiene.


                                     Derechos Reservados.1995                                     36


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Algunas veces el ensamblador se encuentra con algun token no definido en el
programa, lo que hace en estos casos es dar una segunda pasada por el
programa fuente para verificar todas las referencias a ese s'mbolo y
colocarlo en la tabla de s'mbolos. Existen s'mbolos que no los va a
encontrar ya que no pertenecen a ese segmento y el programa no sabe en que
parte de la memoria se encontrara dicho segmento, en este momento entra en
accin el enlazador, el cual crea la estructura que necesita el cargador
para que el segmento y el token sean definidos cuando se cargue el programa
y antes de que el mismo sea ejecutado.



Movimiento de datos



En todo programa es necesario mover datos en la memoria y en los registros
de la UCP; existen diversas formas de hacer esto: puede copiar datos de la
memoria a algun registro, de registro a registro, de un registro a una pila,
de la pila a un registro, transmitir datos hacia dispositivos externos asi
como recibir datos de dichos dispositivos.

Este movimiento de datos est sujeto a reglas y restricciones. Algunas de
ellas son las que se citan a continuacin.

 No es posible mover datos de una localidad de memoria a otra
directamente, es necesario primero mover los datos de la localidad origen
hacia un registro y luego del registro a la localidad destino.

 No se puede mover una constante directamente a un registro de
segmentos, primero se debe mover a un registro de la UCP.


                                    Derechos Reservados.1995                                     37



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Es posible mover bloques de datos por medio de las instrucciones movs, que
copia una cadena de bytes o palabras; movsb que copia n bytes de una
localidad a otra; y movsw copia n palabras de una localidad a otra. Las dos
ltimas instrucciones toman los valores de las direcciones definidas por
DS:SI como grupo de datos a mover y ES:DI como nueva localizacin de los
datos.

Para mover los datos tambien existen las estructuras llamadas pilas, en este
tipo de estructuras los datos se introducen con la instruccin push y se
extraen con la instruccin pop

En una pila el primer dato introducido es el ltimo que podemos sacar, esto
es, si en nuestro programa utilizamos las instrucciones:

PUSH AX
PUSH BX
PUSH CX

Para devolver los valores correctos a cada registro al momento de sacarlos
de la pila es necesario hacerlo en el siguiente orden:

POP CX
POP BX
POP AX

Para la comunicacin con dispositivos externos se utilizan el comando out
para mandar informacin a un puerto y el comando in para leer informacin
recibida desde algun puerto.

La sintaxis del comando out es:

OUT DX,AX

                                    Derechos Reservados.1995                                     38



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Donde DX contiene el valor del puerto que se utilizar para la comunicacin
y AX contiene la informacin que se mandar.

La sintaxis del comando in es:

IN AX,DX

Donde AX es el registro donde se guardar la informacin que llegue y DX
contiene la direccin del puerto por donde llegar la informacin.



Operaciones lgicas y aritmticas



Las instrucciones de las operaciones lgicas son: and, not, or y xor, stas
trabajan sobre los bits de sus operandos.

Para verificar el resultado de operaciones recurrimos a las instrucciones
cmp y test.

Las instrucciones utilizadas para las operaciones algebraicas son: para
sumar add, para restar sub, para multiplicar mul y para dividir div.

Casi todas las instrucciones de comparacin estn basadas en la informacin
contenida en el registro de banderas. Normalmente las banderas de este
registro que pueden ser directamente manipuladas por el programador son la
bandera de direccin de datos DF, usada para definir las operaciones sobre
cadenas. Otra que tambien puede ser manipulada es la bandera IF por medio de las instrucciones sti y cli, para activar y desactivar respectivamente las
interrupciones.


                                    Derechos Reservados.1995                                     39



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Saltos, ciclos y procedimientos


Los saltos incondicionales en un programa escrito en lenguaje ensamblador
estn dados por la instruccin jmp, un salto es alterar el flujo de la
ejecucin de un programa enviando el control a la direccin indicada.

Un ciclo, conocido tambien como iteracin, es la repeticin de un proceso un
cierto nmero de veces hasta que alguna condicin se cumpla. En estos ciclos
se utilizan los brincos "condicionales" basados en el estado de las
banderas. Por ejemplo la instruccin jnz que salta solamente si el resultado
de una operacin es diferente de cero y la instruccin jz que salta si el
resultado de la operacin es cero.

Por ltimo tenemos los procedimientos o rutinas, que son una serie de pasos
que se usaran repetidamente en el programa y en lugar de escribir todo el
conjunto de pasos unicamente se les llama por medio de la instruccin call.

Un procedimiento en ensamblador es aquel que inicie con la palabra Proc y
termine con la palabra ret.

Realmente lo que sucede con el uso de la instruccin call es que se guarda
en la pila el registro IP y se carga la direccin del procedimiento en el
mismo registro, conociendo que IP contiene la localizacin de la siguiente
instruccin que ejecutara la UCP, entonces podemos darnos cuenta que se
desv'a el flujo del programa hacia la direccin especificada en este
registro. Al momento en que se llega a la palabra ret se saca de la pila el
valor de IP con lo que se devuelve el control al punto del programa donde se
invoc al procedimiento.

Es posible llamar a un procedimiento que se encuentre ubicado en otro
segmento, para sto el contenido de CS (que nos indica que segmento se est
utilizando) es empujado tambin en la pila.

                                    Derechos Reservados.1995                                     40


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin


Instrucciones de operacin sobre datos


Instrucciones de transferencia

Son utilizadas para mover los contenidos de los operandos. Cada instruccin
se puede usar con diferentes modos de direccionamiento.

     MOV
     MOVS (MOVSB) (MOVSW)
Instrucciones de carga

Son instrucciones espec'ficas de los registros. Son usadas para cargar en
algn registro bytes o cadenas de bytes.

     LODS (LODSB) (LODSW)
     LAHF
     LDS
     LEA
     LES
Instrucciones de la pila

Estas instrucciones permiten el uso de la pila para almacenar y extraer
datos.

     POP
     POPF
     PUSH
     PUSHF


Instruccin MOV

Propsito: Transferencia de datos entre celdas de memoria, registros y
acumulador.
                                      Derechos Reservados.1995                                     41


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Sintaxis:


MOV Destino,Fuente

Donde Destino es el lugar a donde se movern los datos y fuente es el lugar
donde se encuentran dichos datos.

Los diferentes movimientos de datos permitidos para esta instruccin son:


 Destino: memoria. Fuente: acumulador
 Destino: acumulador. Fuente: memoria
 Destino: registro de segmento. Fuente: memoria/registro
 Destino: memoria/registro. Fuente: registro de segmento
 Destino: registro. Fuente: registro
 Destino: registro. Fuente: memoria
 Destino: memoria. Fuente: registro
 Destino: registro. Fuente: dato inmediato
 Destino: memoria. Fuente: dato inmediato

Ejemplo:

MOV AX,0006h
MOV BX,AX
MOV AX,4C00h
INT 21H

Este pequeo programa mueve el valor 0006H al registro AX, luego mueve el
contenido de AX (0006h) al registro BX, por ltimo mueve el valor 4C00h al
registro AX para terminar la ejecucin con la opcin 4C de la interrupcin
21h.

                                       Derechos Reservados.1995                                     42



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Instruccin MOVS (MOVSB) (MOVSW)



Propsito: Mover cadenas de bytes o palabras desde la fuente, direccionada
por SI, hasta el destino direccionado por DI.

Sintaxis:

MOVS

Este comando no necesita parametros ya que toma como direccin fuente el
contenido del registro SI y como destino el contenido de DI. La secuencia de
instrucciones siguiente ilustran esto:

MOV SI, OFFSET VAR1
MOV DI, OFFSET VAR2
MOVS

Primero inicializamos los valores de SI y DI con las direcciones de las
variables VAR1 y VAR2 respectivamente, despues al ejecutar MOVS se copia el
contenido de VAR1 a VAR2.

Los comandos MOVSB y MOVSW se utilizan de la misma forma que MOVS, el
primero mueve un byte y el segundo una palabra.



Instruccin LODS (LODSB) (LODSW)



Propsito: Cargar cadenas de un byte o palabra al acumulador.

                                       Derechos Reservados.1995                                     43


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Sintaxis:

LODS

Esta instruccin toma la cadena que se encuentre en la direccin especificada por SI, la carga al registro AL (o AX) y suma o resta 1 (segun el estado de DF) a SI si la transferencia es de bytes o 2 si la transferencia es de palabras.

MOV SI, OFFSET VAR1
LODS

La primer linea carga la direccin de VAR1 en SI y la segunda linea lleva el
contenido de esa localidad al registro AL.

Los comandos LODSB y LODSW se utilizan de la misma forma, el primero carga
un byte y el segundo una palabra (utiliza el registro completo AX).



Instruccin LAHF



Propsito: Transfiere al registro AH el contenido de las banderas

Sintaxis:

LAHF

Esta instruccin es til para verificar el estado de las banderas durante la
ejecucin de nuestro programa.


                                       Derechos Reservados.1995                                     44



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Las banderas quedan en el siguiente orden dentro del registro:

SF ZF ? AF ? PF ? CF

El simbolo "?" significa que en esos bits habr. un valor indefinido.



Instruccin LDS



Propsito: Cargar el registro del segmento de datos

Sintaxis:

LDS destino, fuente

El operando fuente debe ser una palabra doble en memoria. La palabra
asociada con la direccin mas grande es transferida a DS, o sea que se toma
como la direccin del segmento. La palabra asociada con la direccin menor
es la direccin del desplazamiento y se deposita en el registro sealado
como destino.



Instruccin LEA


Propsito: Carga la direccin del operando fuente.

Sintaxis:

LEA destino, fuente
                                       Derechos Reservados.1995                                     45


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



El operando fuente debe estar ubicado en memoria, y se coloca su
desplazamiento en el registro 'ndice o apuntador especificado en destino.

Para ilustrar una de las facilidades que tenemos con este comando pongamos
una equivalencia:

MOV SI, OFFSET VAR1

Equivale a:

LEA SI, VAR1

Es muy probable que para el programador sea mas sencillo crear programas
extensos utilizando este ltimo formato.



Instruccin LES



Propsito: Carga el registro del segmento extra

Sintaxis:

LES destino, fuente

El operando fuente debe ser un operando en memoria de palabra doble. El
contenido de la palabra con la direccin mayor se interpreta como la
direccin del segmento y se coloca en ES. La palabra con la direccin menor
es la direccin del desplazamiento y se coloca en el registro especificado
en el parmetro destino.


                                       Derechos Reservados.1995                                     46


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Instruccin POP



Propsito: Recupera un dato de la pila

Sintaxis:

POP destino

Esta instruccin transfiere el ltimo valor almacenado en la pila al
operando destino, despues incrementa en dos el registro SP.

Este incremento se debe a que la pila va creciendo desde la direccin mas
alta de memoria del segmento hacia la mas baja, y la pila solo trabaja con
palabras (2 bytes), entonces al incrementar en dos el registro SP realmente
se le esta restando dos al tamao real de la pila.



Instruccin POPF



Propsito: Extrae las banderas almacenadas en la pila.

Sintaxis:

POPF

Este comando transfiere bits de la palabra almacenada en la parte superior
de la pila hacia el registro de banderas.

                                       Derechos Reservados.1995                                     47



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



La forma de transferencia es la siguiente:

 BIT  BANDERA
   0     CF
   2     PF
   4     AF
   6     ZF
   7     SF
   8     TF
   9     IF
  10     DF
  11     OF

Estas localizaciones son las mismas para el comando PUSHF

Una vez hecha la transferencia se incrementa en 2 el registro SP
disminuyendo as' el tamao de la pila.



Instruccin PUSH



Propsito: Coloca una palabra en la pila.

Sintaxis:

PUSH fuente

La instruccin PUSH decrementa en dos el valor de SP y luego transfiere el
contenido del operando fuente a la nueva direccin resultante en el registro
recin modificado.

                                       Derechos Reservados.1995                                     48


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



El decremento en la direccin se debe a que al agregar valores a la pila
sta crece de la direccin mayor a la direccin menor del segmento, por lo
tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el
tamao de la pila en dos bytes, que es la nica cantidad de informacin que
puede manejar la pila en cada entrada y salida de datos.



Instruccin PUSHF



Propsito: Coloca el valor de las banderas en la pila

Sintaxis:

PUSHF

Este comando decrementa en 2 el valor del registro SP y luego se transfiere
el contenido del registro de banderas a la pila, en la direccin indicada
por SP.

Las banderas quedan almacenadas en memoria en los mismos bits indicados en
el comando POPF







                                       Derechos Reservados.1995                                     49




                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Instrucciones lgicas y aritmticas


Instrucciones lgicas.

Son utilizadas para realizar operaciones lgicas sobre los operandos.

     AND
     NEG
     NOT
     OR
     TEST
     XOR
Instrucciones aritmticas.

Se usan para realizar operaciones aritmticas sobre los operandos.

     ADC
     ADD
     DIV
     IDIV
     MUL
     IMUL
     SBB
     SUB



Instruccin AND



Propsito: Realiza la conjuncin de los operandos bit por bit.


                                       Derechos Reservados.1995                                      50


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Sintaxis:

AND destino, fuente

Con esta instruccin se lleva a cabo la operacin "y" lgica de los dos
operandos:

 Fuente  Destino | Destino
 --------------------------
    1       1    |    1
    1       0    |    0
    0       1    |    0
    0       0    |    0

El resultado de la operacin se almacena en el operando destino.

 

Instruccin NEG

 

Propsito: Genera el complemento a 2

Sintaxis:

NEG destino

Esta instruccin genera el complemento a 2 del operando destino y lo
almacena en este mismo operando. Por ejemplo, si AX guarda el valor de
1234H, entonces:

NEG AX

                                       Derechos Reservados.1995                                      51


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Nos dejar'a almacenado en el registro AX el valor EDCCH.



Instruccin NOT


Propsito: Lleva a cabo la negacin bit por bit del operando destino.

Sintaxis:

NOT destino

El resultado se guarda en el mismo operando destino.



Instruccin OR


Propsito: OR inclusivo lgico

Sintaxis:

OR destino, fuente

La instruccin OR lleva a cabo, bit por bit, la disyuncin inclusiva lgica
de los dos operandos:

 Fuente  Destino | Destino
 --------------------------
    1       1    |    1
    1       0    |    1
    0       1    |    1
    0       0    |    0
                                       Derechos Reservados.1995                                      52


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Instruccin TEST



Propsito: Comparar logicamente los operandos

Sintaxis:

TEST destino, fuente

Realiza una conjuncin, bit por bit, de los operandos, pero a diferencia de
AND esta instruccin no coloca el resultado en el operando destino, solo
tiene efecto sobre el estado de las banderas.



Instruccin XOR


Propsito: OR exclusivo

Sintaxis:

XOR destino, fuente

Su funcin es efectuar bit por bit la disyuncin exclusiva lgica de los dos
operandos.

 Fuente  Destino | Destino
 --------------------------
    1       1    |    0
    0       0    |    1
    0       1    |    1
    0       0    |    0
                                       Derechos Reservados.1995                                      53


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Instruccin ADC


Propsito: Adicin con acarreo.

Sintaxis:

ADC destino, fuente

Lleva a cabo la suma de dos operandos y suma uno al resultado en caso de que
la bandera CF est activada, esto es, en caso de que exista acarreo.

El resultado se guarda en el operando destino.



Instruccin ADD


Propsito: Adicin de los operandos.

Sintaxis:

ADD destino, fuente

Suma los dos operandos y guarda el resultado en el operando destino.



Instruccin DIV


Propsito: Divisin sin signo

                                       Derechos Reservados.1995                                      54



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Sintaxis:

DIV fuente

El divisor puede ser un byte o palabra y es el operando que se le da a la
instruccin.

Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX
y si el divisor es de 16 bits se tomara como dividendo el registro par
DX:AX, tomando como palabra alta DX y como baja AX.

Si el divisor fu un byte el cociente se almacena en el registro AL y el
residuo en AH, si fu una palabra el cociente se guarda en AX y el residuo
en DX.



Instruccin IDIV



Propsito: Divisin con signo

Sintaxis:

IDIV fuente

Consiste basicamente en lo mismo que la instruccin DIV, solo que esta
ltima realiza la operacin con signo.

Para sus resultados utiliza los mismos registros que la instruccin DIV.



                                      Derechos Reservados.1995                                      55


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Instruccin MUL



Propsito: Multiplicacin sin signo

Sintaxis:

MUL fuente

El ensamblador asume que el multiplicando sera del mismo tamao que el del
multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.

Cuando se realiza una multiplicacin con valores de 8 bits el resultado se
almacena en el registro AX y cuando la multiplicacin es con valores de 16
bits el resultado se almacena en el registro par DX:AX.



Instruccin IMUL



Propsito: Multiplicacin de dos enteros con signo.

Sintaxis:

IMUL fuente

Este comando hace lo mismo que el anterior, solo que si toma en cuenta los
signos de las cantidades que se multiplican.

                                      Derechos Reservados.1995                                      56


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Los resultados se guardan en los mismos registros que en la instruccin MOV.



Instruccin SBB



Propsito: Substraccin con acarreo

Sintaxis:

SBB destino, fuente

Esta instruccin resta los operandos y resta uno al resultado si CF est
activada. El operando fuente siempre se resta del destino.

Este tipo de substraccin se utiliza cuando se trabaja con cantidades de 32
bits.



Instruccin SUB



Propsito: Substraccin

Sintaxis:

SUB destino, fuente

Resta el operando fuente del destino.

                                      Derechos Reservados.1995                                      57


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Instrucciones lgicas y aritmticas


Instrucciones de salto

Son utilizadas para transferir el flujo del proceso al operando indicado.

     JMP
     JA (JNBE)
     JAE (JNBE)
     JB (JNAE)
     JBE (JNA)
     JE (JZ)
     JNE (JNZ)
     JG (JNLE)
     JGE (JNL)
     JL (JNGE)
     JLE (JNG)
     JC
     JNC
     JNO
     JNP (JPO)
     JNS
     JO
     JP (JPE)
     JS
Instrucciones para ciclos: LOOP

Transfieren el flujo del proceso, condicional o incondicionalmente, a un
destino repitiendose esta accin hasta que el contador sea cero.

     LOOP
     LOOPE
     LOOPNE
Instrucciones de conteo
                                      Derechos Reservados.1995                                      58


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Se utilizan para decrementar o incrementar el contenido de los contadores.

     DEC
     INC
Instrucciones de comparacin

Son usadas para comparar operandos, afectan al contenido de las banderas.

     CMP
     CMPS (CMPSB) (CMPSW)
Instrucciones de banderas

Afectan directamente al contenido de las banderas.

     CLC
     CLD
     CLI
     CMC
     STC
     STD
     STI


Instruccin JMP


Propsito: Salto incondicional

Sintaxis:

JMP destino

Esta instruccin se utiliza para desviar el flujo de un programa sin tomar
en cuenta las condiciones actuales de las banderas ni de los datos.

                                      Derechos Reservados.1995                                      59


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Instruccin JA (JNBE)



Propsito: Brinco condicional

Sintaxis:

JA Etiqueta

Despus de una comparacin este comando salta si est arriba o salta si no
est abajo o si no es igual.

Esto significa que el salto se realiza solo si la bandera CF esta
desactivada o si la bandera ZF esta desactivada (que alguna de las dos sea
igual a cero).



Instruccin JAE (JNB)



Propsito: salto condicional

Sintaxis:

JAE etiqueta

Salta si est arriba o si es igual o salta si no est abajo.

El salto se efectua si CF esta desactivada.


                                      Derechos Reservados.1995                                      60


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Instruccin JB (JNAE)



Propsito: salto condicional

Sintaxis:

JB etiqueta

Salta si est abajo o salta si no est arriba o si no es igual.

Se efecta el salto si CF esta activada.



Instruccin JBE (JNA)



Propsito: salto condicional

Sintaxis:

JBE etiqueta

Salta si est abajo o si es igual o salta si no est arriba.

El salto se efecta si CF est activado o si ZF est activado (que
cualquiera sea igual a 1).



                                      Derechos Reservados.1995                                      61



                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Instruccin JE (JZ)


Propsito: salto condicional

Sintaxis:

JE etiqueta

Salta si es igual o salta si es cero.

El salto se realiza si ZF est activada.



Instruccin JNE (JNZ)


Propsito: salto condicional

Sintaxis:

JNE etiqueta

Salta si no es igual o salta si no es cero.

El salto se efectua si ZF est desactivada.


Instruccin JG (JNLE)


Propsito: salto condicional, se toma en cuenta el signo.

                                      Derechos Reservados.1995                                      62


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Sintaxis:

JG etiqueta

Salta si es ms grande o salta si no es menor o igual.

El salto ocurre si ZF = 0 u OF = SF.



Instruccin JGE (JNL)



Propsito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JGE etiqueta

Salta si es ms grande o igual o salta si no es menor que.

El salto se realiza si SF = OF



Instruccin JL (JNGE)


Propsito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JL etiqueta
                                       Derechos Reservados.1995                                      63


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Salta si es menor que o salta si no es mayor o igual.

El salto se efecta si SF es diferente a OF.



Instruccin JLE (JNG)


Propsito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JLE etiqueta

Salta si es menor o igual o salta si no es ms grande.

El salto se realiza si ZF = 1 o si SF es diferente a OF



Instruccin JC


Propsito: salto condicional, se toman en cuenta las banderas.

Sintaxis:

JC etiqueta

Salta si hay acarreo.

El salto se realiza si CF = 1
                                       Derechos Reservados.1995                                      64



                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Instruccin JNC


Propsito: salto condicional, se toma en cuenta el estado de las banderas.

Sintaxis:

JNC etiqueta

Salta si no hay acarreo.

El salto se efecta si CF = 0.



Instruccin JNO


Propsito: salto condicional, se toma en cuenta el estado de las banderas.

Sintaxis:

JNO etiqueta

Salta si no hay desbordamiento.

El salto se efectua si OF = 0.



Instruccin JNP (JPO)


Propsito: salto condicional, toma en cuenta el estado de las banderas.
                                       Derechos Reservados.1995                                      65


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Sintaxis:

JNP etiqueta

Salta si no hay paridad o salta si la paridad es non.

El salto ocurre si PF = 0.



Instruccin JNS


Propsito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JNP etiqueta

Salta si el signo esta desactivado.

El salto se efecta si SF = 0.



Instruccin JO


Propsito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JO etiqueta

                                       Derechos Reservados.1995                                      66



                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Salta si hay desbordamiento (overflow).

El salto se realiza si OF = 1.



Instruccin JP (JPE)


Propsito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JP etiqueta

Salta si hay paridad o salta si la paridad es par.

El salto se efecta si PF = 1.



Instruccin JS


Propsito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JS etiqueta

Salta si el signo est prendido.

El salto se efecta si SF = 1.


                                       Derechos Reservados.1995                                      67


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Instruccin LOOP


Propsito: Generar un ciclo en el programa.

Sintaxis:

LOOP etiqueta

La instruccin loop decrementa CX en 1, y transfiere el flujo del programa a
la etiqueta dada como operando si CX es diferente a 1.



Instruccin LOOPE


Propsito: Generar un ciclo en el programa considerando el estado de ZF

Sintaxis:

LOOPE etiqueta

Esta instruccin decrementa CX en 1. Si CX es diferente a cero y ZF es igual
a 1, entonces el flujo del programa se transfiere a la etiqueta indicada
como operando.



Instruccin LOOPNE


Propsito: Generar un ciclo en el programa, considerando el estado de ZF

                                       Derechos Reservados.1995                                      68



                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Sintaxis:

LOOPNE etiqueta

Esta instruccin decrementa en uno a CX y transfiere el flujo del programa
solo si ZF es diferente a 0.



Instruccin DEC



Propsito: Decrementar el operando

Sintaxis:

DEC destino

Esta operacin resta 1 al operando destino y almacena el nuevo valor en el
mismo oeprando.



Instruccin INC



Propsito: Incrementar el operando.

Sintaxis:

INC destino

                                       Derechos Reservados.1995                                      69



                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


La instruccin suma 1 al operando destino y guarda el resultado en el mismo
operando destino.



Instruccin CMP



Propsito: Comparar los operandos.

Sintaxis:

CMP destino, fuente

Esta instruccin resta el operando fuente al operando destino pero sin que
ste almacene el resultado de la operacin, solo se afecta el estado de las
banderas.



Instruccin CMPS (CMPSB) (CMPSW)



Propsito: Comparar cadenas de un byte o palabra.

Sintaxis:

CMP destino, fuente

Con esta instruccin la cadena de caracteres fuente se resta de la cadena
destino.

                                       Derechos Reservados.1995                                      70



                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Se utilizan DI como indice para el segmento extra de la cadena fuente y SI
como indice de la cadena destino.

Solo se afecta el contenido de las banderas y tanto DI como SI se
incrementan.



Instruccin CLC



Propsito: Limpiar bandera de acarreo.

Sintaxis:

CLC

Esta instruccin apaga el bit correspondiente a la bandera de acarreo, o
sea, lo pone en cero.



Instruccin CLD



Propsito: Limpiar bandera de direccin

Sintaxis:

CLD

La instruccin CLD pone en cero el bit correspondiente a la bandera de
direccin.
                                       Derechos Reservados.1995                                      71


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Instruccin CLI



Propsito: Limpiar bandera de interrupcin

Sintaxis:

CLI

CLI pone en cero la bandera de interrupciones, desabilitando as' aquellas
interrupciones enmascarables.

Una interrupcin enmascarable es aquella cuyas funciones son desactivadas
cuando IF = 0.



Instruccin CMC



Propsito: Complementar la bandera de acarreo.

Sintaxis:

CMC

Esta instruccin complementa el estado de la bandera CF, si CF = 0 la
instruccin la iguala a 1, y si es 1 la instruccin la iguala a 0.

Podemos decir que unicamente "invierte" el valor de la bandera.


                                       Derechos Reservados.1995                                      72


                                UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Instruccin STC


Propsito: Activar la bandera de acarreo.

Sintaxis:

STC

Esta instruccin pone la bandera CF en 1.


Instruccin STD


Propsito: Activar la bandera de direccin.

Sintaxis:

STD

La instruccin STD pone la bandera DF en 1.


Instruccin STI


Propsito: Acticar la bandera de interrupcin.

Sintaxis:

STI

La instruccin activa la bandera IF, esto habilita las interrupciones
externas enmascarables (las que funcionan unicamente cuando IF = 1 ).
                                       Derechos Reservados.1995                                      73


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Interrupciones


Interrupciones internas de hardware
Interrupciones externas de hardware
Interrupciones de software
Interrupciones mas usuales:
     Int 21H (interrupcin del DOS)

     Multiples llamadas a funciones del DOS.

     Int 10H (interrupcin del BIOS)

     Entrada/salida de video.

     Int 16H (Interrupcin del BIOS)

     Entrada/salida de teclado.

     Int 17H (Interrupcin del BIOS)

     Entrada/salida de la impresora.



Interrupciones internas de hardware



Las interrupciones internas son generadas por ciertos eventos que surgen
durante la ejecucin de un programa.

Este tipo de interrupciones son manejadas en su totalidad por el hardware y
no es posible modificarlas.

                                       Derechos Reservados.1995                                      74


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj interno de la computadora, el hardware hace el llamado a esta interrupcin varias veces durante un segundo para mantener la hora actualizada.

Aunque no podemos manejar directamente esta interrupcin (no podemos
controlar por software las actualizaciones del reloj), es posible utilizar sus efectos en la computadora para nuestro beneficio, por ejemplo para crear
un "reloj virtual" actualizado continuamente gracias al contador del reloj
interno. Unicamente debemos escribir un programa que lea el valor actual del
contador y lo traduzca a un formato entendible para el usuario.


Interrupciones externas de hardware


Las interrupciones externas las generan los dispositivos perifericos, como
pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. Tambin
son generadas por los coprocesadores.

No es posible desactivar a las interrupciones externas.

Estas interrupciones no son enviadas directamente a la UCP, sino que se
mandan a un circuito integrado cuya funcin es exclusivamente manejar este
tipo de interrupciones. El circuito, llamado PIC 8259A, si es controlado por
la UCP utilizando para tal control una serie de vias de comunicacin
llamadas puertos.


Interrupciones de software


Las interrupciones de software pueden ser activadas directamente por el
ensamblador invocando al nmero de interrupcin deseada con la instruccin
INT.
                                       Derechos Reservados.1995                                      75


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



El uso de las interrupciones nos ayuda en la creacin de programas,
utilizandolas nuestros programas son ms cortos, es ms fcil entenderlos y
usualmente tienen un mejor desempeo debido en gran parte a su menor tamao.

Este tipo de interrupciones podemos separarlas en dos categorias: las
interrupciones del sistema operativo DOS y las interrupciones del BIOS.

La diferencia entre ambas es que las interrupciones del sistema operativo
son ms fciles de usar pero tambin son ms lentas ya que estas
interrupciones hacen uso del BIOS para lograr su cometido, en cambio las
interrupciones del BIOS son mucho ms rpidas pero tienen la desventaja que,
como son parte del hardware son muy espec'ficas y pueden variar dependiendo incluso de la marca del fabricante del circuito.

La eleccin del tipo de interrupcin a utilizar depender unicamente de las
caracteristicas que le quiera dar a su programa: velocidad (utilizando las
del BIOS) o portabilidad (utilizando las del DOS).



Interrupcin 21H



Propsito: Llamar a diversas funciones del DOS.

Sintaxis:

Int 21H

 Nota: Cuando trabajamos en MASM es necesario especificar que el
valor que estamos utilizando es hexadecimal.

                                       Derechos Reservados.1995                                      76


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Esta interrupcin tiene varias funciones, para accesar a cada una de ellas
es necesario que el el registro AH se encuentre el nmero de funcin que se
requiera al momento de llamar a la interrupcin.


 Funciones para desplegar informacin al video.

      02H Exhibe salida
      09H Impresin de cadena (video)
      40H Escritura en dispositivo/Archivo


 Funciones para leer informacin del teclado.

      01H Entrada desde teclado
      0AH Entrada desde teclado usando buffer
      3FH Lectura desde dispositivo/archivo


 Funciones para trabajar con archivos.

En esta seccin unicamente se expone la tarea espec'fica de cada funcin,
para una referencia acerca de los conceptos empleados refierase a la unidad
7, titulada: "Introduccin al manejo de archivos".

     Mtodo FCB

      0FH Abrir archivo
      14H Lectura secuencial
      15H Escritura secuencial
      16H Crear archivo
      21H Lectura aleatoria
      22H Escritura aleatoria

                                       Derechos Reservados.1995                                      77


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



     Handles

     3CH Crear archivo
     3DH Abrir archivo
     3EH Cierra manejador de archivo
     3FH Lectura desde archivo/dispositivo
     40H Escritura en archivo/dispositivo
     42H Mover apuntador de lectura/escritura en archivo



Funcin 02H



 Uso:

Despliega un caracter a la pantalla.

 Registros de llamada:

AH = 02H
DL = Valor del caracter a desplegar.

 Registros de retorno:

Ninguno

Esta funcin nos despliega el caracter cuyo codigo hexagesimal corresponde
al valor almacenado en el registro DL, no se modifica ningn registro al
utilizar este comando.

Es recomendado el uso de la funcin 40H de la misma interrupcin en lugar de
esta funcin.
                                       Derechos Reservados.1995                                      78


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Funcin 09H



 Uso:

Despliega una cadena de carateres en la pantalla.

 Registros de llamada:

AH = 09H
DS:DX = Direccin de inicio de una cadena de caracteres

 Registros de retorno:

Ninguno.

Esta funcin despliega los caracteres, uno a uno, desde la direccin
indicada en el registro DS:DX hasta encontrar un caracter $, que es
interpretado como el final de la cadena.

Se recomienda utilizar la funcin 40H en lugar de esta funcin.



Funcin 40H



 Uso:

Escribir a un dispositivo o a un archivo.

                                       Derechos Reservados.1995                                      79



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



 Registros de llamada:

AH = 40H
BX = V'a de comunicacin
CX = Cantidad de bytes a escribir
DS:DX = Direccin del inicio de los datos a escribir

 Registros de retorno:

CF = 0 si no hubo error
     AX = Nmero de bytes escritos
CF = 1 si hubo error
     AX = Cdigo de error

El uso de esta funcin para desplegar informacin en pantalla se realiza
dandole al registro BX el valor de 1 que es el valor preasignado al video
por el sistema operativo MS-DOS.



Funcin 01H


 Uso:

Leer un caracter del teclado y desplegarlo.

 Registros de llamada:

AH = 01H

 Registros de retorno:

AL = Caracter le'do
                                       Derechos Reservados.1995                                      80


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Con esta funcin es muy sencillo leer un caracter del teclado, el cdigo
hexadecimal del caracter le'do se guarda en el registro AL. En caso de que
sea un caracter extendido el registro AL contendra el valor de 0 y ser
necesario llamar de nuevo a la funcin para obtener el cdigo de este
caracter.


Funcin 0AH



 Uso:

Leer caracteres del teclado y almacenarlos en un buffer.

 Registros de llamada:

AH = 0AH
DS:DX = Direccin del rea de almacenamiento
BYTE 0 = Cantidad de bytes en el rea
BYTE 1 = Cantidad de bytes le'dos
desde BYTE 2 hasta BYTE 0 + 2 = caracteres le'dos

 Registros de retorno:

Ninguno

Los caracteres son le'dos y almacenados en un espacio predefinido de
memoria. La estructura de este espacio le indica que en el primer byte del
mismo se indican cuantos caracteres sern le'dos. En el segundo byte se
almacena el nmero de caracteres que ya se leyeron, y del tercer byte en
adelante se escriben los caracteres le'dos.

                                       Derechos Reservados.1995                                      81



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Cuando se han almacenado todos los caracteres indicados menos uno la bocina
suena y cualquier caracter adicional es ignorado. Para terminar la captura
de la cadena es necesario darle [ENTER].



Funcin 3FH


 Uso:

Leer informacin de un dispositivo o archivo.

 Registros de llamada:

AH = 3FH
BX = Nmero asignado al dispositivo
CX = Nmero de bytes a procesar
DS:DX = Direccin del rea de almacenamiento

 Registros de retorno:

CF = 0 si no hay error y AX = nmero de bytes leidos.
CF = 1 si hay error y AX contendra el cdigo del error.



Funcin 0FH


 Uso:

Abrir archivo FCB

                                       Derechos Reservados.1995                                      82


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



 Registros de llamada:

AH = 0FH
DS:DX = Apuntador a un FCB

 Registros de retorno:

AL = 00H si no hubo problema, de lo contrario regresa 0FFH



Funcin 14H



 Uso:

Leer secuencialmente un archivo FCB.

 Registros de llamada:

AH = 14H
DS:DX = Apuntador a un FCB ya abierto.

 Registros de retorno:

AL = 0 si no hubo errores, de lo contrario se regresara el cdigo
correspondiente de error: 1 error al final del archivo, 2 error en la
estructura del FCB y 3 error de lectura parcial.

Esta funcin lo que hace es que lee el siguiente bloque de informacin a
partir de la direccin dada por DS:DX, y actualiza este registro.


                                       Derechos Reservados.1995                                      83


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Funcin 15H



 Uso:

Escribir secuencialmente a un archivo FCB

 Registros de llamada:

AH = 15H
DS:DX = Apuntador a un FCB ya abierto

 Registros de retorno:

AL = 00H si no hubo errores, de lo contrario contendra el cdigo del error:
1 disco lleno o archivo de solo lectura, 2 error en la formacin o
especificacin del FCB.

La funcin 15H despus de escribir el registro al bloque actual actualiza el
FCB.



Funcin 16H



 Uso:

Crear un archivo FCB.

 Registros de llamada:

                                       Derechos Reservados.1995                                      84


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



AH = 16H
DS:DX = Apuntador a un FCB ya abierto.

 Registros de retorno:

AL = 00H si no hubo errores, de lo contrario contendra el valor 0FFH

Se basa en la informacin proveida en un FCB para crear un archivo en el
disco.



Funcin 21H



 Uso:

Leer en forma aleatoria un archivo FCB.

 Registros de llamada:

AH = 21H
DS:DX = Apuntador a un FCB ya abierto.

 Registros de retorno:

A = 00H si no hubo error, de lo contrario AH contendra el cdigo del error:
1 si es fin de archivo, 2 si existe error de especificacin de FCB y 3 si se
ley un registro parcial o el apuntador del archivo se encuentra al final
del mismo.


                                       Derechos Reservados.1995                                      85



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.




Esta funcin lee el registro especificado por los campos del bloque actual y
registro actual de un FCB abierto y coloca la informacin en el DTA (rea de
transferencia de disco o Disk Transfer Area).



Funcin 22H



 Uso:

Escribir en forma aleatoria en un archivo FCB.

 Registros de llamada:

AH = 22H
DS:DX = Apuntador a un FCB abierto.

 Registros de retorno:

AL = 00H si no hubo error, de lo contrario contendr el cdigo del error: 1
si el disco est lleno o es archivo de solo lectura y 2 si hay error en la
especificacin de FCB.

Escribe el registro especificado por los campos del bloque actual y registro
actual de un FCB abierto. Escribe dicha informacin a partir del contenido
del DTA (rea de transferencia de disco).




                                       Derechos Reservados.1995                                      86



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Funcin 3CH


 Uso:

Crear un archivo si no existe o dejarlo en longitud 0 si existe. (Handle)

 Registros de llamada:

AH = 3CH
CH = Atributo de archivo
DS:DX = Apuntador a una especificain ASCIIZ

 Registros de retorno:

CF = 0 y AX el nmero asignado al handle si no hay error, en caso de haberlo
CF ser 1 y AX contendra el cdigo de error: 3 ruta no encontrada, 4 no hay
handles disponibles para asignar y 5 acceso negado.

Esta funcin sustituye a la 16H. El nombre del archivo es especificado en
una cadena ASCIIZ, la cual tiene como caracter'stica la de ser una cadena de
bytes convencional terminada con un caracter 0.

El archivo creado contendra los atributos definidos en el registro CX en la
siguiente forma:

 Valor   Atributos
  00H     Normal
  02H     Escondido
  04H     Sistema
  06H     Escondido y de sistema

El archivo se crea con los permisos de lectura y escritura. No es posible
crear directorios utilizando esta funcin.

                                       Derechos Reservados.1995                                      87


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Funcin 3DH



 Uso:

Abre un archivo y regrese un handle

 Registros de llamada:

AH = 3DH
AL = modo de acceso
DS:DX = Apuntador a una especificacin ASCIIZ

 Registros de retorno:

CF = 0 y AX = nmero de handle si no hay errores, de lo contrario CF = 1 y
AX = cdigo de error: 01H si no es vlida la funcin, 02H si no se encontr
el archivo, 03H si no se encontr&acute;o la ruta, 04H si no hay handles
disponibles, 05H en caso de acceso negado, y 0CH si el cdigo de acceso no
es vlido.

El handle regresado es de 16 bits.

El cdigo de acceso se especifica en la siguiente forma:

 BITS
 7 6 5 4 3 2 1

 . . . . 0 0 0    Solo lectura
 . . . . 0 0 1    Solo escritura
 . . . . 0 1 0    Lectura/Escritura
 . . . X . . .    RESERVADO


                                       Derechos Reservados.1995                                      88


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Funcin 3EH



 Uso:

Cerrar archivo (Handle).

 Registros de llamada:

AH = 3EH
BX = Handle asignado

 Registros de retorno:

CF = 0 si no hubo errores, en caso contrario CF ser 1 y AX contendr el
cdigo de error: 06H si el handle es invlido.

Esta funcin actualiza el archivo y libera o deja disponible el handle que
estaba utilizando.



Funcin 3FH



 Uso:

Leer de un archivo abierto una cantdad definida de bytes y los almacena en
un buffer espec'fico.


                                       Derechos Reservados.1995                                      89



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



 Registros de llamada:

AH = 3FH
BX = Handle asignado
CX = Cantidad de bytes a leer
DS:DX = Apuntador a un rea de trabajo.

 Registros de retorno:

CF = 0 y AX = nmero de bytes leidos si no hubo error, en caso contrario CF
= 1 y AX = cdigo de error: 05H si acceso negado y 06H si no es vlido el
handle.



Funcin 40H



 Uso:

Escribe a un archivo ya abierto una cierta cantidad de bytes a partir del
buffer designado.

 Registros de llamada:

AH = 40H
BX = Handle asignado
CX = Cantidad de bytes a escribir.
DS:DX = Apuntador al buffer de datos.


                                       Derechos Reservados.1995                                      90




                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


 Registros de retorno:

CF = 0 y AX = nmero de bytes escritos si no hay errores, en caso de existir
CF = 1 y AX = cdigo del error: 05H si el acceso es negado y 06H si el
handle es invlido.


Funcin 42H


 Uso:

Mover apuntador al archivo (Handle)

 Registros de llamada:

AH = 42H
AL = mtodo utilizado
BX = Handle asignado
CX = La parte ms significativa del offset
DX = La parte menos significativa del offset

 Registros de retorno:

CF = 0 y DX:AX = la nueva posicin del apuntador. En caso de error CF ser 1
y AX = cdigo de error: 01H si la funcin no es vlida y 06H si el handle no
es vlido.

El mtodo utilizado se configura como sigue:

 Valor de AL   Mtodo
    00H         A partir del principio del archivo
    01H         A partir de la posicin actual
    02H         A partir del final del archivo

                                       Derechos Reservados.1995                                      91


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Interrupcin 10H



Propsito: Llamar a diversas funciones de video del BIOS.

Sintaxis:

Int 10H

Esta interrupcin tiene diversas funciones, todas ellas nos sirven para
controlar la entrada y salida de video, la forma de acceso a cada una de las
opciones es por medio del registro AH.

En este tutorial unicamente veremos algunas de las funciones de esta
interrupcin.

 Funciones comunes de la interrupcin 10H.

     02H Seleccin de posicin del cursor
     09H Escribe atributo y caracter en el cursor
     0AH Escribe caracter en la posicin del cursor
     0EH Escritura de caracteres en modo alfanumrico



Funcin 02H


 Uso:

Posiciona el cursor en la pantalla dentro de las coordenadas vlidas de
texto.

                                       Derechos Reservados.1995                                      92


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


 Registros de llamada:

AH = 02H
BH = Pgina de video en la que se posicionar el cursor.
DH = Fila
DL = Columna

 Registros de retorno:

Ninguno.

Las posiciones de localizacin del cursor son definidas por coordenadas
iniciando en 0,0, que corresponde a la esquina superior izquierda hasta 79,24 correspondientes a la esquina inferior derecha. Tenemos entonces que los valores que pueden tomar los registros DH y DL en modo de texto de 80 x 25 son de 0 hasta 24 y de 0 hasta 79 respectivamente.



Funcin 09H


 Uso:

Desplegar un caracter un determinado nmero de veces con un atributo
definido empezando en la posicin actual del cursor.

 Registros de llamada:

AH = 09H
AL = Caracter a desplegar
BH = Pgina de video en donde se desplegar
BL = Atributo a usar
Nmero de repeticiones.

                                       Derechos Reservados.1995                                      93


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



 Registros de retorno:

Ninguno

Esta funcin despliega un caracter el nmero de veces especificado en CX
pero sin cambiar la posicin del cursor en la pantalla.



Funcin 0AH



 Uso:

Desplegar un caracter en la posicin actual del cursor.

 Registros de llamada:

AH = 0AH
AL = Caracter a desplegar
BH = Pgina en donde desplegar
BL = Color a usar (slo en grficos).
CX = Nmero de repeticiones

 Registros de retorno:

Ninguno.

La nica diferencia entre esta funcin y la anterior es que sta no permite
modificar los atributos, simplemente usa los atributos actuales.

Tampoco se altera la posicin del cursor con esta funcin.

                                       Derechos Reservados.1995                                      94


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Funcin 0EH



 Uso:

Deplegar un caracter en la pantalla actualizando la posicin del cursor.

 Registros de llamada:

AH = 0EH
AL = Caracter a desplegar
BH = Pgina donde se desplegara el caracter
BL = Color a usar (solo en grficos)

 Registros de retorno:

Ninguno



Interrupcin 16H



Propsito: Manejar la entrada/salida del teclado.

Sintaxis:

Int 16H

Veremos dos opciones de la interrupcin 16H, estas opciones, al igual que
las de otras interrupciones, son llamadas utilizando el registro AH.

                                       Derechos Reservados.1995                                      95


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



 Funciones de la interrupcin 16H

      00H Lee un caracter de teclado
      01H Lee estado del teclado



Funcin 00H



 Uso:

Leer un caracter del teclado.

 Registros de llamada:

AH = 00H

 Registros de retorno:

AH = cdigo de barrido (scan code) del teclado
AL = Valor ASCII del caracter.

Cuando se utiliza esta interrupcin se detiene la ejecucin del programa
hasta que se introduzca un caracter desde el teclado, si la tecla presionada
es un caracter ASCII su valor ser guardado en el registro AH, de lo
contrario el cdigo de barrido ser guardado en AL y AH contendr el valor
00H.

El cdigo de barrido fu creado para manejar las teclas que no tienen una
representacin ASCII como [ALT], [CONTROL], las teclas de funcin, etc.


                                       Derechos Reservados.1995                                      96


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



Funcin 01H



 Uso:

Leer estado del teclado.

 Registros de llamada:

AH = 01H

 Registros de retorno:

Si la bandera de cero, ZF, est apagada significa que hay informacin en el
buffer, si se encuentra prendida es que no hay teclas pendientes.

En caso de existir informacin el registro AH contendr el cdigo de la
tecla guardada en el buffer.



Interrupcin 17H


Propsito: Manejar la entrada/salida de la impresora.

Sintaxis:

Int 17H

Esta interrupcin es utilizada para escribir caracteres a la impresora,
inicializarla y leer su estado.

                                       Derechos Reservados.1995                                      97


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


 
Funciones de la interrupcin 16H


      00H Imprime un caracter ASCII
      01H Inicializa la impresora
      02H Proporciona el estado de la impresora



Funcin 00H



 Uso:

Escribir un caracter a la impresora.

 Registros de llamada:

AH = 00H
AL = Caracter a imprimir
DX = Puerto a utilizar

 Registros de retorno:

AH = Estado de la impresora.

El puerto a utilizar, definido en DX, se especifica as': LPT1 = 0, LPT2 = 1,
LPT3 = 2 ...



                                       Derechos Reservados.1995                                      98




                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.



El estado de la impresora se codifica bit por bit como sigue:

 BIT 1/0 SIGNIFICADO
 ----------------------------------------
  0   1   Se agot el tiempo de espera
  1   -
  2   -
  3   1   Error de entrada/salida
  4   1   Impresora seleccionada
  5   1   Papel agotado
  6   1   Reconocimiento de comunicacin
  7   1   La impresora se encuentra libre

Los bits 1 y 2 no son relevantes.

La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque
existen algunos que soportan 4.



Funcin 01H



 Uso:

Inicializar un puerto de impresin.

 Registros de llamada:

AH = 01H
DX = Puerto a utilizar

                                       Derechos Reservados.1995                                      99



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


 Registros de retorno:

AH = Status de la impresora

El puerto a utilizar, definido en DX, se especifica as': LPT1 = 0, LPT2 = 1,
etc.

El estado de la impresora se codifica bit por bit como sigue:

 BIT 1/0 SIGNIFICADO
 ----------------------------------------
  0   1   Se agot el tiempo de espera
  1   -
  2   -
  3   1   Error de entrada/salida
  4   1   Impresora seleccionada
  5   1   Papel agotado
  6   1   Reconocimiento de comunicacin
  7   1   La impresora se encuentra libre

Los bits 1 y 2 no son relevantes.

La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque
existen algunos que soportan 4.



Funcin 02H


 Uso:

Obtener el estado de la impresora.


                                       Derechos Reservados.1995                                    100

 
                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Registros de llamada:

AH = 01H
DX = Puerto a utilizar

 Registros de retorno:

AH = Status de la impresora.

El puerto a utilizar, definido en DX, se especifica as': LPT1 = 0, LPT2 = 1,
etc.

El estado de la impresora se codifica bit por bit como sigue:

 BIT 1/0 SIGNIFICADO
 ----------------------------------------
  0   1   Se agot el tiempo de espera
  1   -
  2   -
  3   1   Error de entrada/salida
  4   1   Impresora seleccionada
  5   1   Papel agotado
  6   1   Reconocimiento de comunicacin
  7   1   La impresora se encuentra libre

Los bits 1 y 2 no son relevantes.

La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque
existen algunos que soportan 4.





                                       Derechos Reservados.1995                                    101



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin


Introducin al manejo de archivos


Formas de trabajar con archivos
     Mtodos de trabajo con archivos
Mtodo FCB
     Introduccin
     Abrir archivos
     Crear un archivo nuevo
     Escritura secuencial
     Lectura secuencial
     Lectura y escritra aleatoria
     Cerrar un archivo
Mtodo de canales de comunicacin
     Trabajando con handles
     Funciones para utilizar handles



Mtodos de trabajo con archivos



Existen dos formas de trabajar con archivos, la primera es por medio de
bloques de control de archivos o "FCB" y la segunda es por medio de canales
de comunicacin, tambien conocidos como "handles".

La primera forma de manejo de archivos se viene utilizando desde el sistema
operativo CPM, antecesor del DOS, por lo mismo asegura cierta compatibilidad
con archivos muy antiguos tanto del CMP como de la versin 1.0 del DOS,
adems este mtodo nos permite tener un nmero ilimitado de archivos
abiertos al mismo tiempo. Si se quiere crear un volumen para el disco la
nica forma de lograrlo es utilizando este mtodo.


                                       Derechos Reservados.1995                                    102


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin




An considerando las ventajas del FCB el uso de los canales de comunicacin
es mucho ms sencillo y nos permite un mejor manejo de errores, adems, por
ser ms novedoso es muy probable que los archivos as' creados se mantengan
compatibles a travs de versiones posteriores del sistema operativo.


Para una mayor facilidad en las explicaciones posteriores me referir a el
mtodo de bloques de control de archivos como FCBs y al mtodo de canales de
comunicacin como handles.



Introduccin



Existen dos tipos de FCB, el normal, cuya longitud es de 37 bytes y el
extendido de 44 bytes. En este tutorial unicamente se tratar el primer
tipo, as' que de ahora en adelante cuando me refiera a un FCB realmente
estoy hablando de un FCB de 37 bytes.


El FCB se compone de informacin dada por el programador y por informacin
que toma directamente del sistema operativo. Cuando se utilizan este tipo de
archivos unicamente es posible trabajar en el directorio actual ya que los
FCB no proveen apoyo para el uso de la organizacin por directorios del DOS.


El FCB est formado por los siguientes campos:



                                      Derechos Reservados.1995                                    103



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



 POSICION  LONGITUD  SIGNIFICADO
   00H      1 Byte    Drive
   01H      8 Bytes   Nombre del archivo
   09H      3 Bytes   Extensin
   0CH      2 Bytes   Nmero de bloque
   0EH      2 Bytes   Tamao del registro
   10H      4 Bytes   Tamao del archivo
   14H      2 Bytes   Fecha de creacin
   16H      2 Bytes   Hora de creacin
   18H      8 Bytes   Reservados
   20H      1 Byte    Registro actual
   21H      4 Bytes   Regsitro aleatorio



Para seleccionar el drive de trabajo se sigue el siguiente formato: drive A
= 1; drive B = 2; etc. Si se utiliza 0 se tomar como opcin el drive que se
est utilizando en ese momento.

El nombre del archivo debe estar justificado a la izquierda y en caso de ser
necesario se debern rellenar los bytes sobrantes con espacios, la extensin
del archivo se coloca de la misma forma.

El bloque actual y el registro actual le dicen a la computadora que registro
ser accesado en operaciones de lectura o escritura. Un bloque es un grupo
de 128 registros. El primer bloque del archivo es el bloque 0. El primer
registro es el registro 0, por lo tanto el ltimo registro del primer bloque
ser'a 127, ya que la numeracin inici con 0 y el bloque puede contener 128
registros en total.



                                      Derechos Reservados.1995                                    104




                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Abrir archivos



Para abrir un archivo FCB se utiliza la interrupcin 21H, funcin 0FH. La
unidad, el nombre y extensin del archivo deben ser inicializados antes de
abrirlo.

El registro DX debe apuntar al bloque. Si al llamar a la interrupcin sta
regresa valor de FFH en el registro AH es que el archivo no se encontr, si
todo sali bien se devolvera un valor de 0.

Si se abre el archivo DOS inicializa el bloque actual a 0, el tamao del
registro a 128 bytes y el tamao del mismo y su fecha se llenan con los
datos encontrados en el directorio.



Crear un archivo nuevo



Para la creacin de archivos se utiliza la interrupcin 21H funcin 16H .

DX debe apuntar a una estructura de control cuyos requisitos son que al
menos se encuentre definida la unidad lgica, el nombre y la extensin del
archivo.

En caso de existir algun problema se devolver el valor FFH en AL, de lo
contrario este registro contendr el valor de 0.


                                       Derechos Reservados.1995                                    105




                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Escritura secuencial



Antes de que podamos realizar escrituras al disco es necesario definir el
rea de transferencia de datos utilizando para tal fin la funcin 1AH de la
interrupcin 21H.

La funcin 1AH no regresa ningn estado del disco ni de la operacin, pero
la funcin 15H, que es la que usaremos para escribir al disco, si lo hace en
el registro AL, si ste es igual a cero no hubo error y se actualizan los
campos del registro actual y bloque.



Lectura secuencial



Antes que nada debemos definir el rea de transferencia de archivos o DTA.

Para leer secuencialmente utilizamos la funcin 14H de la int 21H.

El registro a ser leido es el que se encuentra definido por el bloque y el
registro actual. El registro AL regresa el estado de la operacin, si AL
contiene el valor de 1 o 3 es que hemos llegado al final del archivo. Un
resultado de 2 significa que el FCB est mal estructurado.

En caso de no existir error AL contendr el valor de 0 y los campos bloque
actual y registro actual son actualizados.



                                       Derechos Reservados.1995                                    106



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



Lectura y escritura aleatoria


La funcin 21H y la funcin 22H de la interrupcin 21H son las encargadas de
realizar las lecturas y escrituras aleatorias respectivamente.

El nmero de registro aleatorio y el bloque actual son usados para calcular
la posicin relativa del registro a leer o escribir.

El registro AL regresa la misma informacin que para lectura o escritura
secuencial. La informacin que ser le'da se regresar en el rea de
transferencia de disco, as' mismo la informacin que ser escrita reside en
el DTA.



Cerrar un archivo


Para cerrar un archivo utilizamos la funcin 10H de la interrupcin 21H.

Si despus de invocarse esta funcin el registro AL contiene el valor de FFH
significa que el archivo ha cambiado de posicin, se cambi el disco o hay
un error de acceso al disco.



Trabajando con handles


El uso de handles para manejar los archivos facilita en gran medida la
creacin de archivos y el programador puede concentrarse en otros aspectos
de la programacin sin preocuparse en detalles que pueden ser manejados por
el sistema operativo.
                                       Derechos Reservados.1995                                    107


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin



La facilidad en el uso de los handles consiste en que para operar sobre un
archivo unicamente es necesario definir el nombre del mismo y el nmero del
handle a utilizar, toda la dems informacin es manejada internamente por el
DOS.

Cuando utilizamos este mtodo para trabajar con archivos no existe una
distincin entre accesos secuenciales o aleatorios, el archivo es tomado
simplemente como una cadena de bytes.



Funciones para utilizar handles



Las funciones utilizadas para el manejo de archivos por medio de handles son
descritas en la unidad 6: Interrupciones, en la seccin dedicada a la
interrupcin 21H.














                                       Derechos Reservados.1995                                    108




                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Macros y procedimientos


Procedimientos.
     Definicin de procedimiento
     Sintaxis de un procedimiento

Macros.
     Definicin de una macro
     Sintaxis de una macro
     Bibliotecas de macros



Definicin de procedimiento



Un procedimiento es un conjunto de instrucciones a los que podemos dirigir
el flujo de nuestro programa, y una vez terminada la ejecucin de dichas
instrucciones se devuelve el control a la siguiente linea a procesar del
cdigo que mando llamar al procedimiento.

Los procedimientos nos ayudan a crear programas legibles y fciles de
modificar.

Al momento de invocar a un procedimiento se guarda en la pila la direccin
de la siguiente instruccin del programa para que, una vez transferido el
flujo del programa y terminado el procedimiento, se pueda regresar a la
linea siguiente del programa original (el que llam al procedimiento).



                                       Derechos Reservados.1995                                    109



                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.



Sintaxis de un procedimiento



Existen dos tipos de procedimientos, los intrasegmentos, que se encuentran
en el mismo segmento de instrucciones y los intersegmentos que pueden ser
almacenados en diferentes segmentos de memoria.

Cuando se utilizan los procedimientos intrasegmentos se almacena en la pila
el valor de IP y cuando se utilizan los intersegmentos se almacena el valor
CS:IP

Para desviar el flujo a un procedimiento (llamarlo) se utiliza la directiva:

CALL NombreDelProcedimiento

Las partes que componen a un procedimiento son:

 Declaracin del procedimiento
 Cdigo del procedimiento
 Directiva de regreso
 Terminacin del procedimiento

Por ejemplo, si queremos una rutina que nos sume dos bytes, almacenados en
AH y AL cada uno y guardar la suma en el registro BX:

 Suma Proc Near  ;Declaracin del procedimiento
   Mov Bx, 0     ;Contenido del procedimiento
   Mov Bl, Ah
   Mov Ah, 00
   Add Bx, Ax
   Ret           ;Directiva de regreso
 Suma Endp       ;Declaracin de final del procedimiento

                                       Derechos Reservados.1995                                    110


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


En la declaracin la primera palabra, Suma, corresponde al nombre de nuestro
procedimiento, Proc lo declara como tal y la palabra Near le indica al MASM
que el procedimiento es intrasegmento. La directiva Ret carga la direccin IP almacenada en la pila para regresar al programa original, por ltimo, la directiva Suma Endp indica el final del procedimiento.

Para declarar un procedimiento intersegmento sustituimos la palabra Near por
la palabra FAR.

El llamado de este procedimiento se realiza de la siguiente forma:

Call Suma

Las macros ofrecen una mayor flexibilidad en la programacin comparadas con
los procedimientos, pero no por ello se dejarn de utilizar estos ltimos.

Definicin de una macro

Una macro es un grupo de instrucciones repetitivas en un programa que se
codifican solo una vez y pueden utilizarse cuantas veces sea necesario.

La principal diferencia entre una macro y un procedimiento es que en la
macro se hace posible el paso de parmetros y en el procedimiento no (esto
es aplicable solo para el MASM, hay otros lenguajes de programacin que si
lo permiten). Al momento de ejecutarse la macro cada parmetro es sustituido
por el nombre o valor especificado al momento de llamarla.

Podemos decir entonces que un procedimiento es una extensin de un
determinado programa, mientras que la macro es un mdulo con funciones
espec'ficas que puede ser utilizado por diferentes programas.

 Otra diferencia entre una macro y un procedimiento es la forma de llamar a
cada uno, para llamar a un procedimiento se requiere el uso de una directiva, en cambio la llamada a las macros se realiza como si se tratara de una instruccin del ensamblador.
                                       Derechos Reservados.1995                                    111
 

                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.


Sintaxis de una macro


Las partes que componen a una macro son:

 Declaracin de la macro
 Cdigo de la macro
 Directiva de terminacin de la macro

La declaracin de la macro se lleva a cabo de la siguiente forma:

NombreMacro MACRO [parametro1, parametro2...]

Aunque se tiene la funcionalidad de los parametros es posible crear una
macro que no los necesite.

La directiva de terminacin de la macro es: ENDM

Un ejemplo de macro, para colocar el cursor en alguna posicin determinada
de la pantalla es:

 Posicion MACRO Fila, Columna
   PUSH AX
   PUSH BX
   PUSH DX
   MOV AH, 02H
   MOV DH, Fila
   MOV DL, Columna
   MOV BH, 0
   INT 10H
   POP DX
   POP BX
   POP AX
 ENDM

                                    Derechos Reservados.1995                                    112


                               UNIVERSIDAD DE GUADALAJARA

                    Coordinacin General de Sistemas de Informacin.

Para utilizar una macro solo es necesario llamarla por su nombre, como si
fuera una instruccin mas del ensamblador, ya no son necesarias las
directivas como en el caso de los procedimientos. Ejemplo:

Posicion 8, 6

Bibliotecas de macros

Una de las facilidades que ofrece el uso de las macros es la creacin de
bibliotecas, las cuales son grupos de macros que pueden ser incluidas en un
programa desde un archivo diferente.

La creacin de estas bibliotecas es muy sencilla, unicamente tenemos que
escribir un archivo con todas las macros que se necesitarn y guardarlo como
archivo de texto.

Para llamar a estas macros solo es necesario utilizar la instruccin Include
NombreDelArchivo, en la parte de nuestro programa donde escribiriamos
normalmente las macros, esto es, al principio de nuestro programa (antes de
la declaracin del modelo de memoria).

Suponiendo que se guard el archivo de las macros con el nombre de
MACROS.TXT la instruccin Include se utilizar'a de la siguiente forma:

   ;Inicio del programa
 Include MACROS.TXT
 .MODEL SMALL
 .DATA
   ;Aqui van los datos
 .CODE
 Inicio:
   ;Aqui se inserta el cdigo del programa
 .STACK
   ;Se define la pila
 End Inicio
   ;Termina nuestro programa
                                    Derechos Reservados.1995                                    113


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.


Ejemplos:

Desplegar un mensaje en pantalla


Uno de los programas ms sencillos, pero en cierta forma prctico, es uno
que despliegue una cadena de caracteres en la pantalla. Eso es lo que hace
el siguiente programa:

Programa :



 ; Primero definimos el modelo de memoria, en este caso small
 .MODEL SMALL
 .CODE                ; Declaramos el rea que contendr el cdigo
 Inicio:              ; Etiqueta de inicio del programa:
 MOV AX,@DATA         ; Vamos a colocar la direccin del segmento de datos
 MOV DS,AX            ;  en DS, usando como intermediario a AX
 MOV DX,OFFSET Cadena ; Colocamos en DX la direccin, dentro del
                      ;  segmento, de la cadena a desplegar
 MOV AH,09            ; Utilizaremos la funcin 09 de la interrupcin
 INT 21H              ;  21H para desplegar la cadena.
 MOV AH,4CH           ; Por medio de la funcin 4CH de la interrupcin
 INT 21H              ;  21H terminaremos nuestro programa
 .DATA                ; Declaramos el semento de datos
 Cadena DB 'Mensaje del programa.$' ; Cadena a desplegar
 .STACK               ; Declaramos la pila
 END Inicio           ; Final de nuestro programa


Ya se explic en el tutorial un programa casi igual a este, por lo tanto no
requiere ningn comentario adicional.


                                    Derechos Reservados.1995                                    114


                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.




Cuando se crea un programa no es necesario escribir los comentarios que van
despues de las comillas, sin embargo es una tcnica recomendable para que en
caso de errores o mejoras al cdigo sea ms sencillo encontrar la parte
deseada.

Para ensamblar este programa primero se guarda en formato ASCII con un
nombre vlido, por ejemplo: program1.asm

Para ensamblarlo se utiliza el MASM, el comando de ensamble es: masm
program1;

Para enlazarlo y hacerlo ejecutable tecleamos: link program1;

Una vez terminados estos pasos es posible ejecutarlo tecleando: program1
[Enter]

Para utilizar el programa directamente en su computadora guarde este archivo
como ASCII o texto, llvelo a su PC, con algun editor elimine todos estos
comentarios y los comentarios del principio y ensmblelo.





Desplegar nmeros hexadecimales del 15 al 0



Este programa despliega los 16 caracteres correspondientes al cdigo
hexadecimal en orden descendente.


                                    Derechos Reservados.1995                                    115



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.
Programa:
 ; Inicio del programa, definimos el modelo de memoria a usar y el segmento
 ; de cdigo
 .MODEL SMALL          ; Modelo de memoria
 .CODE                 ; Area de cdigo
 Inicio:               ; Etiqueta de inicio del programa
 MOV AX,@DATA          ; Inicializa el registro DS con la direccin dada
 MOV DS,AX             ;  por @DATA (Segmento de datos).
 MOV DX, OFFSET Titulo ; Obtiene la direccin de la cadena de caracteres
 MOV AH,09             ; Usamos la funcin 09H de la interrupcin 21H
 INT 21H               ;  para desplegar la cadena cuya direccin obtuvimos.
 MOV CX,16             ; Contador de caracteres que se mostrarn
 MOV BX, OFFSET Cadena ; Permite acceso a la cadena donde se encuentran los
                       ;  valores a desplegar
 Ciclo:                ; Etiqueta para generar un ciclo
 MOV AL,CL             ; Coloca en AL el nmero a traducir y lo traduce
 XLAT                  ; usando la instruccin XLAT
 MOV DL,AL             ; Coloca en DL el valor a ser desplegado por medio de la
 MOV AH,02             ;  funcin 2 de la interrupcin 21H
 INT 21H               ; Despliega el caracter
 MOV DL,10             ; Salta una linea desplegando el caracter 10
 INT 21H               ; Despliega el caracter
 MOV DL,13             ; Produce un retorno de carro desplegando el caracter 13
 INT 21H               ; Despliega el retorno de carro
 LOOP Ciclo            ; Decrementa en uno a CX y brinca a la etiqueta Ciclo
                       ;  siempre y cuando CX no sea igual a cero
 MOV AH,4C             ; Utiliza la funcin 4C de la interrupcin 21H para
 INT 21H               ; finalizar el programa

 ; Inicio del segmento de datos
 .DATA                 ;Define el segmento de datos
 Titulo DB 13,10,'Desplegar los nmeros hexadecimales del 15 al 1'
   DB 13,10,'$'        ; Cadena a desplegar al inicio del programa
 Cadena DB '0123456789ABCDEF'  ; Cadena con los d'gitos hexadecimales
 ; Declaracin del segmento de la pila
 .STACK
 END Inicio            ;Declaracin del final del programa
                                    Derechos Reservados.1995                                    116
     
 
                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.


    El comando XLAT busca la cadena o tabla localizada en BX, el registro
     AL contiene el nmero de bytes, a partir de la direccin de inicio, que
     se recorrer el apuntador para buscar un dato, el contenido de AL es
     remplazado por el byte donde se encuentra el apuntador.

     El proceso de ensamblado es igual al del ejemplo anterior.
    
    

    

   Operaciones bsicas


En el siguiente ejemplo se utilizan la mayor parte de las instrucciones
vistas en el tutorial, su objetivo es realizar las operaciones de suma,
resta, multiplicacin o divisin de dos cantidades.

Para accesar a cada una de las opciones disponibles se hace uso de un men
en el que se presentan las operaciones disponibles.

Programa:


 .MODEL SMALL             ; Define el modelo de memoria
 .DATA                    ; Define el segmentos de datos

 ErrorCAP DB 0            ;Bandera de error en la captura de las cantidades
 Cantidad DB 0            ;Cantidad sobre la que se opera. Si es 0 la cantidad
                          ; ser la 1, y si es 1 ser la 2.
 CantUnoR DW 0            ;Guardar la cantidad 1 convertida en binario
 CantDosR DW 0            ;Guardar la cantidad 2 convertida en binario
 CantUnoN DB 6,0,6 DUP(?) ;Variable que almacena la cantidad 1
 CantDosN DB 6,0,6 DUP(?) ;Variable que almacena la cantidad 2

                                   Derechos Reservados.1995                                    117

 
                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



 Funcion  DB 0            ;Variable que almacena la opcin a realizar
 Resulta  DB 13,10,'Resultado: $'
 ResultaR DB 11 DUP(?)
 Mensaje  DB 13,10,'Operaciones bsicas entre dos nmeros'
          DB 13,10,13,10,'$'
 Pregunta DB 13,10,'Presione: ',13,10
          DB ' 1  Multiplicacin ',13,10
          DB ' 2  Divisin ',13,10
          DB ' 3  Suma ',13,10
          DB ' 4  Resta ',13,10
          DB ' 5  Salir ',13,10,'$'
 Error    DB 7,13,10,'Seleccin invlida (1-5)',13,10,'$'
 Error1   DB 7,13,10,'Cantidad 1 invlida.          ',13,10,'$'
 Error2   DB 7,13,10,'Cantidad 2 invlida.          ',13,10,'$'
 Error3   DB 7,13,10,'Cantidad fuera de rango (65535)      ',13,10,'$'
 Error4   DB 7,13,10,'Intento de divisin por cero. ',13,10,'$'
 CantUnoM DB 13,10,'Introduzca la cantidad 1 (Menor a 65535): $'
 CantDosM DB 13,10,'Introduzca la cantidad 2 (Menor a 65535): $'

 ; Tabla de potencias para conversin binaria/ASCII

 Potencia DW 0001h, 000Ah, 0064h, 03E8h, 2710h
 PotenciaF DW $

 .CODE                   ;Define el rea de cdigo
 Empieza:                ;Etiqueta de inicio del programa

   Mov AH, 0Fh             ;Obtiene modo de video actual
   Int 10h
   Mov AH, 00              ;Cambia el modo de video al mismo anterior
   Int 10h                 ; con la finalidad de que se borre la pantalla
   Mov AX, @Data           ;Obtiene la direccin del segmento de datos
   Mov Ds, Ax              ;Inicializa a DS con esa direccin
  
                                       Derechos Reservados.1995                                    118

 
                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



 Mov Dx, Offset Mensaje  ;Despliega el t'tulo del programa
   Call Imprime            ;Llama a un procedimiento
   Mov Si, Offset ResultaR ;Inicializa la variable ResultaR
   Add Si,11
   Mov Al,'$'
   Mov [Si], Al
 OTRA:
   Mov Dx,Offset Pregunta  ;Despliega men de opciones
   Call Imprime
   Call ObtenTecla         ;Espera a que se presione la opcin deseada
   Cmp Al, 49              ;Compara la seleccin con el d'gito 1 ASCII
   Jae SIGUE               ;Si la opcin es mayor a 1 brinca a SIGUE
   Mov Dx, Offset Error    ;Despliega mensaje de error
   Call Imprime
   Jmp OTRA                ;Brinca a OTRA para volver a preguntar
 SIGUE:
   Cmp Al,53               ;Compara la seleccin con el d'gito 5 ASCII
   Jbe TODOBIEN            ;Si es menor a 5 brinca a TODOBIEN, sino contina
   Mov Dx, Offset Error    ;Si la opcin fu mayor a 5 despiega el error
   Call Imprime
   Jmp OTRA
 TODOBIEN:
   Cmp Al,53               ;Compara la selecin con el d'gito 5 ASCII
   Jnz CHECATODO           ;Si no es igual brinca a CHECATODO
   Jmp FUNCION5            ;Si es igual brinca a FUNCION5 para terminar
 CHECATODO:
   Mov Funcion, Al         ;Guarda el nmero de funcin a realizar
 CAPCANT01:
   Mov Dx, Offset CantUnoM ;Mensaje de captura de la cantidad 1
   Call Imprime
   Mov Ah, 0Ah             ;Captura la cantidad (hasta 8 d'gitos)
   Mov Dx, Offset CantUnoN
   Int 21h
   
                                        Derechos Reservados.1995                                  119
 
  
                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



   Mov ErrorCAP, 0         ;Supone que no hay errores y que se est
   Mov Cantidad, 0         ; operando sobre la cantidad 1
   Call ConvNUM            ;Convierte cantidad 1 a binario
   Cmp ErrorCAP, 1         ;Verifica si hubo error
   Jz CAPCANT01            ;En caso afirmativo regresa a la captura.
   Mov CantUnoR, Bx        ;Guarda el resultado de la conversin
 CAPCANT02:
   Mov ErrorCAP, 0         ;Supone que no hay error
   Mov Cantidad, 1         ;Indica a ConvNUM que se trabajar con cantidad 2
   Mov Dx, Offset CantDosM ;Mensaje de captura de cantidad 2
   Call Imprime
   Mov Ah, 0Ah             ;Captura de la cantidad 2
   Mov Dx, Offset CantDosM
   Int 21H
   Call ConvNum            ;Convierte la cantidad 2 a binario
   Cmp ErrorCAP, 1         ;Verifica si existi algun error
   Jz, CAPCANT02           ;En caso afirmativo regresa a la captura
   Mov CantDosR, Bx        ;Almacena el valor binario de cantidad 2

 ;La siguiente parte es el proceso de seleccin de la operacin
 ;Que se realizara:

   Mov Al, Funcion         ;Carga en Al la funcin que seleccion el usuario
   Cmp Al, 31h             ;Revisa si es 1
   Jne FUNCION2            ;Si no es brinca a FUNCION2
   Call Multiplica         ;Multiplica las cantidades
   Jmp OTRA                ;Regresa al men principal

 FUNCION2:
   Cmp Al, 32h             ;Revisa si es 2
   Jne FUNCION3            ;Si no es brinca a FUNCION3
   Call Divide             ;Divide las cantidades
   Jmp OTRA

                                       Derechos Reservados.1995                                    120

  
                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.




 FUNCION3:
   Cmp Al, 33h             ;Revisa si es 3
   Jne FUNCION4            ;Si no es brinca a FUNCION4
   Call Suma               ;Suma las cantidades
   Jmp OTRA

 FUNCION4:
   Cmp Al, 34h             ;Revisa si es 4
   Jne FUNCION5            ;Si no es brinca a FUNCION5
   Call Resta              ;Resta las cantidades
   Jmp OTRA

 FUNCION5:
   Mov Ax, 4C00h           ;Esta funcin termina la ejecucin
   Int 21h                 ;del programa

 ; Procedimientos o rutinas del programa
 
 Multiplica Proc Near      ;Indicador de inicio de procedimiento
   Xor Dx, Dx              ;Dx = 0
   Mov Ax, CantUnoR        ;Primera cantidad
   Mov Bx, CantDosR        ;Segunda cantidad
   Mul Bx ;Multiplica
   Call ConvASCII          ;Convierte en ASCII
   Mov Dx, Offset Resulta  ;Imprime mensaje del resultado
   Call Imprime
   Mov Dx, Offset ResultaR ;Imprime resultado
   Call Imprime
   Ret                     ;Regresa al programa principal
 Multiplica Endp           ;Indicador de fin de procedimiento

 
                                      Derechos Reservados.1995                                    121



                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



Divide Proc Near
   Mov Ax, CantUnoR        ;Carga la cantidad 1 (dividendo)
   Mov Bx, CantDosR        ;Carga la cantidad 2 (divisor)
   Cmp Bx, 0               ;Revisa que el divisor no sea cero
   Jnz DIVIDE01            ;Si no es cero brinca a DIVIDE01
   Mov Cantidad, 3         ;Hubo error asi que despliega el mensaje y regresa al 
programa
   Call HuboError
   Ret
 DIVIDE01:
   Div Bx                  ;Efecta la divisin
   Xor Dx, Dx              ;Dx = 0. El residuo no es utilizado
   Call ConvASCII          ;Convierte en ASCII el resultado
   Mov Dx, Offset Resulta  ;Despliega el mensaje del resultado
   Call Imprime
   Mov Dx, Offset ResultaR ;Depliega el resultado
   Call Imprime
   Ret
 Divide Endp

 Suma Proc Near
   Xor Dx, Dx              ;Dx = 0 por si acaso existe acarreo
   Mov Ax, CantUnoR        ;Cantidad 1
   Mov Bx, CantDosR        ;Cantidad 2
   Add Ax, Bx              ;Realiza la suma
   Jnc SUMACONV            ;Si no existi acarreo brinca a SUMACONV
   Adc Dx,0                ;Si existi
 SUMACONV:
   Call ConvASCII          ;Convierte en ASCII el resultado
   Mov Dx, Offset Resulta  ;Despliega el mensaje del resultado
   Call Imprime
   Mov Dx, Offset ResultaR ;Despliega el resultado
  

                                      Derechos Reservados.1995                                    122


                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



 Call Imprime
   Ret
 Suma Endp

 Resta Proc Near
   Xor Dx, Dx              ;Dx = 0 por si existe acarreo
   Mov Ax, CantUnoR        ;Ax = cantidad 1
   Mov Bx, CantDosR        ;Bx = cantidad 2
   Sub Ax, Bx              ;Realiza la resta
   Jnc RESTACONV           ;Si no hay acarreo brinca a RESTACONV
   Sbb Dx,0                ;Si hay acarreo
 RESTACONV:
   Call ConvASCII          ;Convierte en ASCII el resultado
   Mov Dx, Offset Resulta  ;Despliega el mensaje del resultado
   Call Imprime
   Mov Dx, Offset ResultaR ;Despliega el resultado
   Call Imprime
   Ret
 Resta Endp

 Imprime Proc Near
   Mov Ah, 09              ;Utiliza la funcin 9 de la interrupcin
   Int 21h                 ;21h para desplegar una cadena
   Ret
 Imprime Endp

 ObtenTecla Proc Near
   Mov ah, 0               ;Utiliza la interrupcin 16h para
   Int 16h                 ; leer una tecla
   Ret
 ObtenTecla Endp



                                      Derechos Reservados.1995                                    123



                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



 ConvNum Proc Near
   Mov Dx, 0Ah                 ;Multiplicador es 10
   Cmp Cantidad, 0             ;Verifica si es la cantidad 1
   Jnz CONVNUM01               ;No fu, entonces es cantidad 2 y brinca
   Mov Di, Offset CantUnoN + 1 ;Bytes leidos en la cantidad 1
   Mov Cx, [Di]
   Mov Si, Offset CantUnoN + 2 ;La cantidad 1
   Jmp CONVNUM02
 CONVNUM01:
   Mov Di, Offset CantDosN + 1 ;Bytes leidos de la cantidad 2
   Mov Cx, [Di]
   Mov Si, Offset CantDosN + 2 ;La cantidad 2
 CONVNUM02:
   Xor Ch, Ch ;CH = 0
   Mov Di, Offset Potencia     ;Direccin de la tabla de potencias
   Dec Si
   Add Si, Cx
   Xor Bx, Bx
   Std
 CONVNUM3:
   Lodsb                   ;Carga en AL el byte cuya direccin es DS:SI
   Cmp Al, "0"             ;Compara el byte con el d'gito 0
   Jb CONVNUM04            ;Si es menor es invlido y brinca
   Cmp Al, "9"             ;Compara el byte con el d'gito 9
   Ja CONVNUM04            ;Si es mayor es invlido y brinca
   Sub Al, 30h             ;Convierte el d'gito de ASCII a binario
   Cbw                     ;Convierte a palabra
   Mov Dx, [Di]            ;Obtiene la potencia a ser usada para multiplicar
   Mul Dx                  ;Multiplica el nmero
   Jc CONVNUM05            ;Si hay acarreo brinca (fu mayor a 65535)
   Add Bx, Ax              ;Suma el resultado a BX
 

                                       Derechos Reservados.1995                                    124



                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



  Jc CONVNUM05            ;Si hay acarreo brinca
   Add Di, 2               ;Va a la siguiente potencia de 10
   Loop CONVNUM03          ;Brinca hasta que CX sea igual a 0
   Jmp CONVNUM06
 CONVNUM04:
   Call HuboERROR          ;Hubo algun error, depliega mensaje
   Jmp CONVNUM06           ;Brinca a CONVNUM06
 CONVNUM05:
   Mov Cantidad, 2         ;Hubo acareo en la conversin, lo que
   Call HuboERROR          ; significa que la cantidad es mayor a 65535
 CONVNUM06:
   Cld                     ;Regresa la bandera de direccin a su estado
   Ret                     ; normal
 ConvNum Endp

 ConvASCII Proc Near
   Push Dx
   Push Ax                 ;Guarda el resultado en la pila
   Mov Si, Offset ResultaR ;Inicializa la variable ResultaR
   Mov Cx, 10              ; llenandola con asteriscos
   Mov Al, '*'
 ConvASCII01:
   Mov [Si], Al
   Inc Si
   Loop ConvASCII01
   Pop Ax
   Pop Bx
   Mov Bx, Ax              ;Palabra baja de la cantidad
   Mov Ax, Dx              ;Palabra alta de la cantidad
   Mov Si, Offset ResultaR ;Cadena donde se guarda el resultado
   Add Si, 11
   Mov Cx, 10              ;Divisor = 10

                                       Derechos Reservados.1995                                    125



                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



 OBTENDIGITO:
   Dec Si
   Xor Dx, Dx              ;DX contrendr el residuo
   Div Cx                  ;Divide la palabra alta
   Mov Di, Ax              ;Guarda cociente en DI
   Mov Ax, Bx              ;Carga palabra baja en AX
   Div Cx                  ;DX contiene registro de la divisin
   Mov Bx, Ax              ;Guarda el cociente
   Mov Ax, Di              ;Regresa la palabra alta
   Add Dl, 30h             ;Convierte residuo en ASCII
   Mov [Si], Dl            ;Lo almacena
   Or Ax, Ax               ;Si la palabra alta no es cero
   Jnz OBTENDIGITO         ; brinca a OBTENDIGITO
   Or Bx, Bx               ;Si la palabra baja no es cero
   Jnz OBTENDIGITO         ; brinca a OBTENDIGITO
   Ret
 ConvASCII Endp

 HuboERROR Proc Near
   Cmp Cantidad,0          ;Es la cantidad 1?
   Jnz HUBOERROR02         ;no
   Mov Dx, Offset Error1
   Call Imprime
   Mov ErrorCAP, 1         ;Enciende la bandera de error
   Jmp HUBOERROR05
 HUBOERROR02:
   Cmp Cantidad, 1         ;Es la cantidad 2?
   Jnz HUBOERROR03         ;no
   Mov Dx, Offset Error2
   Call Imprime
   Mov ErrorCAP, 1
 

                                       Derechos Reservados.1995                                    126 



                             UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sisyemas deInformacin.



  Jmp HUBOERROR05
 HUBOERROR03:
   Cmp Cantidad, 2         ;Es una cantidad fuera de rango?
   Jnz HUBOERROR04         ;no
   Mov Dx, Offset Error3
   Call Imprime
   Mov ErrorCAP, 1
   Jmp HUBOERROR05
 HUBOERROR04:
   Mov Dx, Offset Error4   ;Error de divisin por cero
   Call Imprime
   Mov ErrorCAP, 1
 HUBOERROR05:
   Ret
 HuboERROR Endp

 .STACK
 End Empieza














                                       Derechos Reservados.1995                                    127



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas de Informacin.


Directorio y bibliograf'a


Crditos

Ing. Mnico Briseo C.
     Idea original
Hugo Eduardo Prez P.
     Desarrollo e implementacin

Bibliograf'a

Lenguaje Ensamblador Para Microcomputadoras IBM
     J. Terry Godfrey
     Ed. Prentice Hall Hispanoamericana, S.A.
     Mxico

Ensamblador Bsico
     A. Rojas
     Ed. Computec Editores S.A. de C.V.
     Mxico

IBM Personal Computer Assembly Languaje Tutorial
     Joshua Auerbach
     Yale University









                                       Derechos Reservados.1995                                    128



                               UNIVERSIDAD DE GUADALAJARA

                   Coordinacin General de Sistemas deInformacin.


Necesitamos tu opinin!


Nuestra finalidad con este documento es llevar el conocimiento a tus manos.
Para hacerlo en una forma ms eficiente es necesario conocer tu opinin,
sugerencias y cr'ticas.

Nos gustar'a que nos mandaras tus programas escritos en ensamblador (En
cdigo fuente por favor!) para mostrarlos en este espacio, as' como para
darte el reconocimiento que mereces. Procura incluir todos tus datos: tu
nombre, domicilio, profesin y tu direccin electrnica (si la tienes), y la
versin de ensamblador que usas.

Manda tus programas y sugerencias relacionados con este tutorial a la
direccin huperez@rulfo.dca.udg.mx o si lo deseas manda tus comentarios
sobre el servidor en general a la direccin monico@redudg.udg.mx

Como informacin soy un alumno de la Universidad de Guadalajara, del
Departamento de Ciencias Computacionales. Estudio la carrera de Ingenier'a
en Computacin y me gustar'a aprender de ti. La primera direccin es mi
direccin personal, as' que sientete libre de mandar tus comentarios.













                                       Derechos Reservados.1995                                    129






























































































