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
aritmticas................................................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 perifricas y la programaci—n de
sistemas que la
hacen un aparato œtil y funcional para un fin determinado.
Procesador Central.
Esta parte es
conocida tambin como unidad central de procesamiento o UCP.
formada a su vez por
la unidad de control y la unidad aritmtica y 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 aritmtica y l—gica de la UCP realiza
las operaciones relacionadas con los c‡lculos numricos 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 numrico 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
genrico de estas memorias es Random Access Memory (Memoria de acceso
aleatorio) o RAM por sus siglas en ingls. La principal desventaja de
este tipo de memoria
es que los circuitos integrados pierden la informaci—n
que tienen
almacenada cuando se interrumpe la alimentaci—n elctrica. 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 perifricas
de memoria que
reciben el nombre de memoria auxiliar o secundaria. De estas
unidades
perifricas las m‡s comunes son las cintas y los discos magnticos.
La informaci—n
almacenada en estos medios magnticos 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 numricos
Convertir nœmeros binarios a decimales
Convertir nœmeros decimales a binarios
Sistema Hexadecimal
Mtodos de
representaci—n de datos en una computadora.
C—digo ASCII
Mtodo 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
numricos
El sistema
numrico 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 numrica
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
mtodos 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 mtodo 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
Despus 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 (ponindose
el bit 8 en su
estado de apagado o 0).
De esta forma cada
letra, d'gito o caracter especial ocupa un byte en la
memoria de la
computadora.
Podemos observar que
este mtodo de representaci—n de datos es muy
ineficiente en el
aspecto numrico, ya que en formato binario nos basta un
solo byte para representar
numeros de 0 a 255, en cambio con el 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 mtodo 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
mtodo 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 mtodo BCD solo podemos representar
d'gitos del 0 al 99,
en cambio, en formato binario podemos representar todos
los d'gitos desde 0
hasta 255.
Este formato es
utilizado principalmente para representar 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
tambin a los
registros BX, CX y DX.
Los registros son
conocidos por sus nombres espec'ficos:
AX Acumulador
BX Registro base
CX Registro contador
DX Registro de datos
DS Registro del segmento de datos
ES Registro del segmento extra
SS Registro del segmento de pila
CS Registro del segmento de 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.
Tambin 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 aritmticas
Saltos, ciclos y procedimientos
Software necesario
Para poder crear un
programa se requieren varias herramientas:
Primero un editor
para crear el programa fuente. Segundo un compilador que no es mas que un
programa que "traduce" el programa fuente a un programa objeto. Y
tercero un enlazador o linker, que genere el programa ejecutable a partir del
programa objeto.
Derechos Reservados.1995 28
UNIVERSIDAD DE
GUADALAJARA
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 tambin 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 aritmticas
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 tambin 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
recin
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 aritmticas
Instrucciones
l—gicas.
Son utilizadas para
realizar operaciones l—gicas sobre los operandos.
AND
NEG
NOT
OR
TEST
XOR
Instrucciones
aritmticas.
Se usan para
realizar operaciones aritmticas sobre los operandos.
ADC
ADD
DIV
IDIV
MUL
IMUL
SBB
SUB
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 aritmticas
Instrucciones de
salto
Son utilizadas para
transferir el flujo del proceso al operando indicado.
JMP
JA (JNBE)
JAE (JNBE)
JB (JNAE)
JBE (JNA)
JE (JZ)
JNE (JNZ)
JG (JNLE)
JGE (JNL)
JL (JNGE)
JLE (JNG)
JC
JNC
JNO
JNP (JPO)
JNS
JO
JP (JPE)
JS
Instrucciones para
ciclos: LOOP
Transfieren el flujo
del proceso, condicional o incondicionalmente, a un
destino repitiendose
esta 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
Despus 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. Tambin
son generadas por
los coprocesadores.
No es posible
desactivar a las interrupciones externas.
Estas interrupciones
no son enviadas directamente a la UCP, sino que se
mandan a un circuito
integrado cuya 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 tambin 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".
Mtodo FCB
0FH Abrir archivo
14H Lectura secuencial
15H Escritura secuencial
16H Crear archivo
21H Lectura aleatoria
22H Escritura aleatoria
Derechos
Reservados.1995 77
UNIVERSIDAD DE
GUADALAJARA
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
despus 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 = mtodo
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 mtodo
utilizado se configura como sigue:
Valor de AL
Mtodo
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
alfanumrico
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
Mtodos de trabajo con archivos
Mtodo FCB
Introducci—n
Abrir archivos
Crear un archivo nuevo
Escritura secuencial
Lectura secuencial
Lectura y escritra aleatoria
Cerrar un archivo
Mtodo de
canales de comunicaci—n
Trabajando con handles
Funciones para utilizar handles
Mtodos de
trabajo con archivos
Existen dos formas
de trabajar con archivos, la primera es por medio de
bloques de control
de archivos o "FCB" y la segunda es por medio de canales
de 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 mtodo
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 mtodo.
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
travs de versiones posteriores del sistema operativo.
Para una mayor
facilidad en las explicaciones posteriores me referir a el
mtodo de
bloques de control de archivos como FCBs y al mtodo de canales de
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 despus 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 mtodo 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 tcnica 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,
llvelo 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
Crditos
Ing. M—nico Brise–o
C.
Idea original
Hugo Eduardo
Prez P.
Desarrollo e implementaci—n
Bibliograf'a
Lenguaje Ensamblador
Para Microcomputadoras IBM
J. Terry Godfrey
Ed. Prentice Hall Hispanoamericana, S.A.
Mxico
Ensamblador B‡sico
A. Rojas
Ed. Computec Editores S.A. de C.V.
Mxico
IBM Personal
Computer Assembly Languaje Tutorial
Joshua Auerbach
Yale University
Derechos Reservados.1995 128
UNIVERSIDAD DE
GUADALAJARA
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