Está en la página 1de 77

http://members.es.tripod.de/tutorial/index.

html
Introduccin.
-------------
El documento que est visualizando tiene la funcin primordial de introducirlo a
la programacin en lenguae Ensamblador! " est pensado en aquellas personas que
nunca han trabaado con este lenguae " probablemente con ning#n otro.
El tutorial se enfoca completamente hacia las computadoras que operan con
procesadores de la familia x$% de Intel "! considerando que el ensamblador basa
su funcionamiento en los recursos internos del procesador! los eemplos
descritos no son compatibles con ninguna otra arquitectura.
&e estructura la informacin en forma de unidades para permitir el fcil acceso
a cada uno de los t'picos " facilitar el seguimiento del tutorial.
En la seccin introductoria se mencionan algunos de los conceptos elementales
acerca de los sistemas de cmputo as' como del ensamblador mismo! " contin#a con
el tutorial propiamente dicho.
()*+E*I,):
----------
-.- ,escripcin bsica de un sistema de cmputo
..- El porqu/ aprender lenguae ensamblador
- -cercamiento al lenguae ensamblador
Esta primera parte esta enfocada al conocimiento de algunas de las
caracter'sticas de las computadoras " del ensamblador.
0*I,-, 1: (onceptos bsicos
0*I,-, 2: 3rogramacin en ensamblador
- 4as instrucciones del ensamblador.
En esta segunda parte se profundiza un poco ms en la descripcin de las
instrucciones del lenguae ensamblador.
0*I,-, 5: Instrucciones de operacin sobre datos
0*I,-, 6: Instrucciones lgicas " aritm/ticas
0*I,-, 7: Instrucciones para control de procesos
- Interrupciones " maneo de archivos.
0*I,-, %: Interrupciones
0*I,-, 8: Introduccin al maneo de archivos
- Introduccin a las macros.
0*I,-, $: 9acros " procedimientos
- Eemplos
En esta seccin se exponen algunos programas de eemplo en los que se utilizan
los elementos explicados en el tutorial.
- ,esplegar un mensae en pantalla
- ,esplegar n#meros hexadecimales del 17 al :
- )peraciones bsicas
- ,irectorio " bibliograf'a
- (omentarios " sugerencias
-.- ,escripcin bsica de un sistema de cmputo.
Esta seccin tiene como finalidad dar una breve rese;a de las partes principales
de un sistema de cmputo a un nivel bsico! que permita al usuario un ma"or
entendimiento de los conceptos que se tratarn a lo largo del tutorial.
< 3rocesador (entral
< 9emoria (entral
< 0nidades de Entrada " &alida
< 0nidades de 9emoria -uxiliar
- &istema de (mputo.
4e llamamos sistema de cmputo a la configuracin completa de una computadora!
inclu"endo las unidades perif/ricas " la programacin de sistemas que la hacen
un aparato #til " funcional para un fin determinado.
- 3rocesador (entral.
Esta parte es conocida tambi/n como unidad central de procesamiento o 0(3.
formada a su vez por la unidad de control " la unidad aritm/tica " lgica.
&us funciones consisten en leer " escribir contenidos de las celdas de memoria!
llevar " traer datos entre celdas de memoria " registros especiales "
decodificar " eecutar las instrucciones de un programa.
El procesador cuenta con una serie de celdas de memoria que se utilizan con
mucha frecuencia " que! por ende! forman parte de la 0(3.
Estas celdas son conocidas con el nombre de registros. 0n procesador puede tener
una docena o dos de estos registros. 4a unidad aritm/tica " lgica de la 0(3
realiza las operaciones relacionadas con los clculos num/ricos " simblicos.
+'picamente estas unidades slo tienen capacidad de efectuar operaciones mu"
elementales como: suma " resta de dos n#meros de punto fio! multiplicacin "
divisin de punto fio! manipulacin de bits de los registros " comparacin del
contenido de dos registros.
4as computadoras personales pueden clasificarse por lo que se conoce como tama;o
de palabra! esto es! la cantidad de bits que el procesador puede manear a la
vez.
-9emoria (entral.
Es un conunto de celdas =actualmente fabricadas con semiconductores> usadas
para procesos generales! tales como la eecucin de programas " el
almacenamiento de informacin para las operaciones.
(ada una de las celdas puede contener un valor num/rico " tienen la propiedad de
ser direccionables! esto es! que se pueden distinguir una de otra por medio de
un n#mero #nico o direccin para cada celda.
El nombre genrico de estas memorias es ?andom -ccess 9emor" =9emoria de acceso
aleatorio> o ?-9 por sus siglas en ingl/s. 4a principal desventaa de este tipo
de memoria es que los circuitos integrados pierden la informacin que tienen
almacenada cuando se interrumpe la alimentacin el/ctrica. Esto llev a la
creacin de memorias cu"a informacin no se pierda cuando se apaga el sistema.
Estas memorias reciben el nombre de ?ead )nl" 9emor" =9emoria de solo lectura> o
?)9.

- 0nidades de Entrada " &alida.
3ara que una computadora nos sea #til es necesario que el procesador se
comunique al exterior por medio de interfaces que permiten la entrada " la
salida de datos del procesador " la memoria. @aciendo uso de estas
comunicaciones es posible introducir datos para su procesamiento
" la posterior visualizacin de los datos "a procesados.
-lgunas de las unidades de entrada mas comunes son teclados! lectoras de
taretas ="a en desuso>! mouse! etc. 4as unidades de salida mas comunes son las
terminales de video " las impresoras.
- 0nidades de 9emoria -uxiliar.
(omo la memoria central de una computadora es costosa "! considerando las
aplicaciones actuales! mu" limitada! surge entonces la necesidad de crear
sistemas de almacenamiento de informacin prcticos " econmicos. -dems! la
memoria central pierde su contenido al apagarse la mquina! por lo que no es
conveniente utilizarla para almacenamiento permanente de datos.
Estos " otros incovenientes dan lugar a la creacin de unidades perif/ricas de
memoria que reciben el nombre de memoria auxiliar o secundaria. ,e estas
unidades perif/ricas las ms comunes son las cintas " los discos magn/ticos.
4a informacin almacenada en estos medios magn'ticos recibe el nombre de
archivo. 0n archivo est formado por un n#mero variable de registros!
generalmente de tama;o fioA los registros pueden contener datos o programas.
..- El porqu/ aprender lenguae ensamblador
-------------------------------------------
- Bentaas del Ensamblador
4a primera razn para trabaar con ensamblador es que proporciona la oportunidad
de conocer ms a fondo la operacin de su 3(! lo que permite el desarrollo de
softCare de una manera ms consistente.
4a segunda razn es el control total de la 3( que se tiene con el uso del mismo.
)tra razn es que los programas de ensamblador son mas rpidos! ms compactos "
tienen ma"or capacidad que los creados en otros lenguaes.
3or #ltimo el ensamblador permite una optimizacin ideal en los programas tanto
en su tama;o como en su eecucin.
- &oftCare
En terminos de computacin es todo aquel proceso o programa que utiliza los
recursos de la computadora para lograr el obetivo trazado por su dise;ador o
programador.
0*I,-, 1.-(onceptos bsicos
---------------------------
- Informacin en las computadoras.
- 0nidades de informacin
- &istemas num/ricos
- (onvertir n#meros binarios a decimales
- (onvertir n#meros decimales a binarios
- &istema @exadecimal
- 9/todos de representacin de datos en una computadora.
- (digo -&(II
- 9/todo .(,
- ?epresentacin de punto flotante
- +rabaando con el lenguae ensamblador.
- 3roceso de creacin de un programa
- ?egistros de la 0(3
- 4a estructura del ensamblador
- *uestro primer programa
- Duardar " cargar los programas
- (ondiciones! ciclos " bifurcaciones
- Interrupciones
--------------------------------
Informacin en las computadoras.
--------------------------------
0nidades de informacin
-----------------------
3ara que la 3( pueda procesar la informacin es necesario que /sta se encuentre
en celdas especiales llamadas registros.
4os registros son conuntos de $ o 1% flip-flops =basculadores o biestables>.
0n flip-flop es un dispositivo capaz de almacenar dos niveles de voltae! uno
bao! regularmente de :.7 volts " otro alto comunmente de 7 volts. El nivel bao
de energ'a en el flip-flop se interpreta como apagado o :! " el nivel alto como
prendido o 1. - estos estados se les conoce usualmente como bits! que son la
unidad mas peque;a de informacin en una computadora.
- un grupo de 1% bits se le conoce como palabra! una palabra puede ser dividida
en grupos de $ bits llamados b"tes! " a los grupos de 6 bits les llamamos
nibbles.
&istemas num/ricos
------------------
El sistema num/rico que utilizamos a diario es el sistema decimal! pero este
sistema no es conveniente para las mquinas debido a que la informacin se
manea codificada en forma de bits prendidos o apagadosA esta forma de
codificacin nos lleva a la necesidad de conocer el clculo 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:
,onde n es la posicin del d'gito empezando de derecha a izquierda " numerando a
partir de cero. , es el d'gito sobre el cual operamos " . es la base num/rica
empleada.
(onvertir n#meros binarios a decimales
--------------------------------------
+rabaando en el lenguae 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! "a sea
encendido =1> o apagado =:>! por lo tanto su base es dos.
3ara la conversin podemos utilizar la formula de valor posicional:
3or eemplo! si tenemos el numero binario 1::11! tomamos de derecha a izquierda
cada d'gito " lo multiplicamos por la base elevada a la nueva posicin que
ocupan:
.inario: 1 1 : : 1
,ecimal: 1<2E: F 1<2E1 F :<2E2 F :<2E5 F 1<2E6
G 1 F 2 F : F : F 1% G 1H decimal.
El caracter E es utilizado en computacin como s'mbolo de potenciacin " el
caracter < se usa para representar la multiplicacin.
(onvertir n#meros decimales a binarios
--------------------------------------
Existen varios m/todos de conversin de n#meros decimales a binariosA aqu' solo
se analizar uno.
*aturalmente es mucho mas fcil una conversin con una calculadora cient'fica!
pero no siempre se cuenta con ella! as' que es conveniente conocer por lo menos
una forma manual para hacerlo.
El m/todo que se explicar utiliza la divisin sucesiva entre dos! guardando el
residuo como d'gito binario " el resultado como la siguiente cantidad a dividir.
+omemos como eemplo el n#mero 65 decimal.
65/2 G 21 " su residuo es 1
21/2 G 1: " su residuo es 1
1:/2 G 7 " su residuo es :
7/2 G 2 " su residuo es 1
2/2 G 1 " su residuo es :
1/2 G : " su residuo es 1
-rmando el n#mero de abao hacia arriba tenemos que el resultado en binario es
1:1:11
&istema hexadecimal
-------------------
En la base hexadecimal tenemos 1% d'gitos que van del : al H " de la letra -
hasta la I =estas letras representan los n#meros del 1: al 17>. 3or lo tanto!
contamos :! 1! 2! 5! 6! 7! %! 8! $! H! -! .! (! ,! E " I.
4a conversin entre numeracin binaria " hexadecimal es sencilla. 4o primero que
se hace para una conversin de un n#mero binario a hexadecimal es dividirlo en
grupos de 6 bits! empezando de derecha a izquierda. En caso de que el #ltimo
grupo =el que quede mas a la izquierda> sea menor de 6 bits se rellenan los
faltantes con ceros.
+omando como eemplo el n#mero binario 1:1:11 lo dividimos en grupos de 6 bits "
nos queda:
1:A 1:11
?ellenando con ceros el #ltimo grupo =el de la izquierda>:
::1:A 1:11
,espu/s tomamos cada grupo como un n#mero independiente " consideramos su valor
en decimal:
::1: G 2A 1:11 G 11
3ero como no podemos representar este n#mero hexadecimal como 211 porque ser'a
un error! tenemos que sustituir todos los valores ma"ores a H por su respectiva
representacin en hexadecimal! con lo que obtenemos:
2.@ =,onde la @ representa la base hexadecimal>
3ara convertir un n#mero de hexadecimal a binario solo es necesario invertir
estos pasos: se toma el primer d'gito hexadecimal " se convierte a binario! "
luego el segundo! " as' sucesivamente hasta completar el n#mero.
------------------------------------------------------
9/todos de representacin de datos en una computadora.
-------------------------------------------------------
(digo -&(II
------------
-&(II generalmente se pronuncia JasKiJ! es un acrnimo de -merican &tandard (ode
for Information Interchange.
Este cdigo asigna a las letras del alfabeto! a los d'gitos decimales del : al H
" a varios s'mbolos adicionales un n#mero binario de 8 bits =poni/ndose el bit $
en su estado de apagado o :>.
,e esta forma cada letra! d'gito o caracter especial ocupa un b"te en la memoria
de la computadora.
3odemos observar que este m/todo de representacin de datos es mu" ineficiente
en el aspecto num/rico! "a que en formato binario nos basta un solo b"te para
representar numeros de : a 277! en cambio con el cdigo -&(II un b"te puede
representar unicamente un d'gito.
,ebido a esta ineficiencia! el cdigo -&(II es principalmente utilizado en la
memoria para representar texto.
9etodo .(,
----------
.(, es un acrnimo de .inar" (oded ,ecimal.
En esta notacin se utilizan grupos de 6 bits para representar cada d'gito
decimal del : al H.
(on este m/todo podemos representar dos d'gitos por b"te de informacin.
-#n cuando este m/todo es mucho mas prctico para representacin de n#meros en
la memoria en comparacin al -&(II! todav'a se queda por debao del binario! "a
que con un b"te en el m/todo .(, solo podemos representar d'gitos del : al HH!
en cambio! en formato binario podemos representar todos los d'gitos desde :
hasta 277.
Este formato es utilizado principalmente para representar n#meros mu" grandes en
aplicaciones mercantiles "a que facilita las operaciones con los mismos evitando
errores de redondeo.
?epresentacin de punto flotante
--------------------------------
Esta representacin esta basada en la notacin cient'fica! esto es! representar
un n#mero en dos partes: su mantisa " su exponente.
3oniendo como eemplo el n#mero 1256:::! podemos representarlo como 1.125<1:E%!
en esta #ltima notacin el exponente nos indica el n#mero de espacios que ha"
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 ha" que recorrer el punto decimal hacia la izquierda para obtener
el original.
---------------------------------------
+rabaando con el lenguae ensamblador.
---------------------------------------
3roceso de creacin de un programa
----------------------------------
3ara la creacin de un programa es necesario seguir cinco pasos: ,ise;o del
algoritmo! codificacin del mismo! su traduccin a lenguae mquina! la prueba
del programa " la depuracin.
En la etapa de dise;o se plantea el problema a resolver " se propone la meor
solucin! creando diagramas esquemticos utilizados para el meor planteamiento
de la solucin.
4a codificacin del programa consiste en escribir el programa en alg#n lenguae
de programacinA en este caso espec'fico en ensamblador! tomando como base la
solucin propuesta en el paso anterior.
4a traduccin al lenguae mquina es la creacin del programa obeto! esto es!
el programa escrito como una secuencia de ceros " unos que pueda ser nterpretado
por el procesador.
4a prueba del programa consiste en verificar que el programa funcione sin
errores! o sea! que haga lo que tiene que hacer.
4a #ltima etapa es la eliminacin de las fallas detectadas en el programa
durante la fase de prueba. 4a correccin de una falla normalmente requiere la
repeticin de los pasos comenzando desde el primero o el segundo.
3ara crear un programa en ensamblador existen dos opciones! la primera es
utilizar el 9-&9 =9acro -ssembler! de 9icrosoft>! " la segunda es utilizar el
debugger! en esta primera seccin utilizaremos este #ltimo "a que se encuentra
en cualquier 3( con el sistema operativo 9&-,)&! lo cual lo pone al alcance de
cualquier usuario que tenga acceso a una mquina con estas caracteristicas.
,ebug solo puede crear archivos con extensin .()9! " por las caracter'sticas de
este tipo de programas no pueden ser ma"ores de %6 Kb! adems deben comenzar en
el desplazamiento! offset! o direccin de memoria :1::@ dentro del segmento
espec'fico.
?egistros de la 0(3
-------------------
4a 0(3 tiene 16 registros internos! cada uno de 1% bits. 4os primeros cuatro!
-L! .L! (L! " ,L son registros de uso general " tambien pueden ser utilizados
como registros de $ bits! para utilizarlos como tales es necesario referirse a
ellos como por eemplo: -@ " -4! que son los b"tes alto =high> " bao =loC> del
registro -L. Esta nomenclatura es aplicable tambi/n a los registros .L! (L " ,L.
4os registros son conocidos por sus nombres espec'ficos:
-L -cumulador
.L ?egistro base
(L ?egistro contador
,L ?egistro de datos
,& ?egistro del segmento de datos
E& ?egistro del segmento extra
&& ?egistro del segmento de pila
(& ?egistro del segmento de cdigo
.3 ?egistro de apuntadores base
&I ?egistro 'ndice fuente
,I ?egistro 'ndice destino
&3 ?egistro del apuntador de la pila
I3 ?egistro de apuntador de siguiente instruccin
I ?egistro de banderas
Es posible visualizar los valores de los registros internos de la 0(3 utilizando
el programa ,ebug. 3ara empezar a trabaar con ,ebug digite en el prompt de la
computadora:
(:MN ,ebug OEnterP
En la siguiente linea aparecera un guin! /ste es el indicador del ,ebug! en
este momento se pueden introducir las instrucciones del ,ebug. 0tilizando el
comando:
- r OEnterP
&e desplegaran todos los contenidos de los registros internos de la 0(3A una
forma alternativa de mostrarlos es usar el comando JrJ utilizando como parametro
el nombre del registro cu"o valor se quiera visualizar. 3or eemplo:
- rbx
Esta instruccin desplegar unicamente el contenido del registro .L " cambia el
indicador del ,ebug de J - J a J : J
Estando as' el prompt es posible cambiar el valor del registro que se visualiz
tecleando el nuevo valor " a continuacin OEnterP! o se puede dear el valor
anterior presionando OEnterP 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. (ada bit
del registro tiene un nombre " significado especial! la lista dada a
continuacin describe el valor de cada bit! tanto apagado como prendido " su
relacin con las operaciones del procesador:
)verfloC
*B G no ha" desbordamientoA
)B G s' lo ha"
,irection
03 G hacia adelanteA
,* G hacia atrasA
Interrupts
,I G desactivadasA
EI G activadas
&ign
34 G positivoA
*D G negativo
Qero
*Q G no es ceroA
Q? G s' lo es
-uxiliar" (arr"
*- G no ha" acarreo auxiliarA
-( G ha" acarreo auxiliar
3arit"
3) G paridad nonA
3E G paridad parA
(arr"
*( G no ha" acarreoA
(R G &' lo ha"
4a estructura del ensamblador
-----------------------------
En el lenguae ensamblador las lineas de cdigo constan de dos partes! la
primera es el nombre de la instruccin que se va a eecutar " la segunda son los
parmetros del comando u operandos. 3or eemplo:
add ah bh
-qu' JaddJ es el comando a eecutar =en este caso una adicin> " tanto JahJ como
JbhJ son los parmetros.
El nombre de las instrucciones en este lenguae esta formado por dos! tres o
cuatro letras. a estas instrucciones tambien se les llama nombres mnemnicos o
cdigos de operacin! "a que representan alguna funcin que habr de realizar el
procesador.
Existen algunos comandos que no requieren parametros para su operacin! as' como
otros que requieren solo un parmetro.
-lgunas veces se utilizarn las instrucciones como sigue:
add al!O18:P
4os corchetes en el segundo parmetro nos indican que vamos a trabaar con el
contenido de la casilla de memoria n#mero 18: " no con el valor 18:! a /sto se
le conoce como direccionamiento directo.
*uestro primer programa
-----------------------
Bamos 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 ,ebug! este paso consiste unicamente en teclear
debug OEnterP en el prompt del sistema operativo.
3ara ensamblar un programa en el ,ebug se utiliza el comando JaJ =assemble>A
cuando se utiliza este comando se le puede dar como parametro la direccin donde
se desea que se inicie el ensamblado.
&i se omite el parametro el ensamblado se iniciar en la localidad especificada
por (&:I3! usualmente :1::@! que es la localidad donde deben iniciar los
programas con extensin .()9! " sera la localidad que utilizaremos debido a que
debug solo puede crear este tipo espec'fico de programas.
-unque en este momento no es necesario darle un parametro al comando JaJ es
recomendable hacerlo para evitar problemas una vez que se haga uso de los
registros (&:I3! por lo tanto tecleamos:
- a:1:: OEnterP
-l hacer /sto aparecer en la pantalla algo como: :(1.::1:: " el cursor se
posiciona a la derecha de estos n#meros! ntese que los primeros cuatro d'gitos
=en sistema hexagesimal> pueden ser diferentes! pero los #ltimos cuatro deben
ser :1::! "a que es la direccin que indicamos como inicio. -hora podemos
introducir las instrucciones:
:(1.::1:: mov ax!:::2 Acoloca el valor :::2 en el registro ax
:(1.::1:5 mov bx!:::6 Acoloca el valor :::6 en el registro bx
:(1.::1:% add ax!bx Ale adiciona al contenido de ax el contenido de bx
:(1.::1:$ int 2: A provoca la terminacin del programa.
:(1.::1:-
*o es necesario escribir los comentarios que van despues del JAJ. 0na vez
digitado el #ltimo comando! int 2:! se le da OEnterP sin escribir nada mas! para
volver al prompt del debuger.
4a #ltima linea escrita no es propiamente una instruccin de ensamblador! es una
llamada a una interrupcin del sistema operativo! estas interrupciones sern
tratadas mas a fondo en un cap'tulo posterior! por el momento solo es necesario
saber que nos ahorran un gran n#mero de lineas " son mu" #tiles para accesar a
funciones del sistema operativo.
3ara eecutar el programa que escribimos se utliza el comando JgJ! al utilizarlo
veremos que aparece un mensae que dice: J3rogram terminated normall"J.
*aturalmente con un mensae como /ste no podemos estar seguros que el programa
ha"a hecho la suma! pero existe una forma sencilla de verificarlo! utilizando el
comando JrJ del ,ebug podemos ver los contenidos de todos los registros del
procesador! simplemente teclee:
- r OEnterP
-parecera en pantalla cada registro con su respectivo valor actual:
-LG:::%.LG:::6(LG::::,LG::::&3GIIEE.3G::::&IG::::,IG::::
,&G:(1.E&G:(1.&&G:(1.(&G:(1.I3G:1:- *B 03 EI 34 *Q *- 3) *(
:(1.::1:- :I ,. oI
Existe la posibilidad de que los registros contengan valores diferentes! pero -L
" .L deben ser los mismos! "a que son los que acabamos de modificar.
)tra forma de ver los valores! mientras se eecuta el programa es utilizando
como parmetro para JgJ la direccin donde queremos que termine la eecucin "
muestre los valores de los registros! en este caso ser'a: g1:$! esta instruccin
eecuta el programa! se detiene en la direccin 1:$ " muestra los contenidos de
los registros.
+ambi/n se puede llevar un seguimiento de lo que pasa en los registros tilizando
el comando JtJ =trace>! la funcin de este comando es eecutar linea por linea
lo que se ensambl mostrando cada vez los contenidos de los regitros.
3ara salir del ,ebug se utiliza el comando JqJ =quit>.
Duardar " cargar los programas
------------------------------
*o ser'a prctico tener que digitar todo un programa cada vez que se necesite!
para evitar eso es posible guardar un programa en el disco! con la enorme
ventaa de que "a ensamblado no ser necesario correr de nuevo debug para
eecutarlo.
4os pasos a seguir para guardar un programa "a almacenado en la memoria son:
)btener la longitud del programa restando la direccin final de la direccin
inicial! naturalmente en sistema hexadecimal. ,arle un nombre al programa "
extensin 3oner la longitud del programa en el registro (L )rdenar a ,ebug que
escriba el programa en el disco.
0tilizando como eemplo el programa del cap'tulo anterior tendremos una idea mas
clara de como llevar estos pasos:
-l terminar de ensamblar el programa se ver'a as':
:(1.::1:: mov ax!:::2
:(1.::1:5 mov bx!:::6
:(1.::1:% add ax!bx
:(1.::1:$ int 2:
:(1.::1:-
- h 1:a 1::
:2:a :::a
- n prueba.com
- rcx
(L ::::
::::a
-C
Sriting :::- b"tes
3ara obtener la longitud de un programa se utiliza el comando JhJ! el cual nos
muestra la suma " resta de dos n#meros en hexadecimal. 3ara obtener la longitud
del nuestro le proporcionamos como parmetros el valor de la direccin final de
nuestro programa =1:-> " el valor de la direccin inicial =1::>. El primer
resultado que nos muestra el comando es la suma de los parmetros " el segundo
es la resta.
El comando JnJ nos permite poner un nombre al programa.
El comando JrcxJ nos permite cambiar el contenido del registro (L al valor que
obtuvimos del tama;o del archivo con JhJ! en este caso :::a! "a que nos interesa
el resultado de la resta de la direccin inicial a la direccin final.
3or #ltimo el comando C escribe nuestro programa en el disco! indicandonos
cuantos b"tes escribi.
3ara cargar un archivo "a guardado son necesarios dos pasos:
3roporcionar el nombre del archivo que se cargar.
(argarlo utilizando el comando JlJ =load>.
3ara obtener el resultado correcto de los siguientes pasos es necesario que
previamente se ha"a creado el programa anterior.
,entro del ,ebug escribimos lo siguiente:
- n prueba.com
- l
- u 1:: 1:H
:(5,::1:: .$:2:: 9)B -L!:::2
:(5,::1:5 ..:6:: 9)B .L!:::6
:(5,::1:% :1,$ -,, -L!.L
:(5,::1:$ (,2: I*+ 2:
El #ltimo comando! JuJ! se utiliza para verificar que el programa se carg en
memoria! lo que hace es desensamblar el cdigo " mostrarlo "a desensamblado. 4os
parmetros le indican a ,ebug desde donde " hasta donde desensamblar.
,ebug siempre carga los programas en memoria en la direccin 1::@! a menos que
se le indique alguna otra.
(ondiciones! ciclos " bifurcaciones
-----------------------------------
Estas estructuras! o formas de control le dan a la mquina un cierto grado de
desicin basado en la informacin que recibe.
4a forma mas sencilla de comprender este tema es por medio de eemplos.
Bamos a crear tres programas que hagan lo mismo: desplegar un n#mero determinado
de veces una cadena de caracteres en la pantalla.
- a1::
:(1.::1:: mp 127 A brinca a la direccin 127@
:(1.::1:2 OEnterP
- e 1:2 '(adena a visualizar 17 veces' :d :a 'T'
- a127
:(1.::127 9)B (L!:::I A veces que se desplegara la cadena
:(1.::12$ 9)B ,L!:1:2 A copia cadena al registro ,L
:(1.::12. 9)B -@!:H A copia valor :H al registro -@
:(1.::12, I*+ 21 A despliega cadena
:(1.::12I 4))3 :12, A si (LN: brinca a :12,
:(1.::151 I*+ 2: A termina el programa.
3or medio del comando JeJ es posible introducir una cadena de caracteres en una
determinada localidad de memoria! dada como parmetro! la cadena se introduce
entre comillas! le sigue un espacio! luego el valor hexadecimal del retorno de
carro! un espacio! el valor de linea nueva " por #ltimo el s'mbolo 'T' que el
ensamblador interpreta como final de la cadena. 4a interrupcin 21 utiliza el
valor almacenado en el registro -@ para eecutar una determinada funcin! en
este caso mostrar la cadena en pantalla! la cadena que muestra es la que est
almacenada en el registro ,L. 4a instruccin 4))3 decrementa automaticamente el
registro (L en uno " si no ha llegado el valor de este registro a cero brinca a
la casilla indicada como parmetro! lo cual crea un ciclo que se repite el
n#mero de veces especificado por el valor de (L. 4a interrupcin 2: termina la
eecucin del programa.
)tra forma de realizar la misma funcin pero sin utilizar el comando 4))3 es la
siguiente:
- a1::
:(1.::1:: mp 127 A brinca a la direccin 127@
:(1.::1:2 OEnterP
- e 1:2 '(adena a visualizar 17 veces' :d :a 'T'
- a127
:(1.::127 9)B .L!:::I A veces que se desplegara la cadena
:(1.::12$ 9)B ,L!:1:2 A copia cadena al registro ,L
:(1.::12. 9)B -@!:H A copia valor :H al registro -@
:(1.::12, I*+ 21 A despliega cadena
:(1.::12I ,E( .L A decrementa en 1 a .L
:(1.::15: U*Q :12, A si .L es diferente a : brinca a :12,
:(1.::152 I*+ 2: A termina el programa.
En este caso se utiliza el registro .L como contador para el programa! " por
medio de la instruccin J,E(J se disminu"e su valor en 1. 4a instruccin JU*QJ
verifica si el valor de . es diferente a :! esto con base en la bandera *Q! en
caso afirmativo brinca hacia la direccin :12,. En caso contrario contin#a la
eecucin normal del programa " por lo tanto se termina.
0na #tima variante del programa es utilizando de nuevo a (L como contador! pero
en lugar de utilizar 4))3 utilizaremos decrementos a (L " comparacin de (L a :.
- a1::
:(1.::1:: mp 127 A brinca a la direccin 127@
:(1.::1:2 OEnterP
- e 1:2 '(adena a visualizar 17 veces' :d :a 'T'
- a127
:(1.::127 9)B ,L!:1:2 A copia cadena al registro ,L
:(1.::12$ 9)B (L!:::I A veces que se desplegara la cadena
:(1.::12. 9)B -@!:H A copia valor :H al registro -@
:(1.::12, I*+ 21 A despliega cadena
:(1.::12I ,E( (L A decrementa en 1 a (L
:(1.::15: U(LQ :156 A si (L es igual a : brinca a :156
:(1.::152 U93 :12, A brinca a la direcciVoauteAn :12,
:(1.::156 I*+ 2: A termina el programa
En este eemplo se us la instruccin U(LQ para controlar la condicin de salto!
el significado de tal funcin es: brinca si (LG:
El tipo de control a utilizar depender de las necesidades de programacin en
determinado momento.
Interrupciones
--------------
,efinicin de interrupcin:
0na interrupcin es una instruccin que detiene la eecucin de un programa
para permitir el uso de la 0(3 a un proceso prioritario. 0na vez concluido este
#ltimo proceso se devuelve el control a la aplicacin anterior.
3or eemplo! cuando estamos trabaando con un procesador de palabras " en ese
momento llega un aviso de uno de los puertos de comunicaciones! se detiene
temporalmente la aplicacin que estabamos utilizando para permitir el uso del
procesador al maneo de la informacin que est llegando en ese momento. 0na vez
terminada la transferencia de informacin se reanudan las funciones normales del
procesador de palabras.
4as interrupciones ocurren mu" seguido! sencillamente la interrupcin que
actualiza la hora del d'a ocurre aproximadamente 1$ veces por segundo. 3ara
lograr administrar todas estas interrupciones! la computadora cuenta con un
espacio de memoria! llamado memoria baa! donde se almacenan las direcciones de
cierta localidad de memoria donde se encuentran un uego de instrucciones que la
0(3 eecutar para despues regresar a la aplicacin en proceso.
En los programas anteriores hicimos uso de la interrupcion n#mero 2:@ para
terminar la eecucin de nuestros programas! ahora utilizaremos otra
interrupcin para mostrar informacin en pantalla:
0tilizando ,ebug tecleamos:
- a1::
2(1.::1:: U93 :11,
2(1.::1:2 OE*+E?P
- E 1:2 '@ola! como estas.' :, :- 'T'
- -:11,
2(1.::11, 9)B ,L!:1:2
2(1.::12: 9)B -@!:H
2(1.::122 I*+ 21
2(1.::125 I*+ 2:
En este programa la interrupcin 21@ manda al monitor la cadena localizada en la
direccin a la que apunta el registro ,L.
El valor que se le da a -@ determina cual de las opciones de la interrupcin 21@
sera utilizada! "a que esta interrupcin cuenta con varias opciones.
El maneo directo de interrupciones es una de las partes mas fuertes del
lenguae ensamblador! "a que con ellas es posible controlar eficientemente todos
los dispositivos internos " externos de una computadora gracias al completo
control que se tiene sobre operaciones de entrada " salida.
0*I,-, 2.- 3rogramacin en ensamblador
--------------------------------------
- ?equerimientos para la programacin en ensamblador.
- &oftCare necesario.
- 0tilizacin del 9-&9
- 0so del enlazador =linKer>
- Iormato de un programa en ensamblador.
- Iormato interno
- Iormato externo
- Eemplo prctico de un programa
- 3roceso de ensamblado.
- &egmentos
- +abla de s'mbolos
- +ipos de instrucciones.
- 9ovimiento de datos
- )peraciones lgicas " aritm/ticas
- &altos! ciclos " procedimientos
&oftCare necesario
3ara poder crear un programa se requieren varias herramientas:
3rimero un editor para crear el programa fuente. &egundo un compilador que no es
mas que un programa que JtraduceJ el programa fuente a un programa obeto. R
tercero un enlazador o linKer! que genere el programa eecutable a partir del
programa obeto.

El editor puede ser cualquier editor de textos que se tenga a la mano! como
compilador utilizaremos el 9-&9 =macro ensamblador de 9icrosoft> "a que es
el mas com#n! " como enlazador utilizaremos el programa linK.
4a extensin usada para que 9-&9 reconozca los programas fuente en
ensamblador es .-&9A una vez traducido el programa fuente! el 9-&9 crea un
archivo con la extensin .).U! este archivo contiene un Jformato intermedioJ
del programa! llamado as' porque aun no es eecutable pero tampoco es "a un
programa en lenguae fuente. El enlazador genera! a partir de un archivo
.).U o la combinacin de varios de estos archivos! un programa executable!
cu"a extensin es usualmente .ELE aunque tambi/n puede ser .()9! dependiendo de
la forma en que se ensambl.
Este tutorial describe la forma de trabaar con la versin 7.: o posterior
del 9-&9! la diferencia principal de esta versin con otras anteriores es la
forma en que se declaran los segmentos de cdigo! datos " la pila! pero la
estructura de programacin es la misma.
0tilizacin del 9-&9
0na vez que se cre el programa obeto se debe pasar al 9-&9 para crear el
cdigo intermedio! el cual queda guardado en un archivo con extensin .).U.
El comando para realizar esto es:
9-&9 *ombreW-rchivoA OEnterP
,onde *ombreW-rchivo es el nombre del programa fuente con extensin .-&9 que se
va a traducir.
El punto " coma utilizados despues del nombre del archivo le indican al macro
ensamblador que genere directamente el codigo intermedio! de omitirse este
caracter el 9-&9 pedir el nombre del archivo a traducir! el nombre del archivo
que se generar as' como opciones de listado de informacin que puede
proporcionar el traductor.
Es posible eecutar el 9-&9 utilizando parmetros para obtener un fin
determinado! toda la lista de los mismos se encuentra en el manual del
programa. &olo recordar/ en este tutorial la forma de pasar dichos
parmetros al 9-&9:
+odo parmetro va despues del simbolo J/J. Es posible utilizar varios
parmetros a la vez. 0na vez tecleados todos los parmetros se escribe el
nombre del archivo a ensamblar. 3or eemplo! si queremos que el 9-&9
ensamble un programa llamado prueba! " ademas deseamos que despliege el
numero de lineas fuente " s'mbolos procesados =eso lo realiza con el
parametro /v>! " si ocurre un error que nos diga en que linea ocurri =con
el parametro /z>! entonces tecleamos:
9-&9 /v /z pruebaA
0so del enlazador =linKer>
El 9-&9 unicamente puede crear programas en formato .).U! los cuales no son
eecutables por si solos! es necesario un enlazador que genere el cdigo
eecutable.
4a utilizacin del enlazador es mu" parecida a la del 9-&9! unicamente se
teclea en el indicador del ,)&:
4I*X *ombreW-rchivo A
,onde *ombreW-rchivo es el nombre del programa intermedio =).U>. Esto
generara directamente un archivo con el nombre del programa intermedio " la
extensin .ELE
Iormato interno de un programa
3ara poder comunicarnos en cualquier lenguae! inclu"endo los lenguaes de
programacin! es necesario seguir un conunto 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 lenguae ensamblador! enfocandonos a la forma de
escribir las instrucciones para que el ensamblador sea capaz de
interpretarlas.
.asicamente el formato de una linea de cdigo en lenguae ensamblador consta
de cuatro partes:
Etiqueta! variable o constante: *o siempre es definida! si se define
es necesario utilizar separadores para diferenciarla de las otras partes!
usualmente espacios! o alg#n simbolo especial.
,irectiva o instruccin: es el nombre con el que se conoce a la
instruccin que queremos que se eecute.
)perando=s>: la ma"oria de las instrucciones en ensamblador trabaan
con dos operandos! aunque ha" instrucciones que funcionan solo con uno. El
primero normalmente es el operando destino! que es el depsito del resultado
de alguna operacinA " el segundo es el operando fuente! que lleva el dato
que sera procesado. 4os operandos se separan uno del otro por medio de una
coma J!J.
(omentario: como su nombre lo indica es tan solo un escrito informativo! usado
principalmente para explicar que est haciendo el programa en determinada lineaA
se separa de las otras partes por medio de un punto " coma JAJ. Esta parte no es
necesaria en el programa! pero nos a"uda a depurar el programa en caso de
errores o modificaciones.
(omo eemplo podemos ver una linea de un programa escrito en ensamblador:
Etiq1: 9)B -L!::1-@ A Inicializa -L con el valor ::1-
-qui tenemos la etiqueta JEtiq1J =Identificable como etiqueta por el simbolo
final J:J>! la instruccin J9)BJ! " los operandos J-LJ como destino " J::1-J
como fuente! ademas del comentario que sigue despues del JAJ.
0n eemplo de una declaracin de una constante esta dado por:
0*) EY0 :::1@
,onde J0*)J es el nombre de la constante que definimos! JEY0J es la
directiva utilizada para usar a J0*)J como constante! " J:::1@J es el
operando! que en este caso sera el valor que guarde 0*).
Iormato Externo de un programa
-demas de definir ciertas reglas para que el ensamblador pueda entender una
instruccin es necesario darle cierta informacin de los recursos que se van
a utilizar! como por eemplo los segmentos de memoria que se van a utilizar!
datos iniciales del programa " tambien donde inicia " donde termina nuestro
cdigo.
0n programa sencillo puede ser el siguiente:
.9),E4 &9-44
.(),E
3rograma:
9)B -L!6(::@
I*+ 21@
.&+-(X
E*, 3rograma
El programa realmente no hace nada! unicamente coloca el valor 6(::@ en el
registro -L! para que la interrupcin 21@ termine el programa! pero nos da
una idea del formato externo en un programa de ensamblador.
4a directiva .9),E4 define el tipo de memoria que se utilizarA la directiva
.(),E nos indica que lo que esta a continuacin es nuestro programaA la
etiqueta 3rograma indica al ensamblador el inicio del programaA la directiva
.&+-(X le pide al ensamblador que reserve un espacio de memoria para las
operaciones de la pilaA la instruccin E*, 3rograma marca el final del
programa.
Eemplo prctico de un programa
-qui se eemplificar un programa que escriba una cadena en pantalla:
.9),E4 &9-44
.(),E
3rograma:
9)B -L! Z,-+-
9)B ,&! -L
9)B ,L! )ffset +exto
9)B -@! H
I*+ 21@
9)B -L!6(::@
I*+ 21@
.,-+-
+exto ,. '9ensae en pantalla.T'
.&+-(X
E*, 3rograma
4os primeros pasos son iguales a los del programa anterior: se define el
modelo de memoria! se indica donde inicia el cdigo del programa " en donde
comienzan las instrucciones.
- continuacin se coloca Z,-+- en el registro -L para despues pasarlo al
registro ,& "a que no se puede copiar directamente una constante a un
registro de segmento. El contenido de Z,-+- es el n#mero del segmento que
ser utilizado para los datos. 4uego se guarda en el registro ,L un valor dado
por J)ffset +extoJ que nos da la direccin donde se encuentra la cadena de
caracteres en el segmento de datos. 4uego utiliza la opcin H =,ada por el valor
de -@> de la interrupcin 21@ para desplegar la cadena posicionada en la
direccin que contiene ,L. 3or #ltimo utiliza la opcin 6(@ de la interrupcin
21@ para terminar la eecucin del programa =aunque cargamos al registro -L el
valor 6(::@ la interrupcin 21@ solo toma como opcin el contenido del registro
-@>.
4a directiva .,-+- le indica al ensamblador que lo que est escrito a
continuacin debe almacenarlo en el segmento de memoria destinado a los
datos. 4a directiva ,. es utilizada para ,efinir ."tes! /sto es! asignar a
cierto identificador =en este caso J+extoJ> un valor! "a sea una constante o
una cadena de caracteres! en este #ltimo caso deber estar entre comillas
sencillas ' " terminar con el simbolo JTJ.
&egmentos
4a arquitectura de los procesadores x$% obliga al uso de segmentos de
memoria para manear la informacin! el tama;o de estos segmentos es de
%6Kb.
4a razn de ser de estos segmentos es que! considerando que el tama;o mximo de
un n#mero que puede manear el procesador esta dado por una palabra de 1% bits o
registro! no ser'a posible accesar a ms de %775% 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 %775% localidades! " utilizamos una direccin
en un registro exclusivo para localizar cada segmento! " entonces cada direccin
de una casilla espec'fica la formamos
con dos registros! nos es posible accesar a una cantidad de 62H6H%82H% b"tes
de memoria! lo cual es! en la actualidad! ms memoria de la que veremos
instalada en una 3(.
3ara que el ensamblador pueda manear los datos es necesario que cada dato o
instruccin se encuentren localizados en el rea que corresponde a sus
respectivos segmentos. El ensamblador accesa a esta informacin tomando en
cuenta la localizacin del segmento! dada por los registros ,&! E&! && " (&!
" dentro de dicho registro la direccin del dato espec'fico. Es por ello que
cuando creamos un programa empleando el ,ebug en cada linea que vamos
ensamblando aparce algo parecido a lo siguiente:
1(.:::1:2 9)B -L!.L
En donde el primer n#mero! 1(.:! corresponde al segmento de memoria que se est
utilizando! el segundo se refiere la la direccin dentro de dicho
segmento! " a continuacin aparecen las instrucciones que se almacenaran a
partir de esa direccin.
4a forma de indicarle al ensamblador con cuales de los segmentos se va a
trabaar es por medio de las directivas .(),E! .,-+- " .&+-(X.
El ensamblador se encarga de austar el tama;o de los segmentos tomando como
base el n#mero de b"tes que necesita cada instruccin que va ensamblando! "a que
ser'a un desperdicio de memoria utilizar los segmentos completos. 3or eemplo!
si un programa unicamente necesita 1:Kb para almacenar los datos! el segmento de
datos unicamente sera de 1:Kb " no de los %6Kb que puede manear.
+abla de s'mbolos
- cada una de las partes de una linea de cdigo en ensamblador se le conoce
como toKen! por eemplo en la linea de cdigo
9)B -L!Bar
tenemos tres toKens! la instruccin 9)B! el operando -L! " el operando B-?.
El ensamblador lo que hace para generar el cdigo ).U es leer cada uno de
los toKens " buscarlo en una tabla interna de JequivalenciasJ conocida como
tabla de palabras reservadas! que es donde se encuentran todos los
significados de los mnemnicos que utilizamos como instrucciones.
&iguiendo este proceso! el ensamblador lee 9)B! lo busca en su tabla " al
encontrarlo lo identifica como una instruccin del procesador! asi mismo lee
-L " lo reconoce como un registro del procesador! pero al momento de buscar
el toKen Bar en la tabla de palabras reservadas no lo encuentra " entonces
lo busca en la tabla de s'mbolos que es una tabla donde se encuentran los
nombres de las variables! constantes " etiquetas utilizadas en el programa
donde se inclu"e su direccin en memoria " el tipo de datos que contiene.
-lgunas 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 "
colocarlo en la tabla de s'mbolos. Existen s'mbolos que no los va a
encontrar "a que no pertenecen a ese segmento " el programa no sabe en que
parte de la memoria se encontrara dicho segmento! en este momento entra en
accin el enlazador! el cual crea la estructura que necesita el cargador
para que el segmento " el toKen sean definidos cuando se cargue el programa
" antes de que el mismo sea eecutado.
9ovimiento de datos
En todo programa es necesario mover datos en la memoria " en los registros
de la 0(3A 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 sueto a reglas " restricciones. -lgunas de
ellas son las que se citan a continuacin.
*o 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 " luego del registro a la localidad destino.
*o se puede mover una constante directamente a un registro de
segmentos! primero se debe mover a un registro de la 0(3.
Es posible mover bloques de datos por medio de las instrucciones movs! que
copia una cadena de b"tes o palabrasA movsb que copia n b"tes de una
localidad a otraA " movsC copia n palabras de una localidad a otra. 4as dos
#ltimas instrucciones toman los valores de las direcciones definidas por
,&:&I como grupo de datos a mover " E&:,I como nueva localizacin de los
datos.
3ara mover los datos tambien existen las estructuras llamadas pilas! en este
tipo de estructuras los datos se introducen con la instruccin push " se
extraen con la instruccin pop
En una pila el primer dato introducido es el #ltimo que podemos sacar! esto
es! si en nuestro programa utilizamos las instrucciones:
30&@ -L
30&@ .L
30&@ (L
3ara devolver los valores correctos a cada registro al momento de sacarlos
de la pila es necesario hacerlo en el siguiente orden:
3)3 (L
3)3 .L
3)3 -L
3ara la comunicacin con dispositivos externos se utilizan el comando out
para mandar informacin a un puerto " el comando in para leer informacin
recibida desde algun puerto.
4a sintaxis del comando out es:
)0+ ,L!-L

,onde ,L contiene el valor del puerto que se utilizar para la comunicacin
" -L contiene la informacin que se mandar.
4a sintaxis del comando in es:
I* -L!,L
,onde -L es el registro donde se guardar la informacin que llegue " ,L
contiene la direccin del puerto por donde llegar la informacin.
)peraciones lgicas " aritm/ticas
4as instrucciones de las operaciones lgicas son: and! not! or " xor! /stas
trabaan sobre los bits de sus operandos.
3ara verificar el resultado de operaciones recurrimos a las instrucciones
cmp " test.
4as instrucciones utilizadas para las operaciones algebraicas son: para
sumar add! para restar sub! para multiplicar mul " para dividir div.
(asi todas las instrucciones de comparacin estn basadas en la informacin
contenida en el registro de banderas. *ormalmente las banderas de este
registro que pueden ser directamente manipuladas por el programador son la
bandera de direccin de datos ,I! usada para definir las operaciones sobre
cadenas. )tra que tambien puede ser manipulada es la bandera II por medio de las
instrucciones sti " cli! para activar " desactivar respectivamente las
interrupciones.
&altos! ciclos " procedimientos
4os saltos incondicionales en un programa escrito en lenguae ensamblador
estn dados por la instruccin mp! un salto es alterar el fluo de la
eecucin de un programa enviando el control a la direccin indicada.
0n ciclo! conocido tambien como iteracin! es la repeticin de un proceso un
cierto n#mero de veces hasta que alguna condicin se cumpla. En estos ciclos
se utilizan los brincos JcondicionalesJ basados en el estado de las
banderas. 3or eemplo la instruccin nz que salta solamente si el resultado
de una operacin es diferente de cero " la instruccin z que salta si el
resultado de la operacin es cero.
3or #ltimo tenemos los procedimientos o rutinas! que son una serie de pasos
que se usaran repetidamente en el programa " en lugar de escribir todo el
conunto de pasos unicamente se les llama por medio de la instruccin call.
0n procedimiento en ensamblador es aquel que inicie con la palabra 3roc "
termine con la palabra ret.
?ealmente lo que sucede con el uso de la instruccin call es que se guarda
en la pila el registro I3 " se carga la direccin del procedimiento en el
mismo registro! conociendo que I3 contiene la localizacin de la siguiente
instruccin que eecutara la 0(3! entonces podemos darnos cuenta que se
desv'a el fluo del programa hacia la direccin especificada en este
registro. -l momento en que se llega a la palabra ret se saca de la pila el
valor de I3 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 (& =que nos indica que segmento se est
utilizando> es empuado tambi/n en la pila.
Instrucciones de operacin sobre datos
Instrucciones de transferencia
&on utilizadas para mover los contenidos de los operandos. (ada instruccin
se puede usar con diferentes modos de direccionamiento.
9)B
9)B& =9)B&.> =9)B&S>
Instrucciones de carga
&on instrucciones espec'ficas de los registros. &on usadas para cargar en
alg#n registro b"tes o cadenas de b"tes.
4),& =4),&.> =4),&S>
4-@I
4,&
4E-
4E&
Instrucciones de la pila
Estas instrucciones permiten el uso de la pila para almacenar " extraer
datos.
3)3
3)3I
30&@
30&@I
Instruccin 9)B
3ropsito: +ransferencia de datos entre celdas de memoria! registros "
acumulador.
&intaxis:
9)B ,estino!Iuente
,onde ,estino es el lugar a donde se movern los datos " fuente es el lugar
donde se encuentran dichos datos.
4os diferentes movimientos de datos permitidos para esta instruccin son:
,estino: memoria. Iuente: acumulador
,estino: acumulador. Iuente: memoria
,estino: registro de segmento. Iuente: memoria/registro
,estino: memoria/registro. Iuente: registro de segmento
,estino: registro. Iuente: registro
,estino: registro. Iuente: memoria
,estino: memoria. Iuente: registro
,estino: registro. Iuente: dato inmediato
,estino: memoria. Iuente: dato inmediato
Eemplo:
9)B -L!:::%h
9)B .L!-L
9)B -L!6(::h
I*+ 21@
Este peque;o programa mueve el valor :::%@ al registro -L! luego mueve el
contenido de -L =:::%h> al registro .L! por #ltimo mueve el valor 6(::h al
registro -L para terminar la eecucin con la opcin 6( de la interrupcin
21h.
Instruccin 9)B& =9)B&.> =9)B&S>
3ropsito: 9over cadenas de b"tes o palabras desde la fuente! direccionada
por &I! hasta el destino direccionado por ,I.
&intaxis:
9)B&
Este comando no necesita parametros "a que toma como direccin fuente el
contenido del registro &I " como destino el contenido de ,I. 4a secuencia de
instrucciones siguiente ilustran esto:
9)B &I! )II&E+ B-?1
9)B ,I! )II&E+ B-?2
9)B&
3rimero inicializamos los valores de &I " ,I con las direcciones de las
variables B-?1 " B-?2 respectivamente! despues al eecutar 9)B& se copia el
contenido de B-?1 a B-?2.
4os comandos 9)B&. " 9)B&S se utilizan de la misma forma que 9)B&! el
primero mueve un b"te " el segundo una palabra.
Instruccin 4),& =4),&.> =4),&S>
3ropsito: (argar cadenas de un b"te o palabra al acumulador.
&intaxis:
4),&
Esta instruccin toma la cadena que se encuentre en la direccin especificada
por &I! la carga al registro -4 =o -L> " suma o resta 1 =segun el estado de ,I>
a &I si la transferencia es de b"tes o 2 si la transferencia es de palabras.
9)B &I! )II&E+ B-?1
4),&
4a primer linea carga la direccin de B-?1 en &I " la segunda linea lleva el
contenido de esa localidad al registro -4.
4os comandos 4),&. " 4),&S se utilizan de la misma forma! el primero carga
un b"te " el segundo una palabra =utiliza el registro completo -L>.
Instruccin 4-@I
3ropsito: +ransfiere al registro -@ el contenido de las banderas
&intaxis:
4-@I
Esta instruccin es #til para verificar el estado de las banderas durante la
eecucin de nuestro programa.
4as banderas quedan en el siguiente orden dentro del registro:
&I QI [\ -I [\ 3I [\ (I
El simbolo J[\J significa que en esos bits habr. un valor indefinido.
Instruccin 4,&
3ropsito: (argar el registro del segmento de datos
&intaxis:
4,& destino! fuente
El operando fuente debe ser una palabra doble en memoria. 4a palabra
asociada con la direccin mas grande es transferida a ,&! o sea que se toma
como la direccin del segmento. 4a palabra asociada con la direccin menor
es la direccin del desplazamiento " se deposita en el registro se;alado
como destino.
Instruccin 4E-
3ropsito: (arga la direccin del operando fuente.
&intaxis:
4E- destino! fuente
El operando fuente debe estar ubicado en memoria! " se coloca su
desplazamiento en el registro 'ndice o apuntador especificado en destino.
3ara ilustrar una de las facilidades que tenemos con este comando pongamos
una equivalencia:
9)B &I! )II&E+ B-?1
Equivale a:
4E- &I! B-?1
Es mu" probable que para el programador sea mas sencillo crear programas
extensos utilizando este #ltimo formato.
Instruccin 4E&
3ropsito: (arga el registro del segmento extra
&intaxis:
4E& destino! fuente
El operando fuente debe ser un operando en memoria de palabra doble. El
contenido de la palabra con la direccin ma"or se interpreta como la
direccin del segmento " se coloca en E&. 4a palabra con la direccin menor
es la direccin del desplazamiento " se coloca en el registro especificado
en el parmetro destino.
Instruccin 3)3
3ropsito: ?ecupera un dato de la pila
&intaxis:
3)3 destino
Esta instruccin transfiere el #ltimo valor almacenado en la pila al
operando destino! despues incrementa en dos el registro &3.
Este incremento se debe a que la pila va creciendo desde la direccin mas
alta de memoria del segmento hacia la mas baa! " la pila solo trabaa con
palabras =2 b"tes>! entonces al incrementar en dos el registro &3 realmente
se le esta restando dos al tama;o real de la pila.
Instruccin 3)3I
3ropsito: Extrae las banderas almacenadas en la pila.
&intaxis:
3)3I
Este comando transfiere bits de la palabra almacenada en la parte superior
de la pila hacia el registro de banderas.
4a forma de transferencia es la siguiente:
.I+ .-*,E?-
: (I
2 3I
6 -I
% QI
8 &I
$ +I
H II
1: ,I
11 )I
Estas localizaciones son las mismas para el comando 30&@I
0na vez hecha la transferencia se incrementa en 2 el registro &3
disminu"endo as' el tama;o de la pila.
Instruccin 30&@
3ropsito: (oloca una palabra en la pila.
&intaxis:
30&@ fuente
4a instruccin 30&@ decrementa en dos el valor de &3 " luego transfiere el
contenido del operando fuente a la nueva direccin resultante en el registro
reci/n modificado.
El decremento en la direccin se debe a que al agregar valores a la pila
/sta crece de la direccin ma"or a la direccin menor del segmento! por lo
tanto al restarle 2 al valor del registro &3 lo que hacemos es aumentar el
tama;o de la pila en dos b"tes! que es la #nica cantidad de informacin que
puede manear la pila en cada entrada " salida de datos.
Instruccin 30&@I
3ropsito: (oloca el valor de las banderas en la pila
&intaxis:
30&@I
Este comando decrementa en 2 el valor del registro &3 " luego se transfiere
el contenido del registro de banderas a la pila! en la direccin indicada
por &3.
4as banderas quedan almacenadas en memoria en los mismos bits indicados en
el comando 3)3I
Instrucciones lgicas " aritm/ticas
Instrucciones lgicas.
&on utilizadas para realizar operaciones lgicas sobre los operandos.
-*,
*ED
*)+
)?
+E&+
L)?
Instrucciones aritm/ticas.
&e usan para realizar operaciones aritm/ticas sobre los operandos.
-,(
-,,
,IB
I,IB
904
I904
&..
&0.
Instruccin -*,
3ropsito: ?ealiza la conuncin de los operandos bit por bit.
&intaxis:
-*, destino! fuente
(on esta instruccin se lleva a cabo la operacin J"J lgica de los dos
operandos:
Iuente ,estino ] ,estino
--------------------------
1 1 ] 1
1 : ] :
: 1 ] :
: : ] :
El resultado de la operacin se almacena en el operando destino.

Instruccin *ED

3ropsito: Denera el complemento a 2
&intaxis:
*ED destino
Esta instruccin genera el complemento a 2 del operando destino " lo
almacena en este mismo operando. 3or eemplo! si -L guarda el valor de
1256@! entonces:
*ED -L
*os dear'a almacenado en el registro -L el valor E,((@.
Instruccin *)+
3ropsito: 4leva a cabo la negacin bit por bit del operando destino.
&intaxis:
*)+ destino
El resultado se guarda en el mismo operando destino.
Instruccin )?
3ropsito: )? inclusivo lgico
&intaxis:
)? destino! fuente
4a instruccin )? lleva a cabo! bit por bit! la dis"uncin inclusiva lgica
de los dos operandos:
Iuente ,estino ] ,estino
--------------------------
1 1 ] 1
1 : ] 1
: 1 ] 1
: : ] :

Instruccin +E&+
3ropsito: (omparar logicamente los operandos
&intaxis:
+E&+ destino! fuente
?ealiza una conuncin! bit por bit! de los operandos! pero a diferencia de
-*, esta instruccin no coloca el resultado en el operando destino! solo
tiene efecto sobre el estado de las banderas.
Instruccin L)?
3ropsito: )? exclusivo
&intaxis:
L)? destino! fuente
&u funcin es efectuar bit por bit la dis"uncin exclusiva lgica de los dos
operandos.
Iuente ,estino ] ,estino
--------------------------
1 1 ] :
: : ] 1
: 1 ] 1
: : ] :
Instruccin -,(
3ropsito: -dicin con acarreo.
&intaxis:
-,( destino! fuente
4leva a cabo la suma de dos operandos " suma uno al resultado en caso de que
la bandera (I est/ activada! esto es! en caso de que exista acarreo.
El resultado se guarda en el operando destino.
Instruccin -,,
3ropsito: -dicin de los operandos.
&intaxis:
-,, destino! fuente
&uma los dos operandos " guarda el resultado en el operando destino.
Instruccin ,IB
3ropsito: ,ivisin sin signo
&intaxis:
,IB fuente
El divisor puede ser un b"te o palabra " es el operando que se le da a la
instruccin.
&i el divisor es de $ bits se toma como dividendo el registro de 1% bits -L
" si el divisor es de 1% bits se tomara como dividendo el registro par
,L:-L! tomando como palabra alta ,L " como baa -L.
&i el divisor fu/ un b"te el cociente se almacena en el registro -4 " el
residuo en -@! si fu/ una palabra el cociente se guarda en -L " el residuo
en ,L.
Instruccin I,IB
3ropsito: ,ivisin con signo
&intaxis:
I,IB fuente
(onsiste basicamente en lo mismo que la instruccin ,IB! solo que esta
#ltima realiza la operacin con signo.
3ara sus resultados utiliza los mismos registros que la instruccin ,IB.
Instruccin 904
3ropsito: 9ultiplicacin sin signo
&intaxis:
904 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 -@ si el multiplicador
es de $ bits o por -L si el multiplicador es de 1% bits.
(uando se realiza una multiplicacin con valores de $ bits el resultado se
almacena en el registro -L " cuando la multiplicacin es con valores de 1%
bits el resultado se almacena en el registro par ,L:-L.
Instruccin I904
3ropsito: 9ultiplicacin de dos enteros con signo.
&intaxis:
I904 fuente
Este comando hace lo mismo que el anterior! solo que si toma en cuenta los
signos de las cantidades que se multiplican.
4os resultados se guardan en los mismos registros que en la instruccin 9)B.
Instruccin &..
3ropsito: &ubstraccin con acarreo
&intaxis:
&.. destino! fuente
Esta instruccin resta los operandos " resta uno al resultado si (I est
activada. El operando fuente siempre se resta del destino.
Este tipo de substraccin se utiliza cuando se trabaa con cantidades de 52
bits.
Instruccin &0.
3ropsito: &ubstraccin
&intaxis:
&0. destino! fuente
?esta el operando fuente del destino.
Instrucciones lgicas " aritm/ticas
Instrucciones de salto
&on utilizadas para transferir el fluo del proceso al operando indicado.
U93
U- =U*.E>
U-E =U*.E>
U. =U*-E>
U.E =U*->
UE =UQ>
U*E =U*Q>
UD =U*4E>
UDE =U*4>
U4 =U*DE>
U4E =U*D>
U(
U*(
U*)
U*3 =U3)>
U*&
U)
U3 =U3E>
U&
Instrucciones para ciclos: 4))3
+ransfieren el fluo del proceso! condicional o incondicionalmente! a un
destino repitiendose esta accin hasta que el contador sea cero.
4))3
4))3E
4))3*E
Instrucciones de conteo
&e utilizan para decrementar o incrementar el contenido de los contadores.
,E(
I*(
Instrucciones de comparacin
&on usadas para comparar operandos! afectan al contenido de las banderas.
(93
(93& =(93&.> =(93&S>
Instrucciones de banderas
-fectan directamente al contenido de las banderas.
(4(
(4,
(4I
(9(
&+(
&+,
&+I
Instruccin U93
3ropsito: &alto incondicional
&intaxis:
U93 destino
Esta instruccin se utiliza para desviar el fluo de un programa sin tomar
en cuenta las condiciones actuales de las banderas ni de los datos.
Instruccin U- =U*.E>
3ropsito: .rinco condicional
&intaxis:
U- Etiqueta
,espu/s de una comparacin este comando salta si est arriba o salta si no
est abao o si no es igual.
Esto significa que el salto se realiza solo si la bandera (I esta
desactivada o si la bandera QI esta desactivada =que alguna de las dos sea
igual a cero>.
Instruccin U-E =U*.>
3ropsito: salto condicional
&intaxis:
U-E etiqueta
&alta si est arriba o si es igual o salta si no est abao.
El salto se efectua si (I esta desactivada.
Instruccin U. =U*-E>
3ropsito: salto condicional
&intaxis:
U. etiqueta
&alta si est abao o salta si no est arriba o si no es igual.
&e efect#a el salto si (I esta activada.
Instruccin U.E =U*->
3ropsito: salto condicional
&intaxis:
U.E etiqueta
&alta si est abao o si es igual o salta si no est arriba.
El salto se efect#a si (I est activado o si QI est activado =que
cualquiera sea igual a 1>.
Instruccin UE =UQ>
3ropsito: salto condicional
&intaxis:
UE etiqueta
&alta si es igual o salta si es cero.
El salto se realiza si QI est activada.
Instruccin U*E =U*Q>
3ropsito: salto condicional
&intaxis:
U*E etiqueta
&alta si no es igual o salta si no es cero.
El salto se efectua si QI est desactivada.
Instruccin UD =U*4E>
3ropsito: salto condicional! se toma en cuenta el signo.
&intaxis:
UD etiqueta
&alta si es ms grande o salta si no es menor o igual.
El salto ocurre si QI G : u )I G &I.
Instruccin UDE =U*4>
3ropsito: salto condicional! se toma en cuenta el signo.
&intaxis:
UDE etiqueta
&alta si es ms grande o igual o salta si no es menor que.
El salto se realiza si &I G )I
Instruccin U4 =U*DE>
3ropsito: salto condicional! se toma en cuenta el signo.
&intaxis:
U4 etiqueta
&alta si es menor que o salta si no es ma"or o igual.
El salto se efect#a si &I es diferente a )I.
Instruccin U4E =U*D>
3ropsito: salto condicional! se toma en cuenta el signo.
&intaxis:
U4E etiqueta
&alta si es menor o igual o salta si no es ms grande.
El salto se realiza si QI G 1 o si &I es diferente a )I
Instruccin U(
3ropsito: salto condicional! se toman en cuenta las banderas.
&intaxis:
U( etiqueta
&alta si ha" acarreo.
El salto se realiza si (I G 1
Instruccin U*(
3ropsito: salto condicional! se toma en cuenta el estado de las banderas.
&intaxis:
U*( etiqueta
&alta si no ha" acarreo.
El salto se efect#a si (I G :.
Instruccin U*)
3ropsito: salto condicional! se toma en cuenta el estado de las banderas.
&intaxis:
U*) etiqueta
&alta si no ha" desbordamiento.
El salto se efectua si )I G :.
Instruccin U*3 =U3)>
3ropsito: salto condicional! toma en cuenta el estado de las banderas.
&intaxis:
U*3 etiqueta
&alta si no ha" paridad o salta si la paridad es non.
El salto ocurre si 3I G :.
Instruccin U*&
3ropsito: salto condicional! toma en cuenta el estado de las banderas.
&intaxis:
U*3 etiqueta
&alta si el signo esta desactivado.
El salto se efect#a si &I G :.
Instruccin U)
3ropsito: salto condicional! toma en cuenta el estado de las banderas.
&intaxis:
U) etiqueta
&alta si ha" desbordamiento =overfloC>.
El salto se realiza si )I G 1.
Instruccin U3 =U3E>
3ropsito: salto condicional! toma en cuenta el estado de las banderas.
&intaxis:
U3 etiqueta
&alta si ha" paridad o salta si la paridad es par.
El salto se efect#a si 3I G 1.
Instruccin U&
3ropsito: salto condicional! toma en cuenta el estado de las banderas.
&intaxis:
U& etiqueta
&alta si el signo est prendido.
El salto se efect#a si &I G 1.
Instruccin 4))3
3ropsito: Denerar un ciclo en el programa.
&intaxis:
4))3 etiqueta
4a instruccin loop decrementa (L en 1! " transfiere el fluo del programa a
la etiqueta dada como operando si (L es diferente a 1.
Instruccin 4))3E
3ropsito: Denerar un ciclo en el programa considerando el estado de QI
&intaxis:
4))3E etiqueta
Esta instruccin decrementa (L en 1. &i (L es diferente a cero " QI es igual
a 1! entonces el fluo del programa se transfiere a la etiqueta indicada
como operando.
Instruccin 4))3*E
3ropsito: Denerar un ciclo en el programa! considerando el estado de QI
&intaxis:
4))3*E etiqueta
Esta instruccin decrementa en uno a (L " transfiere el fluo del programa
solo si QI es diferente a :.
Instruccin ,E(
3ropsito: ,ecrementar el operando
&intaxis:
,E( destino
Esta operacin resta 1 al operando destino " almacena el nuevo valor en el
mismo oeprando.
Instruccin I*(
3ropsito: Incrementar el operando.
&intaxis:
I*( destino
4a instruccin suma 1 al operando destino " guarda el resultado en el mismo
operando destino.
Instruccin (93
3ropsito: (omparar los operandos.
&intaxis:
(93 destino! fuente
Esta instruccin resta el operando fuente al operando destino pero sin que
/ste almacene el resultado de la operacin! solo se afecta el estado de las
banderas.
Instruccin (93& =(93&.> =(93&S>
3ropsito: (omparar cadenas de un b"te o palabra.
&intaxis:
(93 destino! fuente
(on esta instruccin la cadena de caracteres fuente se resta de la cadena
destino.
&e utilizan ,I como indice para el segmento extra de la cadena fuente " &I
como indice de la cadena destino.
&olo se afecta el contenido de las banderas " tanto ,I como &I se
incrementan.
Instruccin (4(
3ropsito: 4impiar bandera de acarreo.
&intaxis:
(4(
Esta instruccin apaga el bit correspondiente a la bandera de acarreo! o
sea! lo pone en cero.
Instruccin (4,
3ropsito: 4impiar bandera de direccin
&intaxis:
(4,
4a instruccin (4, pone en cero el bit correspondiente a la bandera de
direccin.
Instruccin (4I
3ropsito: 4impiar bandera de interrupcin
&intaxis:
(4I
(4I pone en cero la bandera de interrupciones! desabilitando as' aquellas
interrupciones enmascarables.
0na interrupcin enmascarable es aquella cu"as funciones son desactivadas
cuando II G :.
Instruccin (9(
3ropsito: (omplementar la bandera de acarreo.
&intaxis:
(9(
Esta instruccin complementa el estado de la bandera (I! si (I G : la
instruccin la iguala a 1! " si es 1 la instruccin la iguala a :.
3odemos decir que unicamente JinvierteJ el valor de la bandera.
Instruccin &+(
3ropsito: -ctivar la bandera de acarreo.
&intaxis:
&+(
Esta instruccin pone la bandera (I en 1.
Instruccin &+,
3ropsito: -ctivar la bandera de direccin.
&intaxis:
&+,
4a instruccin &+, pone la bandera ,I en 1.
Instruccin &+I
3ropsito: -cticar la bandera de interrupcin.
&intaxis:
&+I
4a instruccin activa la bandera II! esto habilita las interrupciones
externas enmascarables =las que funcionan unicamente cuando II G 1 >.
Interrupciones
Interrupciones internas de hardCare
Interrupciones externas de hardCare
Interrupciones de softCare
Interrupciones mas usuales:
Int 21@ =interrupcin del ,)&>
9ultiples llamadas a funciones del ,)&.
Int 1:@ =interrupcin del .I)&>
Entrada/salida de video.
Int 1%@ =Interrupcin del .I)&>
Entrada/salida de teclado.
Int 18@ =Interrupcin del .I)&>
Entrada/salida de la impresora.
Interrupciones internas de hardCare
4as interrupciones internas son generadas por ciertos eventos que surgen
durante la eecucin de un programa.
Este tipo de interrupciones son maneadas en su totalidad por el hardCare "
no es posible modificarlas.
0n eemplo claro de este tipo de interrupciones es la que actualiza el contador
del relo interno de la computadora! el hardCare hace el llamado a esta
interrupcin varias veces durante un segundo para mantener la hora actualizada.
-unque no podemos manear directamente esta interrupcin =no podemos
controlar por softCare las actualizaciones del relo>! es posible utilizar sus
efectos en la computadora para nuestro beneficio! por eemplo para crear
un Jrelo virtualJ actualizado continuamente gracias al contador del relo
interno. 0nicamente debemos escribir un programa que lea el valor actual del
contador " lo traduzca a un formato entendible para el usuario.
Interrupciones externas de hardCare
4as interrupciones externas las generan los dispositivos perifericos! como
pueden ser: teclado! impresoras! taretas de comunicaciones! etc. +ambi/n
son generadas por los coprocesadores.
*o es posible desactivar a las interrupciones externas.
Estas interrupciones no son enviadas directamente a la 0(3! sino que se
mandan a un circuito integrado cu"a funcin es exclusivamente manear este
tipo de interrupciones. El circuito! llamado 3I( $27H-! si es controlado por
la 0(3 utilizando para tal control una serie de vias de comunicacin
llamadas puertos.
Interrupciones de softCare
4as interrupciones de softCare pueden ser activadas directamente por el
ensamblador invocando al n#mero de interrupcin deseada con la instruccin
I*+.
El uso de las interrupciones nos a"uda en la creacin de programas!
utilizandolas nuestros programas son ms cortos! es ms fcil entenderlos "
usualmente tienen un meor 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 ,)& " las interrupciones del .I)&.
4a diferencia entre ambas es que las interrupciones del sistema operativo
son ms fciles de usar pero tambi/n son ms lentas "a que estas
interrupciones hacen uso del .I)& para lograr su cometido! en cambio las
interrupciones del .I)& son mucho ms rpidas pero tienen la desventaa que!
como son parte del hardCare son mu" espec'ficas " pueden variar dependiendo
incluso de la marca del fabricante del circuito.
4a eleccin del tipo de interrupcin a utilizar depender unicamente de las
caracteristicas que le quiera dar a su programa: velocidad =utilizando las
del .I)&> o portabilidad =utilizando las del ,)&>.
Interrupcin 21@
3ropsito: 4lamar a diversas funciones del ,)&.
&intaxis:
Int 21@
*ota: (uando trabaamos en 9-&9 es necesario especificar que el
valor que estamos utilizando es hexadecimal.
,erechos ?eservados.1HH7
8%
0*IBE?&I,-, ,E D0-,-4-U-?-
(oordinacin Deneral de &istemas de Informacin.
Esta interrupcin tiene varias funciones! para accesar a cada una de ellas
es necesario que el el registro -@ se encuentre el n#mero de funcin que se
requiera al momento de llamar a la interrupcin.
Iunciones para desplegar informacin al video.
:2@ Exhibe salida
:H@ Impresin de cadena =video>
6:@ Escritura en dispositivo/-rchivo
Iunciones para leer informacin del teclado.
:1@ Entrada desde teclado
:-@ Entrada desde teclado usando buffer
5I@ 4ectura desde dispositivo/archivo
Iunciones para trabaar con archivos.
En esta seccin unicamente se expone la tarea espec'fica de cada funcin!
para una referencia acerca de los conceptos empleados refierase a la unidad
8! titulada: JIntroduccin al maneo de archivosJ.
9/todo I(.
:I@ -brir archivo
16@ 4ectura secuencial
17@ Escritura secuencial
1%@ (rear archivo
21@ 4ectura aleatoria
22@ Escritura aleatoria
@andles
5(@ (rear archivo
5,@ -brir archivo
5E@ (ierra maneador de archivo
5I@ 4ectura desde archivo/dispositivo
6:@ Escritura en archivo/dispositivo
62@ 9over apuntador de lectura/escritura en archivo
Iuncin :2@
0so:
,espliega un caracter a la pantalla.
?egistros de llamada:
-@ G :2@
,4 G Balor del caracter a desplegar.
?egistros de retorno:
*inguno
Esta funcin nos despliega el caracter cu"o codigo hexagesimal corresponde
al valor almacenado en el registro ,4! no se modifica ning#n registro al
utilizar este comando.
Es recomendado el uso de la funcin 6:@ de la misma interrupcin en lugar de
esta funcin.
Iuncin :H@
0so:
,espliega una cadena de carateres en la pantalla.
?egistros de llamada:
-@ G :H@
,&:,L G ,ireccin de inicio de una cadena de caracteres
?egistros de retorno:
*inguno.
Esta funcin despliega los caracteres! uno a uno! desde la direccin
indicada en el registro ,&:,L hasta encontrar un caracter T! que es
interpretado como el final de la cadena.
&e recomienda utilizar la funcin 6:@ en lugar de esta funcin.
Iuncin 6:@
0so:
Escribir a un dispositivo o a un archivo.
?egistros de llamada:
-@ G 6:@
.L G B'a de comunicacin
(L G (antidad de b"tes a escribir
,&:,L G ,ireccin del inicio de los datos a escribir
?egistros de retorno:
(I G : si no hubo error
-L G *#mero de b"tes escritos
(I G 1 si hubo error
-L G (digo de error
El uso de esta funcin para desplegar informacin en pantalla se realiza
dandole al registro .L el valor de 1 que es el valor preasignado al video
por el sistema operativo 9&-,)&.
Iuncin :1@
0so:
4eer un caracter del teclado " desplegarlo.
?egistros de llamada:
-@ G :1@
?egistros de retorno:
-4 G (aracter le'do
(on esta funcin es mu" sencillo leer un caracter del teclado! el cdigo
hexadecimal del caracter le'do se guarda en el registro -4. En caso de que
sea un caracter extendido el registro -4 contendra el valor de : " ser
necesario llamar de nuevo a la funcin para obtener el cdigo de este
caracter.
Iuncin :-@
0so:
4eer caracteres del teclado " almacenarlos en un buffer.
?egistros de llamada:
-@ G :-@
,&:,L G ,ireccin del rea de almacenamiento
.R+E : G (antidad de b"tes en el rea
.R+E 1 G (antidad de b"tes le'dos
desde .R+E 2 hasta .R+E : F 2 G caracteres le'dos
?egistros de retorno:
*inguno
4os caracteres son le'dos " almacenados en un espacio predefinido de
memoria. 4a estructura de este espacio le indica que en el primer b"te del
mismo se indican cuantos caracteres sern le'dos. En el segundo b"te se
almacena el n#mero de caracteres que "a se le"eron! " del tercer b"te en
adelante se escriben los caracteres le'dos.
(uando se han almacenado todos los caracteres indicados menos uno la bocina
suena " cualquier caracter adicional es ignorado. 3ara terminar la captura
de la cadena es necesario darle OE*+E?P.
Iuncin 5I@
0so:
4eer informacin de un dispositivo o archivo.
?egistros de llamada:
-@ G 5I@
.L G *#mero asignado al dispositivo
(L G *#mero de b"tes a procesar
,&:,L G ,ireccin del rea de almacenamiento
?egistros de retorno:
(I G : si no ha" error " -L G n#mero de b"tes leidos.
(I G 1 si ha" error " -L contendra el cdigo del error.
Iuncin :I@
0so:
-brir archivo I(.
?egistros de llamada:
-@ G :I@
,&:,L G -puntador a un I(.
?egistros de retorno:
-4 G ::@ si no hubo problema! de lo contrario regresa :II@
Iuncin 16@
0so:
4eer secuencialmente un archivo I(..
?egistros de llamada:
-@ G 16@
,&:,L G -puntador a un I(. "a abierto.
?egistros de retorno:
-4 G : si no hubo errores! de lo contrario se regresara el cdigo
correspondiente de error: 1 error al final del archivo! 2 error en la
estructura del I(. " 5 error de lectura parcial.
Esta funcin lo que hace es que lee el siguiente bloque de informacin a
partir de la direccin dada por ,&:,L! " actualiza este registro.
Iuncin 17@
0so:
Escribir secuencialmente a un archivo I(.
?egistros de llamada:
-@ G 17@
,&:,L G -puntador a un I(. "a abierto
?egistros de retorno:
-4 G ::@ si no hubo errores! de lo contrario contendra el cdigo del error:
1 disco lleno o archivo de solo lectura! 2 error en la formacin o
especificacin del I(..
4a funcin 17@ despu/s de escribir el registro al bloque actual actualiza el
I(..
Iuncin 1%@
0so:
(rear un archivo I(..
?egistros de llamada:
-@ G 1%@
,&:,L G -puntador a un I(. "a abierto.
?egistros de retorno:
-4 G ::@ si no hubo errores! de lo contrario contendra el valor :II@
&e basa en la informacin proveida en un I(. para crear un archivo en el
disco.
Iuncin 21@
0so:
4eer en forma aleatoria un archivo I(..
?egistros de llamada:
-@ G 21@
,&:,L G -puntador a un I(. "a abierto.
?egistros de retorno:
- G ::@ si no hubo error! de lo contrario -@ contendra el cdigo del error:
1 si es fin de archivo! 2 si existe error de especificacin de I(. " 5 si se
le" un registro parcial o el apuntador del archivo se encuentra al final
del mismo.
Esta funcin lee el registro especificado por los campos del bloque actual "
registro actual de un I(. abierto " coloca la informacin en el ,+- =rea de
transferencia de disco o ,isK +ransfer -rea>.
Iuncin 22@
0so:
Escribir en forma aleatoria en un archivo I(..
?egistros de llamada:
-@ G 22@
,&:,L G -puntador a un I(. abierto.
?egistros de retorno:
-4 G ::@ si no hubo error! de lo contrario contendr el cdigo del error: 1
si el disco est lleno o es archivo de solo lectura " 2 si ha" error en la
especificacin de I(..
Escribe el registro especificado por los campos del bloque actual " registro
actual de un I(. abierto. Escribe dicha informacin a partir del contenido
del ,+- =rea de transferencia de disco>.
Iuncin 5(@
0so:
(rear un archivo si no existe o dearlo en longitud : si existe. =@andle>
?egistros de llamada:
-@ G 5(@
(@ G -tributo de archivo
,&:,L G -puntador a una especificain -&(IIQ
?egistros de retorno:
(I G : " -L el n#mero asignado al handle si no ha" error! en caso de haberlo
(I ser 1 " -L contendra el cdigo de error: 5 ruta no encontrada! 6 no ha"
handles disponibles para asignar " 7 acceso negado.
Esta funcin sustitu"e a la 1%@. El nombre del archivo es especificado en
una cadena -&(IIQ! la cual tiene como caracter'stica la de ser una cadena de
b"tes convencional terminada con un caracter :.
El archivo creado contendra los atributos definidos en el registro (L en la
siguiente forma:
Balor -tributos
::@ *ormal
:2@ Escondido
:6@ &istema
:%@ Escondido " de sistema
El archivo se crea con los permisos de lectura " escritura. *o es posible
crear directorios utilizando esta funcin.
Iuncin 5,@
0so:
-bre un archivo " regrese un handle
?egistros de llamada:
-@ G 5,@
-4 G modo de acceso
,&:,L G -puntador a una especificacin -&(IIQ
?egistros de retorno:
(I G : " -L G n#mero de handle si no ha" errores! de lo contrario (I G 1 "
-L G cdigo de error: :1@ si no es vlida la funcin! :2@ si no se encontr
el archivo! :5@ si no se encontrVacuteAo la ruta! :6@ si no ha" handles
disponibles! :7@ en caso de acceso negado! " :(@ si el cdigo de acceso no
es vlido.
El handle regresado es de 1% bits.
El cdigo de acceso se especifica en la siguiente forma:
.I+&
8 % 7 6 5 2 1
. . . . : : : &olo lectura
. . . . : : 1 &olo escritura
. . . . : 1 : 4ectura/Escritura
. . . L . . . ?E&E?B-,)
Iuncin 5E@
0so:
(errar archivo =@andle>.
?egistros de llamada:
-@ G 5E@
.L G @andle asignado
?egistros de retorno:
(I G : si no hubo errores! en caso contrario (I ser 1 " -L contendr el
cdigo de error: :%@ si el handle es invlido.
Esta funcin actualiza el archivo " libera o dea disponible el handle que
estaba utilizando.
Iuncin 5I@
0so:
4eer de un archivo abierto una cantdad definida de b"tes " los almacena en
un buffer espec'fico.
,erechos ?eservados.1HH7
$H
0*IBE?&I,-, ,E D0-,-4-U-?-
(oordinacin Deneral de &istemas de Informacin.
?egistros de llamada:
-@ G 5I@
.L G @andle asignado
(L G (antidad de b"tes a leer
,&:,L G -puntador a un rea de trabao.
?egistros de retorno:
(I G : " -L G n#mero de b"tes leidos si no hubo error! en caso contrario (I
G 1 " -L G cdigo de error: :7@ si acceso negado " :%@ si no es vlido el
handle.
Iuncin 6:@
0so:
Escribe a un archivo "a abierto una cierta cantidad de b"tes a partir del
buffer designado.
?egistros de llamada:
-@ G 6:@
.L G @andle asignado
(L G (antidad de b"tes a escribir.
,&:,L G -puntador al buffer de datos.
?egistros de retorno:
(I G : " -L G n#mero de b"tes escritos si no ha" errores! en caso de existir
(I G 1 " -L G cdigo del error: :7@ si el acceso es negado " :%@ si el
handle es invlido.
Iuncin 62@
0so:
9over apuntador al archivo =@andle>
?egistros de llamada:
-@ G 62@
-4 G m/todo utilizado
.L G @andle asignado
(L G 4a parte ms significativa del offset
,L G 4a parte menos significativa del offset
?egistros de retorno:
(I G : " ,L:-L G la nueva posicin del apuntador. En caso de error (I ser 1
" -L G cdigo de error: :1@ si la funcin no es vlida " :%@ si el handle no
es vlido.
El m/todo utilizado se configura como sigue:
Balor de -4 9/todo
::@ - partir del principio del archivo
:1@ - partir de la posicin actual
:2@ - partir del final del archivo
Interrupcin 1:@
3ropsito: 4lamar a diversas funciones de video del .I)&.
&intaxis:
Int 1:@
Esta interrupcin tiene diversas funciones! todas ellas nos sirven para
controlar la entrada " salida de video! la forma de acceso a cada una de las
opciones es por medio del registro -@.
En este tutorial unicamente veremos algunas de las funciones de esta
interrupcin.
Iunciones comunes de la interrupcin 1:@.
:2@ &eleccin de posicin del cursor
:H@ Escribe atributo " caracter en el cursor
:-@ Escribe caracter en la posicin del cursor
:E@ Escritura de caracteres en modo alfanum/rico
Iuncin :2@
0so:
3osiciona el cursor en la pantalla dentro de las coordenadas vlidas de
texto.
?egistros de llamada:
-@ G :2@
.@ G 3gina de video en la que se posicionar el cursor.
,@ G Iila
,4 G (olumna
?egistros de retorno:
*inguno.
4as posiciones de localizacin del cursor son definidas por coordenadas
iniciando en :!:! que corresponde a la esquina superior izquierda hasta 8H!26
correspondientes a la esquina inferior derecha. +enemos entonces que los valores
que pueden tomar los registros ,@ " ,4 en modo de texto de $: x 27 son de :
hasta 26 " de : hasta 8H respectivamente.
Iuncin :H@
0so:
,esplegar un caracter un determinado n#mero de veces con un atributo
definido empezando en la posicin actual del cursor.
?egistros de llamada:
-@ G :H@
-4 G (aracter a desplegar
.@ G 3gina de video en donde se desplegar
.4 G -tributo a usar
*#mero de repeticiones.

?egistros de retorno:
*inguno
Esta funcin despliega un caracter el n#mero de veces especificado en (L
pero sin cambiar la posicin del cursor en la pantalla.
Iuncin :-@
0so:
,esplegar un caracter en la posicin actual del cursor.
?egistros de llamada:
-@ G :-@
-4 G (aracter a desplegar
.@ G 3gina en donde desplegar
.4 G (olor a usar =slo en grficos>.
(L G *#mero de repeticiones
?egistros de retorno:
*inguno.
4a #nica diferencia entre esta funcin " la anterior es que /sta no permite
modificar los atributos! simplemente usa los atributos actuales.
+ampoco se altera la posicin del cursor con esta funcin.
Iuncin :E@
0so:
,eplegar un caracter en la pantalla actualizando la posicin del cursor.
?egistros de llamada:
-@ G :E@
-4 G (aracter a desplegar
.@ G 3gina donde se desplegara el caracter
.4 G (olor a usar =solo en grficos>
?egistros de retorno:
*inguno
Interrupcin 1%@
3ropsito: 9anear la entrada/salida del teclado.
&intaxis:
Int 1%@
Beremos dos opciones de la interrupcin 1%@! estas opciones! al igual que
las de otras interrupciones! son llamadas utilizando el registro -@.
Iunciones de la interrupcin 1%@
::@ 4ee un caracter de teclado
:1@ 4ee estado del teclado
Iuncin ::@
0so:
4eer un caracter del teclado.
?egistros de llamada:
-@ G ::@
?egistros de retorno:
-@ G cdigo de barrido =scan code> del teclado
-4 G Balor -&(II del caracter.
(uando se utiliza esta interrupcin se detiene la eecucin del programa
hasta que se introduzca un caracter desde el teclado! si la tecla presionada
es un caracter -&(II su valor ser guardado en el registro -@! de lo
contrario el cdigo de barrido ser guardado en -4 " -@ contendr el valor
::@.
El cdigo de barrido fu/ creado para manear las teclas que no tienen una
representacin -&(II como O-4+P! O()*+?)4P! las teclas de funcin! etc.
Iuncin :1@
0so:
4eer estado del teclado.
?egistros de llamada:
-@ G :1@
?egistros de retorno:
&i la bandera de cero! QI! est apagada significa que ha" informacin en el
buffer! si se encuentra prendida es que no ha" teclas pendientes.
En caso de existir informacin el registro -@ contendr el cdigo de la
tecla guardada en el buffer.
Interrupcin 18@
3ropsito: 9anear la entrada/salida de la impresora.
&intaxis:
Int 18@
Esta interrupcin es utilizada para escribir caracteres a la impresora!
inicializarla " leer su estado.

Iunciones de la interrupcin 1%@
::@ Imprime un caracter -&(II
:1@ Inicializa la impresora
:2@ 3roporciona el estado de la impresora
Iuncin ::@
0so:
Escribir un caracter a la impresora.
?egistros de llamada:
-@ G ::@
-4 G (aracter a imprimir
,L G 3uerto a utilizar
?egistros de retorno:
-@ G Estado de la impresora.
El puerto a utilizar! definido en ,L! se especifica as': 43+1 G :! 43+2 G 1!
43+5 G 2 ...
El estado de la impresora se codifica bit por bit como sigue:
.I+ 1/: &ID*III(-,)
----------------------------------------
: 1 &e agot el tiempo de espera
1 -
2 -
5 1 Error de entrada/salida
6 1 Impresora seleccionada
7 1 3apel agotado
% 1 ?econocimiento de comunicacin
8 1 4a impresora se encuentra libre
4os bits 1 " 2 no son relevantes.
4a ma"oria de los .I)& unicamente soportan 5 puertos paralelos aunque
existen algunos que soportan 6.
Iuncin :1@
0so:
Inicializar un puerto de impresin.
?egistros de llamada:
-@ G :1@
,L G 3uerto a utilizar
?egistros de retorno:
-@ G &tatus de la impresora
El puerto a utilizar! definido en ,L! se especifica as': 43+1 G :! 43+2 G 1!
etc.
El estado de la impresora se codifica bit por bit como sigue:
.I+ 1/: &ID*III(-,)
----------------------------------------
: 1 &e agot el tiempo de espera
1 -
2 -
5 1 Error de entrada/salida
6 1 Impresora seleccionada
7 1 3apel agotado
% 1 ?econocimiento de comunicacin
8 1 4a impresora se encuentra libre
4os bits 1 " 2 no son relevantes.
4a ma"oria de los .I)& unicamente soportan 5 puertos paralelos aunque
existen algunos que soportan 6.
Iuncin :2@
0so:
)btener el estado de la impresora.
?egistros de llamada:
-@ G :1@
,L G 3uerto a utilizar
?egistros de retorno:
-@ G &tatus de la impresora.
El puerto a utilizar! definido en ,L! se especifica as': 43+1 G :! 43+2 G 1!
etc.
El estado de la impresora se codifica bit por bit como sigue:
.I+ 1/: &ID*III(-,)
----------------------------------------
: 1 &e agot el tiempo de espera
1 -
2 -
5 1 Error de entrada/salida
6 1 Impresora seleccionada
7 1 3apel agotado
% 1 ?econocimiento de comunicacin
8 1 4a impresora se encuentra libre
4os bits 1 " 2 no son relevantes.
4a ma"oria de los .I)& unicamente soportan 5 puertos paralelos aunque
existen algunos que soportan 6.
Introducin al maneo de archivos
Iormas de trabaar con archivos
9/todos de trabao con archivos
9/todo I(.
Introduccin
-brir archivos
(rear un archivo nuevo
Escritura secuencial
4ectura secuencial
4ectura " escritra aleatoria
(errar un archivo
9/todo de canales de comunicacin
+rabaando con handles
Iunciones para utilizar handles
9/todos de trabao con archivos
Existen dos formas de trabaar con archivos! la primera es por medio de
bloques de control de archivos o JI(.J " la segunda es por medio de canales
de comunicacin! tambien conocidos como JhandlesJ.
4a primera forma de maneo de archivos se viene utilizando desde el sistema
operativo (39! antecesor del ,)&! por lo mismo asegura cierta compatibilidad
con archivos mu" antiguos tanto del (93 como de la versin 1.: del ,)&!
adems este m/todo nos permite tener un n#mero ilimitado de archivos
abiertos al mismo tiempo. &i se quiere crear un volumen para el disco la
#nica forma de lograrlo es utilizando este m/todo.
-#n considerando las ventaas del I(. el uso de los canales de comunicacin
es mucho ms sencillo " nos permite un meor maneo de errores! adems! por
ser ms novedoso es mu" probable que los archivos as' creados se mantengan
compatibles a trav/s de versiones posteriores del sistema operativo.
3ara una ma"or facilidad en las explicaciones posteriores me referir/ a el
m/todo de bloques de control de archivos como I(.s " al m/todo de canales de
comunicacin como handles.
Introduccin
Existen dos tipos de I(.! el normal! cu"a longitud es de 58 b"tes " el
extendido de 66 b"tes. En este tutorial unicamente se tratar el primer
tipo! as' que de ahora en adelante cuando me refiera a un I(. realmente
esto" hablando de un I(. de 58 b"tes.
El I(. se compone de informacin dada por el programador " por informacin
que toma directamente del sistema operativo. (uando se utilizan este tipo de
archivos unicamente es posible trabaar en el directorio actual "a que los
I(. no proveen apo"o para el uso de la organizacin por directorios del ,)&.
El I(. est formado por los siguientes campos:
3)&I(I)* 4)*DI+0, &ID*III(-,)
::@ 1 ."te ,rive
:1@ $ ."tes *ombre del archivo
:H@ 5 ."tes Extensin
:(@ 2 ."tes *#mero de bloque
:E@ 2 ."tes +ama;o del registro
1:@ 6 ."tes +ama;o del archivo
16@ 2 ."tes Iecha de creacin
1%@ 2 ."tes @ora de creacin
1$@ $ ."tes ?eservados
2:@ 1 ."te ?egistro actual
21@ 6 ."tes ?egsitro aleatorio
3ara seleccionar el drive de trabao se sigue el siguiente formato: drive -
G 1A drive . G 2A etc. &i se utiliza : se tomar como opcin el drive que se
est/ utilizando en ese momento.
El nombre del archivo debe estar ustificado a la izquierda " en caso de ser
necesario se debern rellenar los b"tes sobrantes con espacios! la extensin
del archivo se coloca de la misma forma.
El bloque actual " el registro actual le dicen a la computadora que registro
ser accesado en operaciones de lectura o escritura. 0n bloque es un grupo
de 12$ registros. El primer bloque del archivo es el bloque :. El primer
registro es el registro :! por lo tanto el #ltimo registro del primer bloque
ser'a 128! "a que la numeracin inici con : " el bloque puede contener 12$
registros en total.
-brir archivos
3ara abrir un archivo I(. se utiliza la interrupcin 21@! funcin :I@. 4a
unidad! el nombre " extensin del archivo deben ser inicializados antes de
abrirlo.
El registro ,L debe apuntar al bloque. &i al llamar a la interrupcin /sta
regresa valor de II@ en el registro -@ es que el archivo no se encontr! si
todo sali bien se devolvera un valor de :.
&i se abre el archivo ,)& inicializa el bloque actual a :! el tama;o del
registro a 12$ b"tes " el tama;o del mismo " su fecha se llenan con los
datos encontrados en el directorio.
(rear un archivo nuevo
3ara la creacin de archivos se utiliza la interrupcin 21@ funcin 1%@ .
,L debe apuntar a una estructura de control cu"os requisitos son que al
menos se encuentre definida la unidad lgica! el nombre " la extensin del
archivo.
En caso de existir algun problema se devolver el valor II@ en -4! de lo
contrario este registro contendr el valor de :.
Escritura secuencial
-ntes de que podamos realizar escrituras al disco es necesario definir el
rea de transferencia de datos utilizando para tal fin la funcin 1-@ de la
interrupcin 21@.
4a funcin 1-@ no regresa ning#n estado del disco ni de la operacin! pero
la funcin 17@! que es la que usaremos para escribir al disco! si lo hace en
el registro -4! si /ste es igual a cero no hubo error " se actualizan los
campos del registro actual " bloque.
4ectura secuencial
-ntes que nada debemos definir el rea de transferencia de archivos o ,+-.
3ara leer secuencialmente utilizamos la funcin 16@ de la int 21@.
El registro a ser leido es el que se encuentra definido por el bloque " el
registro actual. El registro -4 regresa el estado de la operacin! si -4
contiene el valor de 1 o 5 es que hemos llegado al final del archivo. 0n
resultado de 2 significa que el I(. est mal estructurado.
En caso de no existir error -4 contendr el valor de : " los campos bloque
actual " registro actual son actualizados.
4ectura " escritura aleatoria
4a funcin 21@ " la funcin 22@ de la interrupcin 21@ son las encargadas de
realizar las lecturas " escrituras aleatorias respectivamente.
El n#mero de registro aleatorio " el bloque actual son usados para calcular
la posicin relativa del registro a leer o escribir.
El registro -4 regresa la misma informacin que para lectura o escritura
secuencial. 4a informacin que ser le'da se regresar en el rea de
transferencia de disco! as' mismo la informacin que ser escrita reside en
el ,+-.
(errar un archivo
3ara cerrar un archivo utilizamos la funcin 1:@ de la interrupcin 21@.
&i despu/s de invocarse esta funcin el registro -4 contiene el valor de II@
significa que el archivo ha cambiado de posicin! se cambi el disco o ha"
un error de acceso al disco.
+rabaando con handles
El uso de handles para manear los archivos facilita en gran medida la
creacin de archivos " el programador puede concentrarse en otros aspectos
de la programacin sin preocuparse en detalles que pueden ser maneados por
el sistema operativo.
4a facilidad en el uso de los handles consiste en que para operar sobre un
archivo unicamente es necesario definir el nombre del mismo " el n#mero del
handle a utilizar! toda la dems informacin es maneada internamente por el
,)&.
(uando utilizamos este m/todo para trabaar con archivos no existe una
distincin entre accesos secuenciales o aleatorios! el archivo es tomado
simplemente como una cadena de b"tes.
Iunciones para utilizar handles
4as funciones utilizadas para el maneo de archivos por medio de handles son
descritas en la unidad %: Interrupciones! en la seccin dedicada a la
interrupcin 21@.
9acros " procedimientos
3rocedimientos.
,efinicin de procedimiento
&intaxis de un procedimiento
9acros.
,efinicin de una macro
&intaxis de una macro
.ibliotecas de macros
,efinicin de procedimiento
0n procedimiento es un conunto de instrucciones a los que podemos dirigir
el fluo de nuestro programa! " una vez terminada la eecucin de dichas
instrucciones se devuelve el control a la siguiente linea a procesar del
cdigo que mando llamar al procedimiento.
4os procedimientos nos a"udan a crear programas legibles " fciles de
modificar.
-l momento de invocar a un procedimiento se guarda en la pila la direccin
de la siguiente instruccin del programa para que! una vez transferido el
fluo del programa " terminado el procedimiento! se pueda regresar a la
linea siguiente del programa original =el que llam al procedimiento>.
&intaxis de un procedimiento
Existen dos tipos de procedimientos! los intrasegmentos! que se encuentran
en el mismo segmento de instrucciones " los intersegmentos que pueden ser
almacenados en diferentes segmentos de memoria.
(uando se utilizan los procedimientos intrasegmentos se almacena en la pila
el valor de I3 " cuando se utilizan los intersegmentos se almacena el valor
(&:I3
3ara desviar el fluo a un procedimiento =llamarlo> se utiliza la directiva:
(-44 *ombre,el3rocedimiento
4as partes que componen a un procedimiento son:
,eclaracin del procedimiento
(digo del procedimiento
,irectiva de regreso
+erminacin del procedimiento
3or eemplo! si queremos una rutina que nos sume dos b"tes! almacenados en
-@ " -4 cada uno " guardar la suma en el registro .L:
&uma 3roc *ear A,eclaracin del procedimiento
9ov .x! : A(ontenido del procedimiento
9ov .l! -h
9ov -h! ::
-dd .x! -x
?et A,irectiva de regreso
&uma Endp A,eclaracin de final del procedimiento
En la declaracin la primera palabra! &uma! corresponde al nombre de nuestro
procedimiento! 3roc lo declara como tal " la palabra *ear le indica al 9-&9
que el procedimiento es intrasegmento. 4a directiva ?et carga la direccin I3
almacenada en la pila para regresar al programa original! por #ltimo! la
directiva &uma Endp indica el final del procedimiento.
3ara declarar un procedimiento intersegmento sustituimos la palabra *ear por
la palabra I-?.
El llamado de este procedimiento se realiza de la siguiente forma:
(all &uma
4as macros ofrecen una ma"or flexibilidad en la programacin comparadas con
los procedimientos! pero no por ello se dearn de utilizar estos #ltimos.
,efinicin de una macro
0na macro es un grupo de instrucciones repetitivas en un programa que se
codifican solo una vez " pueden utilizarse cuantas veces sea necesario.
4a principal diferencia entre una macro " un procedimiento es que en la
macro se hace posible el paso de parmetros " en el procedimiento no =esto
es aplicable solo para el 9-&9! ha" otros lenguaes de programacin que si
lo permiten>. -l momento de eecutarse la macro cada parmetro es sustituido
por el nombre o valor especificado al momento de llamarla.
3odemos decir entonces que un procedimiento es una extensin de un
determinado programa! mientras que la macro es un mdulo con funciones
espec'ficas que puede ser utilizado por diferentes programas.
)tra diferencia entre una macro " un procedimiento es la forma de llamar a
cada uno! para llamar a un procedimiento se requiere el uso de una directiva! en
cambio la llamada a las macros se realiza como si se tratara de una instruccin
del ensamblador.
&intaxis de una macro
4as partes que componen a una macro son:
,eclaracin de la macro
(digo de la macro
,irectiva de terminacin de la macro
4a declaracin de la macro se lleva a cabo de la siguiente forma:
*ombre9acro 9-(?) Oparametro1! parametro2...P
-unque se tiene la funcionalidad de los parametros es posible crear una
macro que no los necesite.
4a directiva de terminacin de la macro es: E*,9
0n eemplo de macro! para colocar el cursor en alguna posicin determinada
de la pantalla es:
3osicion 9-(?) Iila! (olumna
30&@ -L
30&@ .L
30&@ ,L
9)B -@! :2@
9)B ,@! Iila
9)B ,4! (olumna
9)B .@! :
I*+ 1:@
3)3 ,L
3)3 .L
3)3 -L
E*,9
3ara utilizar una macro solo es necesario llamarla por su nombre! como si
fuera una instruccin mas del ensamblador! "a no son necesarias las
directivas como en el caso de los procedimientos. Eemplo:
3osicion $! %
.ibliotecas de macros
0na de las facilidades que ofrece el uso de las macros es la creacin de
bibliotecas! las cuales son grupos de macros que pueden ser incluidas en un
programa desde un archivo diferente.
4a creacin de estas bibliotecas es mu" sencilla! unicamente tenemos que
escribir un archivo con todas las macros que se necesitarn " guardarlo como
archivo de texto.
3ara llamar a estas macros solo es necesario utilizar la instruccin Include
*ombre,el-rchivo! en la parte de nuestro programa donde escribiriamos
normalmente las macros! esto es! al principio de nuestro programa =antes de
la declaracin del modelo de memoria>.
&uponiendo que se guard el archivo de las macros con el nombre de
9-(?)&.+L+ la instruccin Include se utilizar'a de la siguiente forma:
AInicio del programa
Include 9-(?)&.+L+
.9),E4 &9-44
.,-+-
A-qui van los datos
.(),E
Inicio:
A-qui se inserta el cdigo del programa
.&+-(X
A&e define la pila
End Inicio
A+ermina nuestro programa
Eemplos:
,esplegar un mensae en pantalla
0no de los programas ms sencillos! pero en cierta forma prctico! es uno
que despliegue una cadena de caracteres en la pantalla. Eso es lo que hace
el siguiente programa:
3rograma :
A 3rimero definimos el modelo de memoria! en este caso small
.9),E4 &9-44
.(),E A ,eclaramos el rea que contendr el cdigo
Inicio: A Etiqueta de inicio del programa:
9)B -L!Z,-+- A Bamos a colocar la direccin del segmento de datos
9)B ,&!-L A en ,&! usando como intermediario a -L
9)B ,L!)II&E+ (adena A (olocamos en ,L la direccin! dentro del
A segmento! de la cadena a desplegar
9)B -@!:H A 0tilizaremos la funcin :H de la interrupcin
I*+ 21@ A 21@ para desplegar la cadena.
9)B -@!6(@ A 3or medio de la funcin 6(@ de la interrupcin
I*+ 21@ A 21@ terminaremos nuestro programa
.,-+- A ,eclaramos el semento de datos
(adena ,. '9ensae del programa.T' A (adena a desplegar
.&+-(X A ,eclaramos la pila
E*, Inicio A Iinal de nuestro programa
Ra se explic en el tutorial un programa casi igual a este! por lo tanto no
requiere ning#n comentario adicional.
(uando se crea un programa no es necesario escribir los comentarios que van
despues de las comillas! sin embargo es una t/cnica recomendable para que en
caso de errores o meoras al cdigo sea ms sencillo encontrar la parte
deseada.
3ara ensamblar este programa primero se guarda en formato -&(II con un
nombre vlido! por eemplo: program1.asm
3ara ensamblarlo se utiliza el 9-&9! el comando de ensamble es: masm
program1A
3ara enlazarlo " hacerlo eecutable tecleamos: linK program1A
0na vez terminados estos pasos es posible eecutarlo tecleando: program1
OEnterP
3ara utilizar el programa directamente en su computadora guarde este archivo
como -&(II o texto! ll/velo a su 3(! con algun editor elimine todos estos
comentarios " los comentarios del principio " ensmblelo.
,esplegar n#meros hexadecimales del 17 al :
Este programa despliega los 1% caracteres correspondientes al cdigo
hexadecimal en orden descendente.
3rograma:
A Inicio del programa! definimos el modelo de memoria a usar " el segmento
A de cdigo
.9),E4 &9-44 A 9odelo de memoria
.(),E A -rea de cdigo
Inicio: A Etiqueta de inicio del programa
9)B -L!Z,-+- A Inicializa el registro ,& con la direccin dada
9)B ,&!-L A por Z,-+- =&egmento de datos>.
9)B ,L! )II&E+ +itulo A )btiene la direccin de la cadena de caracteres
9)B -@!:H A 0samos la funcin :H@ de la interrupcin 21@
I*+ 21@ A para desplegar la cadena cu"a direccin obtuvimos.
9)B (L!1% A (ontador de caracteres que se mostrarn
9)B .L! )II&E+ (adena A 3ermite acceso a la cadena donde se encuentran los
A valores a desplegar
(iclo: A Etiqueta para generar un ciclo
9)B -4!(4 A (oloca en -4 el n#mero a traducir " lo traduce
L4-+ A usando la instruccin L4-+
9)B ,4!-4 A (oloca en ,4 el valor a ser desplegado por medio de la
9)B -@!:2 A funcin 2 de la interrupcin 21@
I*+ 21@ A ,espliega el caracter
9)B ,4!1: A &alta una linea desplegando el caracter 1:
I*+ 21@ A ,espliega el caracter
9)B ,4!15 A 3roduce un retorno de carro desplegando el caracter 15
I*+ 21@ A ,espliega el retorno de carro
4))3 (iclo A ,ecrementa en uno a (L " brinca a la etiqueta (iclo
A siempre " cuando (L no sea igual a cero
9)B -@!6( A 0tiliza la funcin 6( de la interrupcin 21@ para
I*+ 21@ A finalizar el programa
A Inicio del segmento de datos
.,-+- A,efine el segmento de datos
+itulo ,. 15!1:!',esplegar los n#meros hexadecimales del 17 al 1'
,. 15!1:!'T' A (adena a desplegar al inicio del programa
(adena ,. ':12567%8$H-.(,EI' A (adena con los d'gitos hexadecimales
A ,eclaracin del segmento de la pila
.&+-(X
E*, Inicio A,eclaracin del final del programa
El comando L4-+ busca la cadena o tabla localizada en .L! el registro
-4 contiene el n#mero de b"tes! a partir de la direccin de inicio! que
se recorrer el apuntador para buscar un dato! el contenido de -4 es
remplazado por el b"te donde se encuentra el apuntador.
El proceso de ensamblado es igual al del eemplo anterior.



)peraciones bsicas
En el siguiente eemplo se utilizan la ma"or parte de las instrucciones
vistas en el tutorial! su obetivo es realizar las operaciones de suma!
resta! multiplicacin o divisin de dos cantidades.
3ara accesar a cada una de las opciones disponibles se hace uso de un men#
en el que se presentan las operaciones disponibles.
3rograma:
.9),E4 &9-44 A ,efine el modelo de memoria
.,-+- A ,efine el segmentos de datos
Error(-3 ,. : A.andera de error en la captura de las cantidades
(antidad ,. : A(antidad sobre la que se opera. &i es : la cantidad
A ser la 1! " si es 1 ser la 2.
(ant0no? ,S : ADuardar la cantidad 1 convertida en binario
(ant,os? ,S : ADuardar la cantidad 2 convertida en binario
(ant0no* ,. %!:!% ,03=\> ABariable que almacena la cantidad 1
(ant,os* ,. %!:!% ,03=\> ABariable que almacena la cantidad 2
Iuncion ,. : ABariable que almacena la opcin a realizar
?esulta ,. 15!1:!'?esultado: T'
?esulta? ,. 11 ,03=\>
9ensae ,. 15!1:!')peraciones bsicas entre dos n#meros'
,. 15!1:!15!1:!'T'
3regunta ,. 15!1:!'3resione: '!15!1:
,. ' 1 9ultiplicacin '!15!1:
,. ' 2 ,ivisin '!15!1:
,. ' 5 &uma '!15!1:
,. ' 6 ?esta '!15!1:
,. ' 7 &alir '!15!1:!'T'
Error ,. 8!15!1:!'&eleccin invlida =1-7>'!15!1:!'T'
Error1 ,. 8!15!1:!'(antidad 1 invlida. '!15!1:!'T'
Error2 ,. 8!15!1:!'(antidad 2 invlida. '!15!1:!'T'
Error5 ,. 8!15!1:!'(antidad fuera de rango =%7757> '!15!1:!'T'
Error6 ,. 8!15!1:!'Intento de divisin por cero. '!15!1:!'T'
(ant0no9 ,. 15!1:!'Introduzca la cantidad 1 =9enor a %7757>: T'
(ant,os9 ,. 15!1:!'Introduzca la cantidad 2 =9enor a %7757>: T'
A +abla de potencias para conversin binaria/-&(II
3otencia ,S :::1h! :::-h! ::%6h! :5E$h! 281:h
3otenciaI ,S T
.(),E A,efine el rea de cdigo
Empieza: AEtiqueta de inicio del programa
9ov -@! :Ih A)btiene modo de video actual
Int 1:h
9ov -@! :: A(ambia el modo de video al mismo anterior
Int 1:h A con la finalidad de que se borre la pantalla
9ov -L! Z,ata A)btiene la direccin del segmento de datos
9ov ,s! -x AInicializa a ,& con esa direccin

9ov ,x! )ffset 9ensae A,espliega el t'tulo del programa
(all Imprime A4lama a un procedimiento
9ov &i! )ffset ?esulta? AInicializa la variable ?esulta?
-dd &i!11
9ov -l!'T'
9ov O&iP! -l
)+?-:
9ov ,x!)ffset 3regunta A,espliega men# de opciones
(all Imprime
(all )bten+ecla AEspera a que se presione la opcin deseada
(mp -l! 6H A(ompara la seleccin con el d'gito 1 -&(II
Uae &ID0E A&i la opcin es ma"or a 1 brinca a &ID0E
9ov ,x! )ffset Error A,espliega mensae de error
(all Imprime
Ump )+?- A.rinca a )+?- para volver a preguntar
&ID0E:
(mp -l!75 A(ompara la seleccin con el d'gito 7 -&(II
Ube +),).IE* A&i es menor a 7 brinca a +),).IE*! sino contin#a
9ov ,x! )ffset Error A&i la opcin fu/ ma"or a 7 despiega el error
(all Imprime
Ump )+?-
+),).IE*:
(mp -l!75 A(ompara la selecin con el d'gito 7 -&(II
Unz (@E(-+),) A&i no es igual brinca a (@E(-+),)
Ump I0*(I)*7 A&i es igual brinca a I0*(I)*7 para terminar
(@E(-+),):
9ov Iuncion! -l ADuarda el n#mero de funcin a realizar
(-3(-*+:1:
9ov ,x! )ffset (ant0no9 A9ensae de captura de la cantidad 1
(all Imprime
9ov -h! :-h A(aptura la cantidad =hasta $ d'gitos>
9ov ,x! )ffset (ant0no*
Int 21h

9ov Error(-3! : A&upone que no ha" errores " que se est
9ov (antidad! : A operando sobre la cantidad 1
(all (onv*09 A(onvierte cantidad 1 a binario
(mp Error(-3! 1 ABerifica si hubo error
Uz (-3(-*+:1 AEn caso afirmativo regresa a la captura.
9ov (ant0no?! .x ADuarda el resultado de la conversin
(-3(-*+:2:
9ov Error(-3! : A&upone que no ha" error
9ov (antidad! 1 AIndica a (onv*09 que se trabaar con cantidad 2
9ov ,x! )ffset (ant,os9 A9ensae de captura de cantidad 2
(all Imprime
9ov -h! :-h A(aptura de la cantidad 2
9ov ,x! )ffset (ant,os9
Int 21@
(all (onv*um A(onvierte la cantidad 2 a binario
(mp Error(-3! 1 ABerifica si existi algun error
Uz! (-3(-*+:2 AEn caso afirmativo regresa a la captura
9ov (ant,os?! .x A-lmacena el valor binario de cantidad 2
A4a siguiente parte es el proceso de seleccin de la operacin
AYue se realizara:
9ov -l! Iuncion A(arga en -l la funcin que seleccion el usuario
(mp -l! 51h A?evisa si es 1
Une I0*(I)*2 A&i no es brinca a I0*(I)*2
(all 9ultiplica A9ultiplica las cantidades
Ump )+?- A?egresa al men# principal
I0*(I)*2:
(mp -l! 52h A?evisa si es 2
Une I0*(I)*5 A&i no es brinca a I0*(I)*5
(all ,ivide A,ivide las cantidades
Ump )+?-
I0*(I)*5:
(mp -l! 55h A?evisa si es 5
Une I0*(I)*6 A&i no es brinca a I0*(I)*6
(all &uma A&uma las cantidades
Ump )+?-
I0*(I)*6:
(mp -l! 56h A?evisa si es 6
Une I0*(I)*7 A&i no es brinca a I0*(I)*7
(all ?esta A?esta las cantidades
Ump )+?-
I0*(I)*7:
9ov -x! 6(::h AEsta funcin termina la eecucin
Int 21h Adel programa
A 3rocedimientos o rutinas del programa

9ultiplica 3roc *ear AIndicador de inicio de procedimiento
Lor ,x! ,x A,x G :
9ov -x! (ant0no? A3rimera cantidad
9ov .x! (ant,os? A&egunda cantidad
9ul .x A9ultiplica
(all (onv-&(II A(onvierte en -&(II
9ov ,x! )ffset ?esulta AImprime mensae del resultado
(all Imprime
9ov ,x! )ffset ?esulta? AImprime resultado
(all Imprime
?et A?egresa al programa principal
9ultiplica Endp AIndicador de fin de procedimiento

,ivide 3roc *ear
9ov -x! (ant0no? A(arga la cantidad 1 =dividendo>
9ov .x! (ant,os? A(arga la cantidad 2 =divisor>
(mp .x! : A?evisa que el divisor no sea cero
Unz ,IBI,E:1 A&i no es cero brinca a ,IBI,E:1
9ov (antidad! 5 A@ubo error asi que despliega el mensae " regresa al
programa
(all @uboError
?et
,IBI,E:1:
,iv .x AEfect#a la divisin
Lor ,x! ,x A,x G :. El residuo no es utilizado
(all (onv-&(II A(onvierte en -&(II el resultado
9ov ,x! )ffset ?esulta A,espliega el mensae del resultado
(all Imprime
9ov ,x! )ffset ?esulta? A,epliega el resultado
(all Imprime
?et
,ivide Endp
&uma 3roc *ear
Lor ,x! ,x A,x G : por si acaso existe acarreo
9ov -x! (ant0no? A(antidad 1
9ov .x! (ant,os? A(antidad 2
-dd -x! .x A?ealiza la suma
Unc &09-()*B A&i no existi acarreo brinca a &09-()*B
-dc ,x!: A&i existi
&09-()*B:
(all (onv-&(II A(onvierte en -&(II el resultado
9ov ,x! )ffset ?esulta A,espliega el mensae del resultado
(all Imprime
9ov ,x! )ffset ?esulta? A,espliega el resultado

(all Imprime
?et
&uma Endp
?esta 3roc *ear
Lor ,x! ,x A,x G : por si existe acarreo
9ov -x! (ant0no? A-x G cantidad 1
9ov .x! (ant,os? A.x G cantidad 2
&ub -x! .x A?ealiza la resta
Unc ?E&+-()*B A&i no ha" acarreo brinca a ?E&+-()*B
&bb ,x!: A&i ha" acarreo
?E&+-()*B:
(all (onv-&(II A(onvierte en -&(II el resultado
9ov ,x! )ffset ?esulta A,espliega el mensae del resultado
(all Imprime
9ov ,x! )ffset ?esulta? A,espliega el resultado
(all Imprime
?et
?esta Endp
Imprime 3roc *ear
9ov -h! :H A0tiliza la funcin H de la interrupcin
Int 21h A21h para desplegar una cadena
?et
Imprime Endp
)bten+ecla 3roc *ear
9ov ah! : A0tiliza la interrupcin 1%h para
Int 1%h A leer una tecla
?et
)bten+ecla Endp
(onv*um 3roc *ear
9ov ,x! :-h A9ultiplicador es 1:
(mp (antidad! : ABerifica si es la cantidad 1
Unz ()*B*09:1 A*o fu/! entonces es cantidad 2 " brinca
9ov ,i! )ffset (ant0no* F 1 A."tes leidos en la cantidad 1
9ov (x! O,iP
9ov &i! )ffset (ant0no* F 2 A4a cantidad 1
Ump ()*B*09:2
()*B*09:1:
9ov ,i! )ffset (ant,os* F 1 A."tes leidos de la cantidad 2
9ov (x! O,iP
9ov &i! )ffset (ant,os* F 2 A4a cantidad 2
()*B*09:2:
Lor (h! (h A(@ G :
9ov ,i! )ffset 3otencia A,ireccin de la tabla de potencias
,ec &i
-dd &i! (x
Lor .x! .x
&td
()*B*095:
4odsb A(arga en -4 el b"te cu"a direccin es ,&:&I
(mp -l! J:J A(ompara el b"te con el d'gito :
Ub ()*B*09:6 A&i es menor es invlido " brinca
(mp -l! JHJ A(ompara el b"te con el d'gito H
Ua ()*B*09:6 A&i es ma"or es invlido " brinca
&ub -l! 5:h A(onvierte el d'gito de -&(II a binario
(bC A(onvierte a palabra
9ov ,x! O,iP A)btiene la potencia a ser usada para multiplicar
9ul ,x A9ultiplica el n#mero
Uc ()*B*09:7 A&i ha" acarreo brinca =fu/ ma"or a %7757>
-dd .x! -x A&uma el resultado a .L

Uc ()*B*09:7 A&i ha" acarreo brinca
-dd ,i! 2 ABa a la siguiente potencia de 1:
4oop ()*B*09:5 A.rinca hasta que (L sea igual a :
Ump ()*B*09:%
()*B*09:6:
(all @uboE??)? A@ubo algun error! depliega mensae
Ump ()*B*09:% A.rinca a ()*B*09:%
()*B*09:7:
9ov (antidad! 2 A@ubo acareo en la conversin! lo que
(all @uboE??)? A significa que la cantidad es ma"or a %7757
()*B*09:%:
(ld A?egresa la bandera de direccin a su estado
?et A normal
(onv*um Endp
(onv-&(II 3roc *ear
3ush ,x
3ush -x ADuarda el resultado en la pila
9ov &i! )ffset ?esulta? AInicializa la variable ?esulta?
9ov (x! 1: A llenandola con asteriscos
9ov -l! '<'
(onv-&(II:1:
9ov O&iP! -l
Inc &i
4oop (onv-&(II:1
3op -x
3op .x
9ov .x! -x A3alabra baa de la cantidad
9ov -x! ,x A3alabra alta de la cantidad
9ov &i! )ffset ?esulta? A(adena donde se guarda el resultado
-dd &i! 11
9ov (x! 1: A,ivisor G 1:
).+E*,IDI+):
,ec &i
Lor ,x! ,x A,L contrendr el residuo
,iv (x A,ivide la palabra alta
9ov ,i! -x ADuarda cociente en ,I
9ov -x! .x A(arga palabra baa en -L
,iv (x A,L contiene registro de la divisin
9ov .x! -x ADuarda el cociente
9ov -x! ,i A?egresa la palabra alta
-dd ,l! 5:h A(onvierte residuo en -&(II
9ov O&iP! ,l A4o almacena
)r -x! -x A&i la palabra alta no es cero
Unz ).+E*,IDI+) A brinca a ).+E*,IDI+)
)r .x! .x A&i la palabra baa no es cero
Unz ).+E*,IDI+) A brinca a ).+E*,IDI+)
?et
(onv-&(II Endp
@uboE??)? 3roc *ear
(mp (antidad!: AEs la cantidad 1\
Unz @0.)E??)?:2 Ano
9ov ,x! )ffset Error1
(all Imprime
9ov Error(-3! 1 AEnciende la bandera de error
Ump @0.)E??)?:7
@0.)E??)?:2:
(mp (antidad! 1 AEs la cantidad 2\
Unz @0.)E??)?:5 Ano
9ov ,x! )ffset Error2
(all Imprime
9ov Error(-3! 1

Ump @0.)E??)?:7
@0.)E??)?:5:
(mp (antidad! 2 AEs una cantidad fuera de rango\
Unz @0.)E??)?:6 Ano
9ov ,x! )ffset Error5
(all Imprime
9ov Error(-3! 1
Ump @0.)E??)?:7
@0.)E??)?:6:
9ov ,x! )ffset Error6 AError de divisin por cero
(all Imprime
9ov Error(-3! 1
@0.)E??)?:7:
?et
@uboE??)? Endp
.&+-(X
End Empieza
,irectorio " bibliograf'a
(r/ditos
Ing. 9nico .rise;o (.
Idea original
@ugo Eduardo 3/rez 3.
,esarrollo e implementacin
.ibliograf'a
4enguae Ensamblador 3ara 9icrocomputadoras I.9
U. +err" Dodfre"
Ed. 3rentice @all @ispanoamericana! &.-.
9/xico
Ensamblador .sico
-. ?oas
Ed. (omputec Editores &.-. de (.B.
9/xico
I.9 3ersonal (omputer -ssembl" 4anguae +utorial
Uoshua -uerbach
Rale 0niversit"
^*ecesitamos tu opinin_
*uestra finalidad con este documento es llevar el conocimiento a tus manos.
3ara hacerlo en una forma ms eficiente es necesario conocer tu opinin!
sugerencias " cr'ticas.
*os gustar'a que nos mandaras tus programas escritos en ensamblador =^En
cdigo fuente por favor_> para mostrarlos en este espacio! as' como para
darte el reconocimiento que mereces. 3rocura incluir todos tus datos: tu
nombre! domicilio! profesin " tu direccin electrnica =si la tienes>! " la
versin de ensamblador que usas.
9anda tus programas " sugerencias relacionados con este tutorial a la
direccin huperezZrulfo.dca.udg.mx o si lo deseas manda tus comentarios
sobre el servidor en general a la direccin monicoZredudg.udg.mx
(omo informacin so" un alumno de la 0niversidad de Duadalaara! del
,epartamento de (iencias (omputacionales. Estudio la carrera de Ingenier'a
en (omputacin " me gustar'a aprender de ti. 4a primera direccin es mi
direccin personal! as' que sientete libre de mandar tus comentarios.
*ota:
Este documento ha sido modificado para una meor lectura por parte de los
usuarios.
4as modificaciones realizadas por parte de J4a Seb de los +utorialesJ son:
- (orreccin de letras que estaban estropeadas =acentos! e;es!...>
- 9eora de mrgenes " ordenacin de l'neas.

También podría gustarte