UNIVERSIDAD DE GUADALAJARA

 

                              Coordinación General de Sistemas de Información.

 

 

 

 

 

DIRECTORIO

 

Dr. Víctor Manuel González Romero

Rector General de la Universidad de Guadalajara

 

Dr. Misael Gradilla Damy

Vicerrectoría Ejecutiva

 

M en C. Jeffrey Steven Fernández Rodríguez

Coordinador General de Sistemas de Información

 

Ing. Mónico Briseño Cortés

Responsable del servidor Gráfico

Cultura y Entretenimiento

 

Hugo Pérez Pérez

Autor del tutorial de Ensamblador

 

Ana María Peraza

Captura y revisión del texto

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                             Derechos Reservados 1995

 

 

                           UNIVERSIDAD DE GUADALAJARA

 

                  Coordinaci—n General de Sistemas de Informaci—n.

 

Introducci—n.

 

 El documento que est‡ visualizando tiene la funci—n primordial de introducirlo a la programaci—n en lenguaje Ensamblador, y est‡ pensado en aquellas personas que nunca han trabajado con este lenguaje y probablemente con ningœn 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 informaci—n en forma de unidades para permitir el f‡cil acceso a cada uno de los t—picos y facilitar el seguimiento del tutorial.

 

En la secci—n introductoria se mencionan algunos de los conceptos elementales acerca de los sistemas de c—mputo as' como del ensamblador mismo, y continœa con el tutorial propiamente dicho.

 

 

CONTENIDO:

 

Descripci—n b‡sica de un sistema de c—mputo...................................................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 b‡sicos...................................................................................7

 UNIDAD 2: Programaci—n en ensamblador.........................................................28

                    

 

 

                                       Derchos Reservados.1995                                      1

 

                         

                            UNIVERSIDAD DE GUADALAJARA

 

                  Coordinaci—n General de Sistemas de Informaci—n.

                          

 

Las instrucciones del ensamblador.

 

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

 

 UNIDAD 3: Instrucciones de operaci—n sobre datos.......................................41

 UNIDAD 4: Instrucciones l—gicas y aritmŽticas................................................50

 UNIDAD 5: Instrucciones para control de procesos........................................58

 

 

Interrupciones y manejo de archivos.

 

 UNIDAD 6: Interrupciones.........................................................................................74

 UNIDAD 7: Introducci—n al manejo de archivos..............................................102

 

 

Introducci—n a las macros.

 

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

 

 

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

 

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

 

Desplegar un mensaje en pantalla

Desplegar nœmeros hexadecimales del 15 al 0

Operaciones b‡sicas

 

 

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

 

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

 

                                   Derechos Reservados.1995                              2

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Descripci—n b‡sica de un sistema de c—mputo.

 

 

Esta secci—n tiene como finalidad dar una breve rese–a de las partes

principales de un sistema de c—mputo a un nivel b‡sico, que permita al

usuario un mayor entendimiento de los conceptos que se tratar‡n a lo largo

del tutorial.

 

   * Procesador Central

 

   * Memoria Central

 

   * Unidades de Entrada y Salida

 

   * Unidades de Memoria Auxiliar

 

 

Sistema de C—mputo.

 

Le llamamos sistema de c—mputo a la configuraci—n completa de una

computadora, incluyendo las unidades perifŽricas y la programaci—n de

sistemas que la hacen un aparato œtil y funcional para un fin determinado.

 

 

Procesador Central.

 

Esta parte es conocida tambiŽn como unidad central de procesamiento o UCP.

formada a su vez por la unidad de control y la unidad aritmŽtica y l—gica.

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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Estas celdas son conocidas con el nombre de registros. Un procesador puede tener una docena o dos de estos registros. La unidad aritmŽtica y l—gica de la UCP realiza las operaciones relacionadas con los c‡lculos numŽricos y simb—licos. T'picamente estas unidades s—lo tienen capacidad de efectuar operaciones muy elementales como: suma y resta de dos nœmeros de punto fijo, multiplicaci—n y divisi—n de punto fijo, manipulaci—n de bits de los registros y comparaci—n del contenido de dos registros.

 

Las computadoras personales pueden clasificarse por lo que se conoce como

tama–o 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 ejecuci—n de programas y el

almacenamiento de informaci—n para las operaciones.

 

Cada una de las celdas puede contener un valor numŽrico y tienen la

propiedad de ser direccionables, esto es, que se pueden distinguir una de

otra por medio de un nœmero œnico o direcci—n para cada celda.

 

El nombre genŽrico de estas memorias es Random Access Memory (Memoria de acceso aleatorio) o RAM por sus siglas en inglŽs. La principal desventaja de

este tipo de memoria es que los circuitos integrados pierden la informaci—n

que tienen almacenada cuando se interrumpe la alimentaci—n elŽctrica. Esto

llev— a la creaci—n de memorias cuya informaci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 visualizaci—n 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 informaci—n pr‡cticos y econ—micos. Adem‡s, la memoria central pierde su contenido al apagarse la m‡quina, por lo que no es conveniente utilizarla para almacenamiento permanente de datos.

 

Estos y otros incovenientes dan lugar a la creaci—n de unidades perifŽricas

de memoria que reciben el nombre de memoria auxiliar o secundaria. De estas

unidades perifŽricas las m‡s comunes son las cintas y los discos magnŽticos.

 

La informaci—n almacenada en estos medios magnŽticos recibe el nombre de

archivo. Un archivo est‡ formado por un nœmero variable de registros,

generalmente de tama–o fijo; los registros pueden contener datos o

programas.

 

 

 

                                       Derechos Reservados.1995                                      5

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinci—n General de Sistemasde Informaci—n.

 

 

Ventajas del Ensamblador

 

 

La primera raz—n para trabajar con ensamblador es que proporciona la

oportunidad de conocer m‡s a fondo la operaci—n de su PC, lo que permite el

desarrollo de software de una manera m‡s consistente.

 

La segunda raz—n es el control total de la PC que se tiene con el uso del

mismo.

 

Otra raz—n es que los programas de ensamblador son mas r‡pidos, m‡s

compactos y tienen mayor capacidad que los creados en otros lenguajes.

 

Por œltimo el ensamblador permite una optimizaci—n ideal en los programas

tanto en su tama–o como en su ejecuci—n.

 

 

 

Software

 

 

En terminos de computaci—n es todo aquel proceso o programa que utiliza los

recursos de la computadora para lograr el objetivo trazado por su dise–ador

o programador.

 

 

 

 

 

 

 

 

 

                                       Derechos Reservados.1995                                      6

 

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Conceptos b‡sicos

 

 

Informaci—n en las computadoras.

     Unidades de informaci—n

     Sistemas numŽricos

     Convertir nœmeros binarios a decimales

     Convertir nœmeros decimales a binarios

     Sistema Hexadecimal

 

MŽtodos de representaci—n de datos en una computadora.

     C—digo ASCII

     MŽtodo BCD

     Representaci—n de punto flotante

 

Trabajando con el lenguaje ensamblador.

     Proceso de creaci—n 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 informaci—n

 

 

 

Para que la PC pueda procesar la informaci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 peque–a de informaci—n 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 numŽricos

 

 

 

El sistema numŽrico que utilizamos a diario es el sistema decimal, pero este

sistema no es conveniente para las m‡quinas debido a que la informaci—n se

maneja codificada en forma de bits prendidos o apagados; esta forma de

codificaci—n nos lleva a la necesidad de conocer el c‡lculo posicional que

nos permita expresar un nœmero en cualquier base que lo necesitemos.

 

Es posible representar un nœmero determinado en cualquier base mediante la

siguiente formula:

 

 

 

 

Donde n es la posici—n 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 numŽrica empleada.

 

 

                                       Derechos Reservados.1995                                     8

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Convertir nœmeros binarios a decimales

 

 

 

Trabajando en el lenguaje ensamblador nos encontramos con la necesidad de

convertir nœmeros 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 conversi—n 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

posici—n 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 computaci—n como s'mbolo de potenciaci—n y el

caracter * se usa para representar la multiplicaci—n.

 

 

 

Convertir nœmeros decimales a binarios

 

 

Existen varios mŽtodos de conversi—n de nœmeros decimales a binarios; aqu'

solo se analizar‡ uno.

 

                                       Derechos Reservados.1995                                      9

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Naturalmente es mucho mas f‡cil una conversi—n 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 mŽtodo que se explicar‡ utiliza la divisi—n sucesiva entre dos, guardando

el residuo como d'gito binario y el resultado como la siguiente cantidad a

dividir.

 

Tomemos como ejemplo el nœmero 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 nœmero 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 nœmeros 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

La conversi—n entre numeraci—n binaria y hexadecimal es sencilla. Lo primero

que se hace para una conversi—n de un nœmero 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 nœmero 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

 

DespuŽs tomamos cada grupo como un nœmero independiente y consideramos su

valor en decimal:

 

0010 = 2; 1011 = 11

 

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

 

2BH (Donde la H representa la base hexadecimal)

 

Para convertir un nœmero 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 nœmero.

 

 

 

                                       Derechos Reservados.1995                                      11

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

C—digo ASCII

 

 

 

ASCII generalmente se pronuncia "aski", es un acr—nimo de American Standard

Code for Information Interchange.

 

Este c—digo asigna a las letras del alfabeto, a los d'gitos decimales del 0

al 9 y a varios s'mbolos adicionales un nœmero binario de 7 bits (poniŽndose

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 mŽtodo de representaci—n de datos es muy

ineficiente en el aspecto numŽrico, ya que en formato binario nos basta un

solo byte para representar numeros de 0 a 255, en cambio con el c—digo ASCII

un byte puede representar unicamente un d'gito.

 

Debido a esta ineficiencia, el c—digo ASCII es principalmente utilizado en

la memoria para representar texto.

 

 

 

Metodo BCD

 

 

 

BCD es un acr—nimo de Binary Coded Decimal.

 

En esta notaci—n se utilizan grupos de 4 bits para representar cada d'gito

decimal del 0 al 9. Con este mŽtodo podemos representar dos d'gitos por byte

de informaci—n.

 

                                       Derechos Reservados.1995                                      12

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Aœn cuando este mŽtodo es mucho mas pr‡ctico para representaci—n de nœmeros en la memoria en comparaci—n al ASCII, todav'a se queda por debajo del binario, ya que con un byte en el mŽtodo 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 nœmeros muy

grandes en aplicaciones mercantiles ya que facilita las operaciones con los

mismos evitando errores de redondeo.

 

 

Representaci—n de punto flotante

 

 

Esta representaci—n esta basada en la notaci—n cient'fica, esto es,

representar un nœmero en dos partes: su mantisa y su exponente.

 

Poniendo como ejemplo el nœmero 1234000, podemos representarlo como

1.123*10^6, en esta œltima notaci—n el exponente nos indica el nœmero 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 nœmero

de espacios que hay que recorrer el punto decimal hacia la izquierda para

obtener el original.

 

 

Proceso de creaci—n de un programa

 

 

Para la creaci—n de un programa es necesario seguir cinco pasos: Dise–o del

algoritmo, codificaci—n del mismo, su traducci—n a lenguaje m‡quina, la

prueba del programa y la depuraci—n.

 

 

                                      Derechos Reservados.1995                                      13

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 En la etapa de dise–o se plantea el problema a resolver y se propone

la mejor soluci—n, creando diagramas esquem‡ticos utilizados para el mejor

planteamiento de la soluci—n.

 

 La codificaci—n del programa consiste en escribir el programa en

algœn lenguaje de programaci—n; en este caso espec'fico en ensamblador,

tomando como base la soluci—n propuesta en el paso anterior.

 

 La traducci—n al lenguaje m‡quina es la creaci—n 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 eliminaci—n de las fallas detectadas en el

programa durante la fase de prueba. La correcci—n de una falla normalmente

requiere la repetici—n 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 secci—n 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 m‡quina con estas

caracteristicas.

 

Debug solo puede crear archivos con extensi—n .COM, y por las

caracter'sticas de este tipo de programas no pueden ser mayores de 64 kb,

adem‡s deben comenzar en el desplazamiento, offset, o direcci—n de memoria

0100H dentro del segmento espec'fico.

 

 

 

                                      Derechos Reservados.1995                                      14

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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

tambiŽn 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 c—digo

 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 instrucci—n

 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

En la siguiente linea aparecera un gui—n, Ž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 instrucci—n 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 continuaci—n [Enter], o se puede

dejar el valor anterior presionando [Enter] sin telclear ningœn 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 continuaci—n describe el valor de cada bit, tanto apagado como prendido y

su relaci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 c—digo constan de dos partes, la

primera es el nombre de la instrucci—n que se va a ejecutar y la segunda son

los par‡metros del comando u operandos. Por ejemplo:

 

add ah bh

 

Aqu' "add" es el comando a ejecutar (en este caso una adici—n) y tanto "ah"

como "bh" son los par‡metros.

 

                                     Derechos Reservados.1995                                      17

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

El nombre de las instrucciones en este lenguaje esta formado por dos, tres o

cuatro letras. a estas instrucciones tambien se les llama nombres mnem—nicos

o c—digos de operaci—n, ya que representan alguna funci—n que habr‡ de

realizar el procesador.

 

Existen algunos comandos que no requieren parametros para su operaci—n, as'

como otros que requieren solo un par‡metro.

 

Algunas veces se utilizar‡n las instrucciones como sigue:

 

add al,[170]

 

Los corchetes en el segundo par‡metro nos indican que vamos a trabajar con

el contenido de la casilla de memoria nœmero 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 direcci—n

donde se desea que se inicie el ensamblado.

 

 

                                     Derechos Reservados.1995                                      18

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 extensi—n .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 nœmeros, n—tese que los primeros cuatro

d'gitos (en sistema hexagesimal) pueden ser diferentes, pero los œltimos

cuatro deben ser 0100, ya que es la direcci—n 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 terminaci—n 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 instrucci—n de ensamblador, es

una llamada a una interrupci—n del sistema operativo, estas interrupciones

ser‡n tratadas mas a fondo en un cap'tulo posterior, por el momento solo es

necesario saber que nos ahorran un gran nœmero de lineas y son muy œtiles

para accesar a funciones del sistema operativo.

 

 

                                       Derechos Reservados.1995                                      19

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 par‡metro para "g" la direcci—n donde queremos que termine la ejecuci—n y muestre los valores de los registros, en este caso ser'a: g108, esta

instrucci—n ejecuta el programa, se detiene en la direcci—n 108 y muestra

los contenidos de los registros.

 

TambiŽn se puede llevar un seguimiento de lo que pasa en los registros

utilizando el comando "t" (trace), la funci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Guardar y cargar los programas

 

 

No ser'a pr‡ctico 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 direcci—n final de la

 direcci—n inicial, naturalmente en sistema hexadecimal. Darle un nombre al               programa y extensi—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Para obtener la longitud de un programa se utiliza el comando "h", el cual

nos muestra la suma y resta de dos nœmeros en hexadecimal. Para obtener la

longitud del nuestro le proporcionamos como par‡metros el valor de la

direcci—n final de nuestro programa (10A) y el valor de la direcci—n inicial

(100). El primer resultado que nos muestra el comando es la suma de los

par‡metros 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 tama–o del archivo con "h", en este caso 000a, ya que nos

interesa el resultado de la resta de la direcci—n inicial a la direcci—n

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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

El œltimo comando, "u", se utiliza para verificar que el programa se carg—

en memoria, lo que hace es desensamblar el c—digo y mostrarlo ya

desensamblado. Los par‡metros le indican a Debug desde donde y hasta donde

desensamblar.

 

Debug siempre carga los programas en memoria en la direcci—n 100H, a menos

que se le indique alguna otra.

 

 

Condiciones, ciclos y bifurcaciones

 

 

 

Estas estructuras, o formas de control le dan a la m‡quina un cierto grado

de desici—n basado en la informaci—n 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 nœmero

determinado de veces una cadena de caracteres en la pantalla.

 

- a100

0C1B:0100 jmp 125 ; brinca a la direcci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Por medio del comando "e" es posible introducir una cadena de caracteres en

una determinada localidad de memoria, dada como par‡metro, 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

interrupci—n 21 utiliza el valor almacenado en el registro AH para ejecutar

una determinada funci—n, en este caso mostrar la cadena en pantalla, la

cadena que muestra es la que est‡ almacenada en el registro DX. La instrucci—n 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 par‡metro, lo cual crea un ciclo que se repite el nœmero de veces especificado por el valor de CX. La interrupci—n 20 termina la ejecuci—n del programa.

 

Otra forma de realizar la misma funci—n pero sin utilizar el comando LOOP es

la siguiente:

 

- a100

0C1B:0100 jmp 125 ; brinca a la direcci—n 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 instrucci—n "DEC" se disminuye su valor en 1. La instrucci—n

"JNZ" verifica si el valor de B es diferente a 0, esto con base en la

bandera NZ, en caso afirmativo brinca hacia la direcci—n 012D. En caso

contrario continœa la ejecuci—n normal del programa y por lo tanto se

termina.

                                     Derechos Reservados.1995                                       24

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Una œtima variante del programa es utilizando de nuevo a CX como contador,

pero en lugar de utilizar LOOP utilizaremos decrementos a CX y comparaci—n

de CX a 0.

 

- a100

0C1B:0100 jmp 125 ; brinca a la direcci—n 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 instrucci—n JCXZ para controlar la condici—n de

salto, el significado de tal funci—n es: brinca si CX=0

 

El tipo de control a utilizar depender‡ de las necesidades de programaci—n

en determinado momento.

 

 

 

Interrupciones

 

 

 

Definici—n de interrupci—n:

     Una interrupci—n es una instrucci—n que detiene la ejecuci—n 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

     aplicaci—n anterior.

                                     Derechos Reservados.1995                                       25

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 aplicaci—n que estabamos utilizando para permitir

el uso del procesador al manejo de la informaci—n que est‡ llegando en ese

momento. Una vez terminada la transferencia de informaci—n se reanudan las

funciones normales del procesador de palabras.

 

Las interrupciones ocurren muy seguido, sencillamente la interrupci—n 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 aplicaci—n en proceso.

 

En los programas anteriores hicimos uso de la interrupcion nœmero 20H para

terminar la ejecuci—n de nuestros programas, ahora utilizaremos otra

interrupci—n para mostrar informaci—n 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 interrupci—n 21H manda al monitor la cadena localizada

en la direcci—n a la que apunta el registro DX.

 

                                   Derechos Reservados.1995                                       26

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

El valor que se le da a AH determina cual de las opciones de la interrupci—n

21H sera utilizada, ya que esta interrupci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Programaci—n en ensamblador

 

 

Requerimientos para la programaci—n en ensamblador.

     Software necesario.

     Utilizaci—n del MASM

     Uso del enlazador (linker)

 

Formato de un programa en ensamblador.

     Formato interno

     Formato externo

     Ejemplo pr‡ctico de un programa

 

Proceso de ensamblado.

     Segmentos

     Tabla de s'mbolos

 

Tipos de instrucciones.

     Movimiento de datos

     Operaciones l—gicas y aritmŽticas

     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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 comœn, y como enlazador utilizaremos el programa link.

 

La extensi—n 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 extensi—n .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 combinaci—n de varios de estos archivos, un programa executable,

cuya extensi—n es usualmente .EXE aunque tambiŽn puede ser .COM, dependiendo de la forma en que se ensambl—.

 

Este tutorial describe la forma de trabajar con la versi—n 5.0 o posterior

del MASM, la diferencia principal de esta versi—n con otras anteriores es la

forma en que se declaran los segmentos de c—digo, datos y la pila, pero la

estructura de programaci—n es la misma.

 

 

 

Utilizaci—n del MASM

 

 

 

Una vez que se cre— el programa objeto se debe pasar al MASM para crear el

c—digo intermedio, el cual queda guardado en un archivo con extensi—n .OBJ.

El comando para realizar esto es:

 

MASM Nombre_Archivo; [Enter]

 

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

 

                                        Derechos Reservados.1995                                     29

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

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 informaci—n que puede proporcionar el traductor.

 

Es posible ejecutar el MASM utilizando par‡metros 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

par‡metros al MASM:

 

Todo par‡metro va despues del simbolo "/". Es posible utilizar varios

par‡metros a la vez. Una vez tecleados todos los par‡metros 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 c—digo

ejecutable.

 

La utilizaci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Donde Nombre_Archivo es el nombre del programa intermedio (OBJ). Esto

generara directamente un archivo con el nombre del programa intermedio y la

extensi—n .EXE

 

 

 

 

Formato interno de un programa

 

 

 

Para poder comunicarnos en cualquier lenguaje, incluyendo los lenguajes de

programaci—n, 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 c—digo 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 algœn simbolo especial.

 

 Directiva o instrucci—n: es el nombre con el que se conoce a la

instrucci—n 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 dep—sito del resultado

de alguna operaci—n; 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 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 instrucci—n "MOV", y los operandos "AX" como destino y "001A"

como fuente, ademas del comentario que sigue despues del ";".

 

Un ejemplo de una declaraci—n 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

instrucci—n es necesario darle cierta informaci—n 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

c—digo.

 

                                      Derechos Reservados.1995                                     32

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

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 interrupci—n 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 continuaci—n 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 instrucci—n END Programa marca el final del

programa.

 

 

Ejemplo pr‡ctico 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 c—digo del programa y en donde

comienzan las instrucciones.

 

A continuaci—n 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 nœmero 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 direcci—n donde se encuentra la cadena de caracteres en el segmento de datos. Luego utiliza la opci—n 9 (Dada por el valor de AH) de la interrupci—n 21H para desplegar la cadena posicionada en la direcci—n que contiene DX. Por œltimo utiliza la opci—n 4CH de la interrupci—n 21H para terminar la ejecuci—n del programa (aunque cargamos al registro AX el valor 4C00H la interrupci—n 21H solo toma como opci—n el contenido del registro AH).

 

La directiva .DATA le indica al ensamblador que lo que est‡ escrito a

continuaci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Segmentos

 

 

 

La arquitectura de los procesadores x86 obliga al uso de segmentos de

memoria para manejar la informaci—n, el tama–o de estos segmentos es de

64kb.

 

La raz—n de ser de estos segmentos es que, considerando que el tama–o m‡ximo de un nœmero que puede manejar el procesador esta dado por una palabra de 16 bits o registro, no ser'a posible accesar a m‡s 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 direcci—n en un registro exclusivo para localizar cada segmento, y entonces cada direcci—n 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, m‡s memoria de la que veremos

instalada en una PC.

 

Para que el ensamblador pueda manejar los datos es necesario que cada dato o

instrucci—n se encuentren localizados en el ‡rea que corresponde a sus

respectivos segmentos. El ensamblador accesa a esta informaci—n tomando en

cuenta la localizaci—n del segmento, dada por los registros DS, ES, SS y CS,

y dentro de dicho registro la direcci—n 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 nœmero, 1CB0, corresponde al segmento de memoria que se est‡ utilizando, el segundo se refiere la la direcci—n dentro de dicho

segmento, y a continuaci—n aparecen las instrucciones que se almacenaran a

partir de esa direcci—n.

 

                                      Derechos Reservados.1995                                     35

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

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 tama–o de los segmentos tomando como base el nœmero de bytes que necesita cada instrucci—n 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 c—digo en ensamblador se le conoce

como token, por ejemplo en la linea de c—digo

 

MOV AX,Var

 

tenemos tres tokens, la instrucci—n MOV, el operando AX, y el operando VAR.

El ensamblador lo que hace para generar el c—digo 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 mnem—nicos que utilizamos como instrucciones.

 

Siguiendo este proceso, el ensamblador lee MOV, lo busca en su tabla y al

encontrarlo lo identifica como una instrucci—n 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 direcci—n en memoria y el tipo de datos que contiene.

 

 

                                     Derechos Reservados.1995                                     36

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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

acci—n 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 continuaci—n.

 

 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 localizaci—n de los

datos.

 

Para mover los datos tambien existen las estructuras llamadas pilas, en este

tipo de estructuras los datos se introducen con la instrucci—n push y se

extraen con la instrucci—n 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 comunicaci—n con dispositivos externos se utilizan el comando out

para mandar informaci—n a un puerto y el comando in para leer informaci—n

recibida desde algun puerto.

 

La sintaxis del comando out es:

 

OUT DX,AX

 

                                    Derechos Reservados.1995                                     38

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Donde DX contiene el valor del puerto que se utilizar‡ para la comunicaci—n

y AX contiene la informaci—n que se mandar‡.

 

La sintaxis del comando in es:

 

IN AX,DX

 

Donde AX es el registro donde se guardar‡ la informaci—n que llegue y DX

contiene la direcci—n del puerto por donde llegar‡ la informaci—n.

 

 

 

Operaciones l—gicas y aritmŽticas

 

 

 

Las instrucciones de las operaciones l—gicas 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 comparaci—n est‡n basadas en la informaci—n

contenida en el registro de banderas. Normalmente las banderas de este

registro que pueden ser directamente manipuladas por el programador son la

bandera de direcci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Saltos, ciclos y procedimientos

 

 

Los saltos incondicionales en un programa escrito en lenguaje ensamblador

est‡n dados por la instrucci—n jmp, un salto es alterar el flujo de la

ejecuci—n de un programa enviando el control a la direcci—n indicada.

 

Un ciclo, conocido tambien como iteraci—n, es la repetici—n de un proceso un

cierto nœmero de veces hasta que alguna condici—n se cumpla. En estos ciclos

se utilizan los brincos "condicionales" basados en el estado de las

banderas. Por ejemplo la instrucci—n jnz que salta solamente si el resultado

de una operaci—n es diferente de cero y la instrucci—n jz que salta si el

resultado de la operaci—n 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 instrucci—n 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 instrucci—n call es que se guarda

en la pila el registro IP y se carga la direcci—n del procedimiento en el

mismo registro, conociendo que IP contiene la localizaci—n de la siguiente

instrucci—n que ejecutara la UCP, entonces podemos darnos cuenta que se

desv'a el flujo del programa hacia la direcci—n 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 tambiŽn en la pila.

 

                                    Derechos Reservados.1995                                     40

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

Instrucciones de operaci—n sobre datos

 

 

Instrucciones de transferencia

 

Son utilizadas para mover los contenidos de los operandos. Cada instrucci—n

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

algœn 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

 

 

Instrucci—n MOV

 

Prop—sito: Transferencia de datos entre celdas de memoria, registros y

acumulador.

                                      Derechos Reservados.1995                                     41

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Sintaxis:

 

 

MOV Destino,Fuente

 

Donde Destino es el lugar a donde se mover‡n los datos y fuente es el lugar

donde se encuentran dichos datos.

 

Los diferentes movimientos de datos permitidos para esta instrucci—n 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 peque–o 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 ejecuci—n con la opci—n 4C de la interrupci—n

21h.

 

                                       Derechos Reservados.1995                                     42

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Instrucci—n MOVS (MOVSB) (MOVSW)

 

 

 

Prop—sito: 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 direcci—n 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.

 

 

 

Instrucci—n LODS (LODSB) (LODSW)

 

 

 

Prop—sito: Cargar cadenas de un byte o palabra al acumulador.

 

                                       Derechos Reservados.1995                                     43

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Sintaxis:

 

LODS

 

Esta instrucci—n toma la cadena que se encuentre en la direcci—n 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 direcci—n 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).

 

 

 

Instrucci—n LAHF

 

 

 

Prop—sito: Transfiere al registro AH el contenido de las banderas

 

Sintaxis:

 

LAHF

 

Esta instrucci—n es œtil para verificar el estado de las banderas durante la

ejecuci—n de nuestro programa.

 

 

                                       Derechos Reservados.1995                                     44

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

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.

 

 

 

Instrucci—n LDS

 

 

 

Prop—sito: 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 direcci—n mas grande es transferida a DS, o sea que se toma

como la direcci—n del segmento. La palabra asociada con la direcci—n menor

es la direcci—n del desplazamiento y se deposita en el registro se–alado

como destino.

 

 

 

Instrucci—n LEA

 

 

Prop—sito: Carga la direcci—n del operando fuente.

 

Sintaxis:

 

LEA destino, fuente

                                       Derechos Reservados.1995                                     45

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

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.

 

 

 

Instrucci—n LES

 

 

 

Prop—sito: 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 direcci—n mayor se interpreta como la

direcci—n del segmento y se coloca en ES. La palabra con la direcci—n menor

es la direcci—n del desplazamiento y se coloca en el registro especificado

en el par‡metro destino.

 

 

                                       Derechos Reservados.1995                                     46

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Instrucci—n POP

 

 

 

Prop—sito: Recupera un dato de la pila

 

Sintaxis:

 

POP destino

 

Esta instrucci—n 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 direcci—n 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 tama–o real de la pila.

 

 

 

Instrucci—n POPF

 

 

 

Prop—sito: 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

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

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 tama–o de la pila.

 

 

 

Instrucci—n PUSH

 

 

 

Prop—sito: Coloca una palabra en la pila.

 

Sintaxis:

 

PUSH fuente

 

La instrucci—n PUSH decrementa en dos el valor de SP y luego transfiere el

contenido del operando fuente a la nueva direcci—n resultante en el registro

reciŽn modificado.

 

                                       Derechos Reservados.1995                                     48

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

El decremento en la direcci—n se debe a que al agregar valores a la pila

Žsta crece de la direcci—n mayor a la direcci—n menor del segmento, por lo

tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el

tama–o de la pila en dos bytes, que es la œnica cantidad de informaci—n que

puede manejar la pila en cada entrada y salida de datos.

 

 

 

Instrucci—n PUSHF

 

 

 

Prop—sito: 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 direcci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

Instrucciones l—gicas y aritmŽticas

 

 

Instrucciones l—gicas.

 

Son utilizadas para realizar operaciones l—gicas sobre los operandos.

 

     AND

     NEG

     NOT

     OR

     TEST

     XOR

Instrucciones aritmŽticas.

 

Se usan para realizar operaciones aritmŽticas sobre los operandos.

 

     ADC

     ADD

     DIV

     IDIV

     MUL

     IMUL

     SBB

     SUB

 

 

 

Instrucci—n AND

 

 

 

Prop—sito: Realiza la conjunci—n de los operandos bit por bit.

 

 

                                       Derechos Reservados.1995                                      50

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Sintaxis:

 

AND destino, fuente

 

Con esta instrucci—n se lleva a cabo la operaci—n "y" l—gica de los dos

operandos:

 

 Fuente  Destino | Destino

 --------------------------

    1       1    |    1

    1       0    |    0

    0       1    |    0

    0       0    |    0

 

El resultado de la operaci—n se almacena en el operando destino.

 

 

 

Instrucci—n NEG

 

 

 

Prop—sito: Genera el complemento a 2

 

Sintaxis:

 

NEG destino

 

Esta instrucci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

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

 

 

 

Instrucci—n NOT

 

 

Prop—sito: Lleva a cabo la negaci—n bit por bit del operando destino.

 

Sintaxis:

 

NOT destino

 

El resultado se guarda en el mismo operando destino.

 

 

 

Instrucci—n OR

 

 

Prop—sito: OR inclusivo l—gico

 

Sintaxis:

 

OR destino, fuente

 

La instrucci—n OR lleva a cabo, bit por bit, la disyunci—n inclusiva l—gica

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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n TEST

 

 

 

Prop—sito: Comparar logicamente los operandos

 

Sintaxis:

 

TEST destino, fuente

 

Realiza una conjunci—n, bit por bit, de los operandos, pero a diferencia de

AND esta instrucci—n no coloca el resultado en el operando destino, solo

tiene efecto sobre el estado de las banderas.

 

 

 

Instrucci—n XOR

 

 

Prop—sito: OR exclusivo

 

Sintaxis:

 

XOR destino, fuente

 

Su funci—n es efectuar bit por bit la disyunci—n exclusiva l—gica 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

Instrucci—n ADC

 

 

Prop—sito: Adici—n 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.

 

 

 

Instrucci—n ADD

 

 

Prop—sito: Adici—n de los operandos.

 

Sintaxis:

 

ADD destino, fuente

 

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

 

 

 

Instrucci—n DIV

 

 

Prop—sito: Divisi—n sin signo

 

                                       Derechos Reservados.1995                                      54

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Sintaxis:

 

DIV fuente

 

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

instrucci—n.

 

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.

 

 

 

Instrucci—n IDIV

 

 

 

Prop—sito: Divisi—n con signo

 

Sintaxis:

 

IDIV fuente

 

Consiste basicamente en lo mismo que la instrucci—n DIV, solo que esta

œltima realiza la operaci—n con signo.

 

Para sus resultados utiliza los mismos registros que la instrucci—n DIV.

 

 

 

                                      Derechos Reservados.1995                                      55

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n MUL

 

 

 

Prop—sito: Multiplicaci—n sin signo

 

Sintaxis:

 

MUL fuente

 

El ensamblador asume que el multiplicando sera del mismo tama–o 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 multiplicaci—n con valores de 8 bits el resultado se

almacena en el registro AX y cuando la multiplicaci—n es con valores de 16

bits el resultado se almacena en el registro par DX:AX.

 

 

 

Instrucci—n IMUL

 

 

 

Prop—sito: Multiplicaci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Los resultados se guardan en los mismos registros que en la instrucci—n MOV.

 

 

 

Instrucci—n SBB

 

 

 

Prop—sito: Substracci—n con acarreo

 

Sintaxis:

 

SBB destino, fuente

 

Esta instrucci—n resta los operandos y resta uno al resultado si CF est‡

activada. El operando fuente siempre se resta del destino.

 

Este tipo de substracci—n se utiliza cuando se trabaja con cantidades de 32

bits.

 

 

 

Instrucci—n SUB

 

 

 

Prop—sito: Substracci—n

 

Sintaxis:

 

SUB destino, fuente

 

Resta el operando fuente del destino.

 

                                      Derechos Reservados.1995                                      57

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Instrucciones l—gicas y aritmŽticas

 

 

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 acci—n hasta que el contador sea cero.

 

     LOOP

     LOOPE

     LOOPNE

Instrucciones de conteo

                                      Derechos Reservados.1995                                      58

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

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

 

     DEC

     INC

Instrucciones de comparaci—n

 

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

 

 

Instrucci—n JMP

 

 

Prop—sito: Salto incondicional

 

Sintaxis:

 

JMP destino

 

Esta instrucci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n JA (JNBE)

 

 

 

Prop—sito: Brinco condicional

 

Sintaxis:

 

JA Etiqueta

 

DespuŽs de una comparaci—n 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).

 

 

 

Instrucci—n JAE (JNB)

 

 

 

Prop—sito: 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n JB (JNAE)

 

 

 

Prop—sito: salto condicional

 

Sintaxis:

 

JB etiqueta

 

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

 

Se efectœa el salto si CF esta activada.

 

 

 

Instrucci—n JBE (JNA)

 

 

 

Prop—sito: salto condicional

 

Sintaxis:

 

JBE etiqueta

 

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

 

El salto se efectœa si CF est‡ activado o si ZF est‡ activado (que

cualquiera sea igual a 1).

 

 

 

                                      Derechos Reservados.1995                                      61

 

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n JE (JZ)

 

 

Prop—sito: salto condicional

 

Sintaxis:

 

JE etiqueta

 

Salta si es igual o salta si es cero.

 

El salto se realiza si ZF est‡ activada.

 

 

 

Instrucci—n JNE (JNZ)

 

 

Prop—sito: salto condicional

 

Sintaxis:

 

JNE etiqueta

 

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

 

El salto se efectua si ZF est‡ desactivada.

 

 

Instrucci—n JG (JNLE)

 

 

Prop—sito: salto condicional, se toma en cuenta el signo.

 

                                      Derechos Reservados.1995                                      62

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Sintaxis:

 

JG etiqueta

 

Salta si es m‡s grande o salta si no es menor o igual.

 

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

 

 

 

Instrucci—n JGE (JNL)

 

 

 

Prop—sito: salto condicional, se toma en cuenta el signo.

 

Sintaxis:

 

JGE etiqueta

 

Salta si es m‡s grande o igual o salta si no es menor que.

 

El salto se realiza si SF = OF

 

 

 

Instrucci—n JL (JNGE)

 

 

Prop—sito: salto condicional, se toma en cuenta el signo.

 

Sintaxis:

 

JL etiqueta

                                       Derechos Reservados.1995                                      63

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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

 

El salto se efectœa si SF es diferente a OF.

 

 

 

Instrucci—n JLE (JNG)

 

 

Prop—sito: salto condicional, se toma en cuenta el signo.

 

Sintaxis:

 

JLE etiqueta

 

Salta si es menor o igual o salta si no es m‡s grande.

 

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

 

 

 

Instrucci—n JC

 

 

Prop—sito: 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n JNC

 

 

Prop—sito: salto condicional, se toma en cuenta el estado de las banderas.

 

Sintaxis:

 

JNC etiqueta

 

Salta si no hay acarreo.

 

El salto se efectœa si CF = 0.

 

 

 

Instrucci—n JNO

 

 

Prop—sito: 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.

 

 

 

Instrucci—n JNP (JPO)

 

 

Prop—sito: salto condicional, toma en cuenta el estado de las banderas.

                                       Derechos Reservados.1995                                      65

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Sintaxis:

 

JNP etiqueta

 

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

 

El salto ocurre si PF = 0.

 

 

 

Instrucci—n JNS

 

 

Prop—sito: salto condicional, toma en cuenta el estado de las banderas.

 

Sintaxis:

 

JNP etiqueta

 

Salta si el signo esta desactivado.

 

El salto se efectœa si SF = 0.

 

 

 

Instrucci—n JO

 

 

Prop—sito: salto condicional, toma en cuenta el estado de las banderas.

 

Sintaxis:

 

JO etiqueta

 

                                       Derechos Reservados.1995                                      66

 

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Salta si hay desbordamiento (overflow).

 

El salto se realiza si OF = 1.

 

 

 

Instrucci—n JP (JPE)

 

 

Prop—sito: 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 efectœa si PF = 1.

 

 

 

Instrucci—n JS

 

 

Prop—sito: salto condicional, toma en cuenta el estado de las banderas.

 

Sintaxis:

 

JS etiqueta

 

Salta si el signo est‡ prendido.

 

El salto se efectœa si SF = 1.

 

 

                                       Derechos Reservados.1995                                      67

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Instrucci—n LOOP

 

 

Prop—sito: Generar un ciclo en el programa.

 

Sintaxis:

 

LOOP etiqueta

 

La instrucci—n loop decrementa CX en 1, y transfiere el flujo del programa a

la etiqueta dada como operando si CX es diferente a 1.

 

 

 

Instrucci—n LOOPE

 

 

Prop—sito: Generar un ciclo en el programa considerando el estado de ZF

 

Sintaxis:

 

LOOPE etiqueta

 

Esta instrucci—n 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.

 

 

 

Instrucci—n LOOPNE

 

 

Prop—sito: Generar un ciclo en el programa, considerando el estado de ZF

 

                                       Derechos Reservados.1995                                      68

 

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Sintaxis:

 

LOOPNE etiqueta

 

Esta instrucci—n decrementa en uno a CX y transfiere el flujo del programa

solo si ZF es diferente a 0.

 

 

 

Instrucci—n DEC

 

 

 

Prop—sito: Decrementar el operando

 

Sintaxis:

 

DEC destino

 

Esta operaci—n resta 1 al operando destino y almacena el nuevo valor en el

mismo oeprando.

 

 

 

Instrucci—n INC

 

 

 

Prop—sito: Incrementar el operando.

 

Sintaxis:

 

INC destino

 

                                       Derechos Reservados.1995                                      69

 

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

La instrucci—n suma 1 al operando destino y guarda el resultado en el mismo

operando destino.

 

 

 

Instrucci—n CMP

 

 

 

Prop—sito: Comparar los operandos.

 

Sintaxis:

 

CMP destino, fuente

 

Esta instrucci—n resta el operando fuente al operando destino pero sin que

Žste almacene el resultado de la operaci—n, solo se afecta el estado de las

banderas.

 

 

 

Instrucci—n CMPS (CMPSB) (CMPSW)

 

 

 

Prop—sito: Comparar cadenas de un byte o palabra.

 

Sintaxis:

 

CMP destino, fuente

 

Con esta instrucci—n la cadena de caracteres fuente se resta de la cadena

destino.

 

                                       Derechos Reservados.1995                                      70

 

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

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.

 

 

 

Instrucci—n CLC

 

 

 

Prop—sito: Limpiar bandera de acarreo.

 

Sintaxis:

 

CLC

 

Esta instrucci—n apaga el bit correspondiente a la bandera de acarreo, o

sea, lo pone en cero.

 

 

 

Instrucci—n CLD

 

 

 

Prop—sito: Limpiar bandera de direcci—n

 

Sintaxis:

 

CLD

 

La instrucci—n CLD pone en cero el bit correspondiente a la bandera de

direcci—n.

                                       Derechos Reservados.1995                                      71

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Instrucci—n CLI

 

 

 

Prop—sito: Limpiar bandera de interrupci—n

 

Sintaxis:

 

CLI

 

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

interrupciones enmascarables.

 

Una interrupci—n enmascarable es aquella cuyas funciones son desactivadas

cuando IF = 0.

 

 

 

Instrucci—n CMC

 

 

 

Prop—sito: Complementar la bandera de acarreo.

 

Sintaxis:

 

CMC

 

Esta instrucci—n complementa el estado de la bandera CF, si CF = 0 la

instrucci—n la iguala a 1, y si es 1 la instrucci—n la iguala a 0.

 

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

 

 

                                       Derechos Reservados.1995                                      72

 

 

                                UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Instrucci—n STC

 

 

Prop—sito: Activar la bandera de acarreo.

 

Sintaxis:

 

STC

 

Esta instrucci—n pone la bandera CF en 1.

 

 

Instrucci—n STD

 

 

Prop—sito: Activar la bandera de direcci—n.

 

Sintaxis:

 

STD

 

La instrucci—n STD pone la bandera DF en 1.

 

 

Instrucci—n STI

 

 

Prop—sito: Acticar la bandera de interrupci—n.

 

Sintaxis:

 

STI

 

La instrucci—n activa la bandera IF, esto habilita las interrupciones

externas enmascarables (las que funcionan unicamente cuando IF = 1 ).

                                       Derechos Reservados.1995                                      73

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

Interrupciones

 

 

Interrupciones internas de hardware

Interrupciones externas de hardware

Interrupciones de software

Interrupciones mas usuales:

     Int 21H (interrupci—n del DOS)

 

     Multiples llamadas a funciones del DOS.

 

     Int 10H (interrupci—n del BIOS)

 

     Entrada/salida de video.

 

     Int 16H (Interrupci—n del BIOS)

 

     Entrada/salida de teclado.

 

     Int 17H (Interrupci—n del BIOS)

 

     Entrada/salida de la impresora.

 

 

 

Interrupciones internas de hardware

 

 

 

Las interrupciones internas son generadas por ciertos eventos que surgen

durante la ejecuci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

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 interrupci—n varias veces durante un segundo para mantener la hora actualizada.

 

Aunque no podemos manejar directamente esta interrupci—n (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. TambiŽn

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 funci—n 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 comunicaci—n

llamadas puertos.

 

 

Interrupciones de software

 

 

Las interrupciones de software pueden ser activadas directamente por el

ensamblador invocando al nœmero de interrupci—n deseada con la instrucci—n

INT.

                                       Derechos Reservados.1995                                      75

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

El uso de las interrupciones nos ayuda en la creaci—n de programas,

utilizandolas nuestros programas son m‡s cortos, es m‡s f‡cil entenderlos y

usualmente tienen un mejor desempe–o debido en gran parte a su menor tama–o.

 

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 m‡s f‡ciles de usar pero tambiŽn son m‡s lentas ya que estas

interrupciones hacen uso del BIOS para lograr su cometido, en cambio las

interrupciones del BIOS son mucho m‡s r‡pidas 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 elecci—n del tipo de interrupci—n 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).

 

 

 

Interrupci—n 21H

 

 

 

Prop—sito: 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Esta interrupci—n tiene varias funciones, para accesar a cada una de ellas

es necesario que el el registro AH se encuentre el nœmero de funci—n que se

requiera al momento de llamar a la interrupci—n.

 

 

 Funciones para desplegar informaci—n al video.

 

      02H Exhibe salida

      09H Impresi—n de cadena (video)

      40H Escritura en dispositivo/Archivo

 

 

 Funciones para leer informaci—n del teclado.

 

      01H Entrada desde teclado

      0AH Entrada desde teclado usando buffer

      3FH Lectura desde dispositivo/archivo

 

 

 Funciones para trabajar con archivos.

 

En esta secci—n unicamente se expone la tarea espec'fica de cada funci—n,

para una referencia acerca de los conceptos empleados refierase a la unidad

7, titulada: "Introducci—n al manejo de archivos".

 

     MŽtodo 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

     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

 

 

 

Funci—n 02H

 

 

 

 Uso:

 

Despliega un caracter a la pantalla.

 

 Registros de llamada:

 

AH = 02H

DL = Valor del caracter a desplegar.

 

 Registros de retorno:

 

Ninguno

 

Esta funci—n nos despliega el caracter cuyo codigo hexagesimal corresponde

al valor almacenado en el registro DL, no se modifica ningœn registro al

utilizar este comando.

 

Es recomendado el uso de la funci—n 40H de la misma interrupci—n en lugar de

esta funci—n.

                                       Derechos Reservados.1995                                      78

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Funci—n 09H

 

 

 

 Uso:

 

Despliega una cadena de carateres en la pantalla.

 

 Registros de llamada:

 

AH = 09H

DS:DX = Direcci—n de inicio de una cadena de caracteres

 

 Registros de retorno:

 

Ninguno.

 

Esta funci—n despliega los caracteres, uno a uno, desde la direcci—n

indicada en el registro DS:DX hasta encontrar un caracter $, que es

interpretado como el final de la cadena.

 

Se recomienda utilizar la funci—n 40H en lugar de esta funci—n.

 

 

 

Funci—n 40H

 

 

 

 Uso:

 

Escribir a un dispositivo o a un archivo.

 

                                       Derechos Reservados.1995                                      79

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 Registros de llamada:

 

AH = 40H

BX = V'a de comunicaci—n

CX = Cantidad de bytes a escribir

DS:DX = Direcci—n del inicio de los datos a escribir

 

 Registros de retorno:

 

CF = 0 si no hubo error

     AX = Nœmero de bytes escritos

CF = 1 si hubo error

     AX = C—digo de error

 

El uso de esta funci—n para desplegar informaci—n 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.

 

 

 

Funci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Con esta funci—n es muy sencillo leer un caracter del teclado, el c—digo

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 funci—n para obtener el c—digo de este

caracter.

 

 

Funci—n 0AH

 

 

 

 Uso:

 

Leer caracteres del teclado y almacenarlos en un buffer.

 

 Registros de llamada:

 

AH = 0AH

DS:DX = Direcci—n 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 ser‡n le'dos. En el segundo byte se

almacena el nœmero 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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].

 

 

 

Funci—n 3FH

 

 

 Uso:

 

Leer informaci—n de un dispositivo o archivo.

 

 Registros de llamada:

 

AH = 3FH

BX = Nœmero asignado al dispositivo

CX = Nœmero de bytes a procesar

DS:DX = Direcci—n del ‡rea de almacenamiento

 

 Registros de retorno:

 

CF = 0 si no hay error y AX = nœmero de bytes leidos.

CF = 1 si hay error y AX contendra el c—digo del error.

 

 

 

Funci—n 0FH

 

 

 Uso:

 

Abrir archivo FCB

 

                                       Derechos Reservados.1995                                      82

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 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

 

 

 

Funci—n 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 c—digo

correspondiente de error: 1 error al final del archivo, 2 error en la

estructura del FCB y 3 error de lectura parcial.

 

Esta funci—n lo que hace es que lee el siguiente bloque de informaci—n a

partir de la direcci—n dada por DS:DX, y actualiza este registro.

 

 

                                       Derechos Reservados.1995                                      83

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Funci—n 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 c—digo del error:

1 disco lleno o archivo de solo lectura, 2 error en la formaci—n o

especificaci—n del FCB.

 

La funci—n 15H despuŽs de escribir el registro al bloque actual actualiza el

FCB.

 

 

 

Funci—n 16H

 

 

 

 Uso:

 

Crear un archivo FCB.

 

 Registros de llamada:

 

                                       Derechos Reservados.1995                                      84

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 informaci—n proveida en un FCB para crear un archivo en el

disco.

 

 

 

Funci—n 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 c—digo del error:

1 si es fin de archivo, 2 si existe error de especificaci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 

Esta funci—n lee el registro especificado por los campos del bloque actual y

registro actual de un FCB abierto y coloca la informaci—n en el DTA (‡rea de

transferencia de disco o Disk Transfer Area).

 

 

 

Funci—n 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 c—digo del error: 1

si el disco est‡ lleno o es archivo de solo lectura y 2 si hay error en la

especificaci—n de FCB.

 

Escribe el registro especificado por los campos del bloque actual y registro

actual de un FCB abierto. Escribe dicha informaci—n a partir del contenido

del DTA (‡rea de transferencia de disco).

 

 

 

 

                                       Derechos Reservados.1995                                      86

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

Funci—n 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 especificai—n ASCIIZ

 

 Registros de retorno:

 

CF = 0 y AX el nœmero asignado al handle si no hay error, en caso de haberlo

CF ser‡ 1 y AX contendra el c—digo de error: 3 ruta no encontrada, 4 no hay

handles disponibles para asignar y 5 acceso negado.

 

Esta funci—n 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 funci—n.

 

                                       Derechos Reservados.1995                                      87

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

Funci—n 3DH

 

 

 

 Uso:

 

Abre un archivo y regrese un handle

 

 Registros de llamada:

 

AH = 3DH

AL = modo de acceso

DS:DX = Apuntador a una especificaci—n ASCIIZ

 

 Registros de retorno:

 

CF = 0 y AX = nœmero de handle si no hay errores, de lo contrario CF = 1 y

AX = c—digo de error: 01H si no es v‡lida la funci—n, 02H si no se encontr—

el archivo, 03H si no se encontr´o la ruta, 04H si no hay handles

disponibles, 05H en caso de acceso negado, y 0CH si el c—digo de acceso no

es v‡lido.

 

El handle regresado es de 16 bits.

 

El c—digo 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Funci—n 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

c—digo de error: 06H si el handle es inv‡lido.

 

Esta funci—n actualiza el archivo y libera o deja disponible el handle que

estaba utilizando.

 

 

 

Funci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 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 = nœmero de bytes leidos si no hubo error, en caso contrario CF

= 1 y AX = c—digo de error: 05H si acceso negado y 06H si no es v‡lido el

handle.

 

 

 

Funci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 Registros de retorno:

 

CF = 0 y AX = nœmero de bytes escritos si no hay errores, en caso de existir

CF = 1 y AX = c—digo del error: 05H si el acceso es negado y 06H si el

handle es inv‡lido.

 

 

Funci—n 42H

 

 

 Uso:

 

Mover apuntador al archivo (Handle)

 

 Registros de llamada:

 

AH = 42H

AL = mŽtodo utilizado

BX = Handle asignado

CX = La parte m‡s significativa del offset

DX = La parte menos significativa del offset

 

 Registros de retorno:

 

CF = 0 y DX:AX = la nueva posici—n del apuntador. En caso de error CF ser‡ 1

y AX = c—digo de error: 01H si la funci—n no es v‡lida y 06H si el handle no

es v‡lido.

 

El mŽtodo utilizado se configura como sigue:

 

 Valor de AL   MŽtodo

    00H         A partir del principio del archivo

    01H         A partir de la posici—n actual

    02H         A partir del final del archivo

 

                                       Derechos Reservados.1995                                      91

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Interrupci—n 10H

 

 

 

Prop—sito: Llamar a diversas funciones de video del BIOS.

 

Sintaxis:

 

Int 10H

 

Esta interrupci—n 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

interrupci—n.

 

 Funciones comunes de la interrupci—n 10H.

 

     02H Selecci—n de posici—n del cursor

     09H Escribe atributo y caracter en el cursor

     0AH Escribe caracter en la posici—n del cursor

     0EH Escritura de caracteres en modo alfanumŽrico

 

 

 

Funci—n 02H

 

 

 Uso:

 

Posiciona el cursor en la pantalla dentro de las coordenadas v‡lidas de

texto.

 

                                       Derechos Reservados.1995                                      92

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 Registros de llamada:

 

AH = 02H

BH = P‡gina de video en la que se posicionar‡ el cursor.

DH = Fila

DL = Columna

 

 Registros de retorno:

 

Ninguno.

 

Las posiciones de localizaci—n 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.

 

 

 

Funci—n 09H

 

 

 Uso:

 

Desplegar un caracter un determinado nœmero de veces con un atributo

definido empezando en la posici—n actual del cursor.

 

 Registros de llamada:

 

AH = 09H

AL = Caracter a desplegar

BH = P‡gina de video en donde se desplegar‡

BL = Atributo a usar

Nœmero de repeticiones.

 

                                       Derechos Reservados.1995                                      93

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 Registros de retorno:

 

Ninguno

 

Esta funci—n despliega un caracter el nœmero de veces especificado en CX

pero sin cambiar la posici—n del cursor en la pantalla.

 

 

 

Funci—n 0AH

 

 

 

 Uso:

 

Desplegar un caracter en la posici—n actual del cursor.

 

 Registros de llamada:

 

AH = 0AH

AL = Caracter a desplegar

BH = P‡gina en donde desplegar

BL = Color a usar (s—lo en gr‡ficos).

CX = Nœmero de repeticiones

 

 Registros de retorno:

 

Ninguno.

 

La œnica diferencia entre esta funci—n y la anterior es que Žsta no permite

modificar los atributos, simplemente usa los atributos actuales.

 

Tampoco se altera la posici—n del cursor con esta funci—n.

 

                                       Derechos Reservados.1995                                      94

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Funci—n 0EH

 

 

 

 Uso:

 

Deplegar un caracter en la pantalla actualizando la posici—n del cursor.

 

 Registros de llamada:

 

AH = 0EH

AL = Caracter a desplegar

BH = P‡gina donde se desplegara el caracter

BL = Color a usar (solo en gr‡ficos)

 

 Registros de retorno:

 

Ninguno

 

 

 

Interrupci—n 16H

 

 

 

Prop—sito: Manejar la entrada/salida del teclado.

 

Sintaxis:

 

Int 16H

 

Veremos dos opciones de la interrupci—n 16H, estas opciones, al igual que

las de otras interrupciones, son llamadas utilizando el registro AH.

 

                                       Derechos Reservados.1995                                      95

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

 Funciones de la interrupci—n 16H

 

      00H Lee un caracter de teclado

      01H Lee estado del teclado

 

 

 

Funci—n 00H

 

 

 

 Uso:

 

Leer un caracter del teclado.

 

 Registros de llamada:

 

AH = 00H

 

 Registros de retorno:

 

AH = c—digo de barrido (scan code) del teclado

AL = Valor ASCII del caracter.

 

Cuando se utiliza esta interrupci—n se detiene la ejecuci—n 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 c—digo de barrido ser‡ guardado en AL y AH contendr‡ el valor

00H.

 

El c—digo de barrido fuŽ creado para manejar las teclas que no tienen una

representaci—n ASCII como [ALT], [CONTROL], las teclas de funci—n, etc.

 

 

                                       Derechos Reservados.1995                                      96

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Funci—n 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 informaci—n en el

buffer, si se encuentra prendida es que no hay teclas pendientes.

 

En caso de existir informaci—n el registro AH contendr‡ el c—digo de la

tecla guardada en el buffer.

 

 

 

Interrupci—n 17H

 

 

Prop—sito: Manejar la entrada/salida de la impresora.

 

Sintaxis:

 

Int 17H

 

Esta interrupci—n es utilizada para escribir caracteres a la impresora,

inicializarla y leer su estado.

 

                                       Derechos Reservados.1995                                      97

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Funciones de la interrupci—n 16H

 

 

      00H Imprime un caracter ASCII

      01H Inicializa la impresora

      02H Proporciona el estado de la impresora

 

 

 

Funci—n 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

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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 comunicaci—n

  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.

 

 

 

Funci—n 01H

 

 

 

 Uso:

 

Inicializar un puerto de impresi—n.

 

 Registros de llamada:

 

AH = 01H

DX = Puerto a utilizar

 

                                       Derechos Reservados.1995                                      99

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

 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 comunicaci—n

  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.

 

 

 

Funci—n 02H

 

 

 Uso:

 

Obtener el estado de la impresora.

 

 

                                       Derechos Reservados.1995                                    100

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

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 comunicaci—n

  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

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

Introduci—n al manejo de archivos

 

 

Formas de trabajar con archivos

     MŽtodos de trabajo con archivos

MŽtodo FCB

     Introducci—n

     Abrir archivos

     Crear un archivo nuevo

     Escritura secuencial

     Lectura secuencial

     Lectura y escritra aleatoria

     Cerrar un archivo

MŽtodo de canales de comunicaci—n

     Trabajando con handles

     Funciones para utilizar handles

 

 

 

MŽtodos 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 comunicaci—n, 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 versi—n 1.0 del DOS,

adem‡s este mŽtodo nos permite tener un nœmero ilimitado de archivos

abiertos al mismo tiempo. Si se quiere crear un volumen para el disco la

œnica forma de lograrlo es utilizando este mŽtodo.

 

 

                                       Derechos Reservados.1995                                    102

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

 

Aœn considerando las ventajas del FCB el uso de los canales de comunicaci—n

es mucho m‡s sencillo y nos permite un mejor manejo de errores, adem‡s, por

ser m‡s novedoso es muy probable que los archivos as' creados se mantengan

compatibles a travŽs de versiones posteriores del sistema operativo.

 

 

Para una mayor facilidad en las explicaciones posteriores me referirŽ a el

mŽtodo de bloques de control de archivos como FCBs y al mŽtodo de canales de

comunicaci—n como handles.

 

 

 

Introducci—n

 

 

 

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 informaci—n dada por el programador y por informaci—n

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 organizaci—n por directorios del DOS.

 

 

El FCB est‡ formado por los siguientes campos:

 

 

 

                                      Derechos Reservados.1995                                    103

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

 POSICION  LONGITUD  SIGNIFICADO

   00H      1 Byte    Drive

   01H      8 Bytes   Nombre del archivo

   09H      3 Bytes   Extensi—n

   0CH      2 Bytes   Nœmero de bloque

   0EH      2 Bytes   Tama–o del registro

   10H      4 Bytes   Tama–o del archivo

   14H      2 Bytes   Fecha de creaci—n

   16H      2 Bytes   Hora de creaci—n

   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 opci—n 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 deber‡n rellenar los bytes sobrantes con espacios, la extensi—n

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 numeraci—n inici— con 0 y el bloque puede contener 128

registros en total.

 

 

 

                                      Derechos Reservados.1995                                    104

 

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Abrir archivos

 

 

 

Para abrir un archivo FCB se utiliza la interrupci—n 21H, funci—n 0FH. La

unidad, el nombre y extensi—n del archivo deben ser inicializados antes de

abrirlo.

 

El registro DX debe apuntar al bloque. Si al llamar a la interrupci—n Ž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 tama–o del

registro a 128 bytes y el tama–o del mismo y su fecha se llenan con los

datos encontrados en el directorio.

 

 

 

Crear un archivo nuevo

 

 

 

Para la creaci—n de archivos se utiliza la interrupci—n 21H funci—n 16H .

 

DX debe apuntar a una estructura de control cuyos requisitos son que al

menos se encuentre definida la unidad l—gica, el nombre y la extensi—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Escritura secuencial

 

 

 

Antes de que podamos realizar escrituras al disco es necesario definir el

‡rea de transferencia de datos utilizando para tal fin la funci—n 1AH de la

interrupci—n 21H.

 

La funci—n 1AH no regresa ningœn estado del disco ni de la operaci—n, pero

la funci—n 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 funci—n 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 operaci—n, 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

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

Lectura y escritura aleatoria

 

 

La funci—n 21H y la funci—n 22H de la interrupci—n 21H son las encargadas de

realizar las lecturas y escrituras aleatorias respectivamente.

 

El nœmero de registro aleatorio y el bloque actual son usados para calcular

la posici—n relativa del registro a leer o escribir.

 

El registro AL regresa la misma informaci—n que para lectura o escritura

secuencial. La informaci—n que ser‡ le'da se regresar‡ en el ‡rea de

transferencia de disco, as' mismo la informaci—n que ser‡ escrita reside en

el DTA.

 

 

 

Cerrar un archivo

 

 

Para cerrar un archivo utilizamos la funci—n 10H de la interrupci—n 21H.

 

Si despuŽs de invocarse esta funci—n el registro AL contiene el valor de FFH

significa que el archivo ha cambiado de posici—n, 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

creaci—n de archivos y el programador puede concentrarse en otros aspectos

de la programaci—n sin preocuparse en detalles que pueden ser manejados por

el sistema operativo.

                                       Derechos Reservados.1995                                    107

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n

 

 

 

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 nœmero del

handle a utilizar, toda la dem‡s informaci—n es manejada internamente por el

DOS.

 

Cuando utilizamos este mŽtodo para trabajar con archivos no existe una

distinci—n 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 secci—n dedicada a la

interrupci—n 21H.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                       Derechos Reservados.1995                                    108

 

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

Macros y procedimientos

 

 

Procedimientos.

     Definici—n de procedimiento

     Sintaxis de un procedimiento

 

Macros.

     Definici—n de una macro

     Sintaxis de una macro

     Bibliotecas de macros

 

 

 

Definici—n de procedimiento

 

 

 

Un procedimiento es un conjunto de instrucciones a los que podemos dirigir

el flujo de nuestro programa, y una vez terminada la ejecuci—n de dichas

instrucciones se devuelve el control a la siguiente linea a procesar del

c—digo que mando llamar al procedimiento.

 

Los procedimientos nos ayudan a crear programas legibles y f‡ciles de

modificar.

 

Al momento de invocar a un procedimiento se guarda en la pila la direcci—n

de la siguiente instrucci—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

 

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:

 

 Declaraci—n del procedimiento

 C—digo del procedimiento

 Directiva de regreso

 Terminaci—n 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  ;Declaraci—n del procedimiento

   Mov Bx, 0     ;Contenido del procedimiento

   Mov Bl, Ah

   Mov Ah, 00

   Add Bx, Ax

   Ret           ;Directiva de regreso

 Suma Endp       ;Declaraci—n de final del procedimiento

 

                                       Derechos Reservados.1995                                    110

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

En la declaraci—n 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 direcci—n 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 programaci—n comparadas con

los procedimientos, pero no por ello se dejar‡n de utilizar estos œltimos.

 

Definici—n 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 par‡metros y en el procedimiento no (esto

es aplicable solo para el MASM, hay otros lenguajes de programaci—n que si

lo permiten). Al momento de ejecutarse la macro cada par‡metro es sustituido

por el nombre o valor especificado al momento de llamarla.

 

Podemos decir entonces que un procedimiento es una extensi—n de un

determinado programa, mientras que la macro es un m—dulo 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 instrucci—n del ensamblador.

                                       Derechos Reservados.1995                                    111

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

 

Sintaxis de una macro

 

 

Las partes que componen a una macro son:

 

 Declaraci—n de la macro

 C—digo de la macro

 Directiva de terminaci—n de la macro

 

La declaraci—n 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 terminaci—n de la macro es: ENDM

 

Un ejemplo de macro, para colocar el cursor en alguna posici—n 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

 

                    Coordinaci—n General de Sistemas de Informaci—n.

 

Para utilizar una macro solo es necesario llamarla por su nombre, como si

fuera una instrucci—n 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 creaci—n de

bibliotecas, las cuales son grupos de macros que pueden ser incluidas en un

programa desde un archivo diferente.

 

La creaci—n de estas bibliotecas es muy sencilla, unicamente tenemos que

escribir un archivo con todas las macros que se necesitar‡n y guardarlo como

archivo de texto.

 

Para llamar a estas macros solo es necesario utilizar la instrucci—n Include

NombreDelArchivo, en la parte de nuestro programa donde escribiriamos

normalmente las macros, esto es, al principio de nuestro programa (antes de

la declaraci—n del modelo de memoria).

 

Suponiendo que se guard— el archivo de las macros con el nombre de

MACROS.TXT la instrucci—n 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 c—digo del programa

 .STACK

   ;Se define la pila

 End Inicio

   ;Termina nuestro programa

                                    Derechos Reservados.1995                                    113

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

Ejemplos:

 

Desplegar un mensaje en pantalla

 

 

Uno de los programas m‡s sencillos, pero en cierta forma pr‡ctico, 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 c—digo

 Inicio:              ; Etiqueta de inicio del programa:

 MOV AX,@DATA         ; Vamos a colocar la direcci—n del segmento de datos

 MOV DS,AX            ;  en DS, usando como intermediario a AX

 MOV DX,OFFSET Cadena ; Colocamos en DX la direcci—n, dentro del

                      ;  segmento, de la cadena a desplegar

 MOV AH,09            ; Utilizaremos la funci—n 09 de la interrupci—n

 INT 21H              ;  21H para desplegar la cadena.

 MOV AH,4CH           ; Por medio de la funci—n 4CH de la interrupci—n

 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 ningœn comentario adicional.

 

 

                                    Derechos Reservados.1995                                    114

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 

Cuando se crea un programa no es necesario escribir los comentarios que van

despues de las comillas, sin embargo es una tŽcnica recomendable para que en

caso de errores o mejoras al c—digo sea m‡s sencillo encontrar la parte

deseada.

 

Para ensamblar este programa primero se guarda en formato ASCII con un

nombre v‡lido, 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, llŽvelo a su PC, con algun editor elimine todos estos

comentarios y los comentarios del principio y ens‡mblelo.

 

 

 

 

 

Desplegar nœmeros hexadecimales del 15 al 0

 

 

 

Este programa despliega los 16 caracteres correspondientes al c—digo

hexadecimal en orden descendente.

 

 

                                    Derechos Reservados.1995                                    115

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

Programa:

 ; Inicio del programa, definimos el modelo de memoria a usar y el segmento

 ; de c—digo

 .MODEL SMALL          ; Modelo de memoria

 .CODE                 ; Area de c—digo

 Inicio:               ; Etiqueta de inicio del programa

 MOV AX,@DATA          ; Inicializa el registro DS con la direcci—n dada

 MOV DS,AX             ;  por @DATA (Segmento de datos).

 MOV DX, OFFSET Titulo ; Obtiene la direcci—n de la cadena de caracteres

 MOV AH,09             ; Usamos la funci—n 09H de la interrupci—n 21H

 INT 21H               ;  para desplegar la cadena cuya direcci—n obtuvimos.

 MOV CX,16             ; Contador de caracteres que se mostrar‡n

 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 nœmero a traducir y lo traduce

 XLAT                  ; usando la instrucci—n XLAT

 MOV DL,AL             ; Coloca en DL el valor a ser desplegado por medio de la

 MOV AH,02             ;  funci—n 2 de la interrupci—n 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 funci—n 4C de la interrupci—n 21H para

 INT 21H               ; finalizar el programa

 

 ; Inicio del segmento de datos

 .DATA                 ;Define el segmento de datos

 Titulo DB 13,10,'Desplegar los nœmeros hexadecimales del 15 al 1'

   DB 13,10,'$'        ; Cadena a desplegar al inicio del programa

 Cadena DB '0123456789ABCDEF'  ; Cadena con los d'gitos hexadecimales

 ; Declaraci—n del segmento de la pila

 .STACK

 END Inicio            ;Declaraci—n del final del programa

                                    Derechos Reservados.1995                                    116

    

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

    El comando XLAT busca la cadena o tabla localizada en BX, el registro

     AL contiene el nœmero de bytes, a partir de la direcci—n 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 b‡sicas

 

 

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, multiplicaci—n o divisi—n 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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 Funcion  DB 0            ;Variable que almacena la opci—n a realizar

 Resulta  DB 13,10,'Resultado: $'

 ResultaR DB 11 DUP(?)

 Mensaje  DB 13,10,'Operaciones b‡sicas entre dos nœmeros'

          DB 13,10,13,10,'$'

 Pregunta DB 13,10,'Presione: ',13,10

          DB ' 1  Multiplicaci—n ',13,10

          DB ' 2  Divisi—n ',13,10

          DB ' 3  Suma ',13,10

          DB ' 4  Resta ',13,10

          DB ' 5  Salir ',13,10,'$'

 Error    DB 7,13,10,'Selecci—n inv‡lida (1-5)',13,10,'$'

 Error1   DB 7,13,10,'Cantidad 1 inv‡lida.          ',13,10,'$'

 Error2   DB 7,13,10,'Cantidad 2 inv‡lida.          ',13,10,'$'

 Error3   DB 7,13,10,'Cantidad fuera de rango (65535)      ',13,10,'$'

 Error4   DB 7,13,10,'Intento de divisi—n 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 conversi—n binaria/ASCII

 

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

 PotenciaF DW $

 

 .CODE                   ;Define el ‡rea de c—digo

 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 direcci—n del segmento de datos

   Mov Ds, Ax              ;Inicializa a DS con esa direcci—n

 

                                       Derechos Reservados.1995                                    118

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 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 opci—n deseada

   Cmp Al, 49              ;Compara la selecci—n con el d'gito 1 ASCII

   Jae SIGUE               ;Si la opci—n 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 selecci—n con el d'gito 5 ASCII

   Jbe TODOBIEN            ;Si es menor a 5 brinca a TODOBIEN, sino continœa

   Mov Dx, Offset Error    ;Si la opci—n fuŽ mayor a 5 despiega el error

   Call Imprime

   Jmp OTRA

 TODOBIEN:

   Cmp Al,53               ;Compara la seleci—n 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 nœmero de funci—n 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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

   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 conversi—n

 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 selecci—n de la operaci—n

 ;Que se realizara:

 

   Mov Al, Funcion         ;Carga en Al la funci—n 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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 

 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 funci—n termina la ejecuci—n

   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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

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                  ;Efectœa la divisi—n

   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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 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 funci—n 9 de la interrupci—n

   Int 21h                 ;21h para desplegar una cadena

   Ret

 Imprime Endp

 

 ObtenTecla Proc Near

   Mov ah, 0               ;Utiliza la interrupci—n 16h para

   Int 16h                 ; leer una tecla

   Ret

 ObtenTecla Endp

 

 

 

                                      Derechos Reservados.1995                                    123

 

 

 

                             UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 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     ;Direcci—n de la tabla de potencias

   Dec Si

   Add Si, Cx

   Xor Bx, Bx

   Std

 CONVNUM3:

   Lodsb                   ;Carga en AL el byte cuya direcci—n es DS:SI

   Cmp Al, "0"             ;Compara el byte con el d'gito 0

   Jb CONVNUM04            ;Si es menor es inv‡lido y brinca

   Cmp Al, "9"             ;Compara el byte con el d'gito 9

   Ja CONVNUM04            ;Si es mayor es inv‡lido 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 nœmero

   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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

  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 conversi—n, lo que

   Call HuboERROR          ; significa que la cantidad es mayor a 65535

 CONVNUM06:

   Cld                     ;Regresa la bandera de direcci—n 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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

 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 divisi—n

   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

 

                   Coordinaci—n General de Sisyemas deInformaci—n.

 

 

 

  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 divisi—n por cero

   Call Imprime

   Mov ErrorCAP, 1

 HUBOERROR05:

   Ret

 HuboERROR Endp

 

 .STACK

 End Empieza

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                       Derechos Reservados.1995                                    127

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas de Informaci—n.

 

 

Directorio y bibliograf'a

 

 

CrŽditos

 

Ing. M—nico Brise–o C.

     Idea original

Hugo Eduardo PŽrez P.

     Desarrollo e implementaci—n

 

Bibliograf'a

 

Lenguaje Ensamblador Para Microcomputadoras IBM

     J. Terry Godfrey

     Ed. Prentice Hall Hispanoamericana, S.A.

     MŽxico

 

Ensamblador B‡sico

     A. Rojas

     Ed. Computec Editores S.A. de C.V.

     MŽxico

 

IBM Personal Computer Assembly Languaje Tutorial

     Joshua Auerbach

     Yale University

 

 

 

 

 

 

 

 

 

                                       Derechos Reservados.1995                                    128

 

 

 

                               UNIVERSIDAD DE GUADALAJARA

 

                   Coordinaci—n General de Sistemas deInformaci—n.

 

 

ÁNecesitamos tu opini—n!

 

 

Nuestra finalidad con este documento es llevar el conocimiento a tus manos.

Para hacerlo en una forma m‡s eficiente es necesario conocer tu opini—n,

sugerencias y cr'ticas.

 

Nos gustar'a que nos mandaras tus programas escritos en ensamblador (ÁEn

c—digo fuente por favor!) para mostrarlos en este espacio, as' como para

darte el reconocimiento que mereces. Procura incluir todos tus datos: tu

nombre, domicilio, profesi—n y tu direcci—n electr—nica (si la tienes), y la

versi—n de ensamblador que usas.

 

Manda tus programas y sugerencias relacionados con este tutorial a la

direcci—n huperez@rulfo.dca.udg.mx o si lo deseas manda tus comentarios

sobre el servidor en general a la direcci—n monico@redudg.udg.mx

 

Como informaci—n soy un alumno de la Universidad de Guadalajara, del

Departamento de Ciencias Computacionales. Estudio la carrera de Ingenier'a

en Computaci—n y me gustar'a aprender de ti. La primera direcci—n es mi

direcci—n personal, as' que sientete libre de mandar tus comentarios.

 

 

 

 

 

 

 

 

 

 

 

 

 

                                       Derechos Reservados.1995                                    129