Está en la página 1de 15

Universidad De El Salvador

Facultad de Ingeniera y Arquitectura


Escuela de Ingeniera Elctrica
Sistemas Digitales Programables

Gua de laboratorio # 2.

Introduccin al Macro-ensamblador 80X86

Docente: Ing. Ricardo E. Cortez

Instructores:
Br. David Martnez
Br. Cesar Escobar
Br. Carlos Luna
Objetivos:

Dar a conocer al estudiante las directivas ms utilizadas del Macro-ensamblador en un


programa en lenguaje ensamblador.
Familiarizar al estudiante con el Macro-ensamblador y el lenguaje ensamblador.
Que el estudiante aprenda los procesos de ensamblado y enlazado (link) de programas en
lenguaje ensamblador para su ejecucin en una computadora personal.
Crear el cdigo fuente de un programa en lenguaje ensamblador.

Introduccin

Un estudio completo de microprocesadores, no solo involucra comprender el hardware, sino que


tambin es importante saber su conjunto (set) de instrucciones, el cual comprende su
programacin; ya que para darle utilidad al microprocesador es necesario hacer uso de este recurso.

El estudio de los microprocesadores queda justificado debido a que la evolucin de la tecnologa de


la automatizacin es impresionante (ms concretamente la de computadoras). Los CPUs de circuito
integrado de mediados y finales de los 70s como el 8086 y 8088 de INTEL posean alrededor de 105
transistores y conjuntos de instrucciones de aprox. 100 mnemnicos. En el presente se tienen cpus
en circuitos integrados con ms de 106 transistores.

Puesto que desea conocerse el lenguaje ensamblador del 8086 (modo real), es importante aclarar
lo siguiente:

Por qu molestarse en aprender lenguaje ensamblador, cuando ahora podemos crear rutinas en
otros lenguajes como C, Basic u otros, en los cuales la programacin es mucho ms fcil?
Existen muchas ventajas de aprender lenguaje ensamblador como:

1. Habilidad para controlar directamente el hardware y desarrollar fragmentos de programas


de rpida ejecucin.
2. Conocimiento profundo de sistemas basados en microprocesadores y de la interfaz
hardware/software.
3. Comprensin de la forma en que se manejan las diversas estructuras de datos tanto a bajo
como a alto nivel.

Dicho de otra forma, alguien puede construir una rutina que controle hardware desde cualquier
plataforma de alto nivel (por ejemplo, un programa que controle el movimiento de un motor de
pasos) y dicho programa puede funcionar perfectamente haciendo interfaz desde una PC
cualquiera. Sin embargo, el problema se presenta cuando se requiere que la aplicacin se construya
con un hardware mnimo, donde usar una computadora hara incurrir en un gasto excesivo e
innecesario. Generalmente se opta por utilizar un pequeo microprocesador o microcontrolador de
baja velocidad (por ejemplo un 80286 o inferior); en estos casos el programa de control suele
guardarse en memorias ROM EPROM cuya capacidad por unidad difcilmente supera los 64K de
memoria. Claramente se observa que el ahorro de memoria y de hardware es un factor
determinante, por lo que es en estos casos cuando el lenguaje ensamblador se vuelve la opcin ms
adecuada.
Adems, los programadores de las libreras de lenguajes de alto nivel programan en ensamblador,
puesto que necesitan que stas se ejecuten a gran velocidad.

Los requisitos de software necesarios para programar en ensamblador son:

Un procesador de palabras que genera cdigos ASCII


Un programa ensamblador.
Un enlazador (linker).

En esta prctica, se explican los conceptos fundamentales de los programas ensambladores, el


lenguaje ensamblador en la familia 8086 y la forma de crear programas usando el programa
ensamblador MASM de Microsoft.

ACLARACIN: En esta prctica NO se ensear al estudiante a programar, sino a construir


programas. Para poder llevar a cabo esta prctica, el estudiante ya deber ser capaz de dominar
los elementos mnimos necesarios para programar.

Marco Terico
La diferencia entre programar en un lenguaje ensamblador y uno de alto nivel es similar a la
diferencia entre un auto con palanca de cambios y uno de transmisin automtica: Con la
transmisin automtica se gana facilidad, pero se pierde control.

Lenguaje Ensamblador

Una instruccin en lenguaje de mquina, es una cadena de dgitos binarios, representada en la


misma base en que opera la mquina. Cuando dicha cadena es interpretada por el hardware,
provoca una respuesta nica por parte del computador.
Es importante recordar que cada familia de microprocesadores tiene su propio y nico conjunto de
instrucciones.
Por tanto, si se usa una cadena de bits que por ejemplo, causan la suma de 2 registros en un
procesador INTEL, la misma cadena puede causar su multiplicacin en un procesador MOTOROLA.

Actualmente, no se trabaja directamente manipulando cadenas de dgitos binarios, sino que


hacemos uso de representaciones simblicas de esas cadenas. En el lenguaje ensamblador todos los
operadores se representan mediante nombres escogidos debido a sus cualidades autoexplicativas
y mnemotcnicas. Por ejemplo: ADD es para agregar, SUB es para sustraer y de forma parecida
sucede con los dems cdigos.

En la mayora de lenguajes ensambladores, los programadores escogen los nombres del operador,
dejndonos seleccionar muchos de los operadores que necesitamos. Por ejemplo. Si movemos un
valor de memoria que se ha declarado hacia un registro (MOV AX, VALOR), MOV y AX ya son parte
del lenguaje, pero nosotros declaramos VALOR con todos sus atributos. Probablemente la ventaja
ms importante de la programacin simblica, en lugar de usar patrones en bits, es el control que
se obtiene sobre lo que se ha dado en llamar binding (atadura), es decir la asignacin de valores
directamente reconocibles por la mquina a expresiones simblicas que uno puede usar en el
programa fuente.

Otra ventaja de programar en el lenguaje simblico en lugar de en bits es que los smbolos permiten
ver la generalidad del programa. Aunque ambos son lenguajes simblicos, hay al menos 3 reas en
las cuales el lenguaje ensamblador nos permite ms control sobre la computadora que un lenguaje
compilador:

1. Refinamiento: Slo el programador en lenguaje ensamblador determina directa y


conscientemente las instrucciones en lenguaje de mquina que sern
ejecutadas y las representaciones detalladas de los datos sobre los cuales
operan; por estas razones nosotros slo podemos garantizar que el programa
encajar dentro de un rea dada de memoria o se ejecutar dentro de un
perodo de tiempo dado cuando programemos en lenguaje ensamblador. Para
dar una idea del ahorro en tiempo y espacio que significa programar en
lenguaje ensamblador, observemos la comparacin que aparece en el apndice
A.
2. Atencin Rpida: Hay una brecha entre el tiempo que el usuario de un compilador encuentra una
necesidad y el tiempo en el que los escritores del compilador pueden
responder a ella. Con un lenguaje ensamblador, podemos codificar una
solucin de manera inmediata (prcticamente la nica limitante es nuestra
capacidad de programacin).
3. Innovacin: El lenguaje ensamblador es casi siempre la eleccin cuando una aplicacin de
computadora totalmente nueva est siendo investigada, aun cuando la
necesidad de su utilizacin podra no estar muy clara al principio.

Programas ensambladores

Un programa ensamblador es aquel que permite escribir cdigo en lenguaje ensamblador en lugar
de tener que usar largas cadenas de bits en lenguaje mquina. La mnemotecnia es el arte de mejorar
la eficiencia de la mente humana. El cdigo de operacin mnemnica es un cdigo en el cual los
nombres de las operaciones son abreviados y expresados mnemnicamente para facilitar recordar
la operacin que representan. El programa ensamblador clsico toma una rutina y la convierte a
una forma simblica binaria para ms tarde procesarla por medio de un enlazador (linker). As, con
el MASM de Microsoft la conversin es hecha en dos pasos; o sea que el cdigo fuente es examinado
dos veces.

La estrategia de dos pasos es muy simple: el primer paso, a travs del cdigo fuente, recoge todas
las definiciones de smbolos en una tabla de smbolos. El segundo paso convierte el programa en
una forma simblica a cdigo binario usando la tabla de smbolos del primer paso.

Los ensambladores permiten usar cdigos mnemnicos y que nombres simblicos sean asignados a
localidades de memoria, proporcionan facilidades para direccionar los clculos en trminos de tales
nombres simblicos y normalmente permiten introducir constantes numricas y de caracteres de
diversas formas.

Una instruccin tpica consiste de un cdigo de operacin, una direccin y uno o ms campos de
registros. La direccin podra referirse a un rea de datos por ejemplo. Un programa ensamblador
procesa un conjunto fijo de cdigos mnemnicos y un conjunto de smbolos definidos por el
programador. La direccin de tales smbolos podran ser definidas explcitamente o implcitamente
atndolas como rtulos a instrucciones particulares o palabras de datos.

Aunque un smbolo represente una direccin, un ensamblador no puede convertir rtulos de


smbolos directamente en direcciones absolutas porque la direccin en memoria en la cual una
instruccin particular ser cargada no se conoce en el momento del ensamble, la dificultad es
resuelta en dos pasos:

1. El ensamblador registra el desplazamiento respecto al principio del cdigo, de la instruccin en


cuestin como el valor del rtulo de smbolo.
2. El ensamblador marca el smbolo a la salida del ensamblador como un valor relativo o
relocalizable; este valor es ajustado ms tarde por el enlazador (linker) o el cargador.

Un ensamblador proporciona la siguiente informacin acerca del programa que se ha ensamblado:

Listado de instrucciones simblicas.


Tabla de smbolos definidos/usados en la rutina.
Tabla de referencia cruzada: para cada smbolo definido, su nombre, valor y una lista de
todas las instrucciones que lo referencian.

Directivas del programa ensamblador.

Las directivas del ensamblador tienen dos propsitos: uno de ellos es el de brindar informacin para
controlar el proceso de ensamble. Adems proporcionan una forma de definir palabras de datos en
un programa.

Las directivas tambin se conocen como pseudo-operaciones debido a que comnmente se


designan mediante cdigos especiales en el campo de operacin.
Macros y macroensambladores

En su forma ms simple, una macroinstruccin (un macro) es una sola instruccin de computadora
que representa una secuencia dada de instrucciones Los macros son usados ms usados a menudo
para representar secuencias relativamente cortas de instrucciones o secuencias que involucran un
nmero relativamente grande de insercin de argumentos. Casi siempre un conjunto de macros se
combina en una biblioteca de macros. Un ejemplo muy comn de esto es una biblioteca de macros
para ayudar a comunicarse con el sistema operativo.

A medida que vamos creando programas ms y ms extensos y complejos nos damos cuenta que
un determinado patrn de instrucciones aparece en varios lugares dentro de un programa, solo con
pequeas variaciones. Esto es particularmente el caso si hay una operacin comn que requiere
varias instrucciones para su ejecucin. En este caso es conveniente el ser capaz de escribir una sola
llamada y que sea el sistema el que genere la secuencia de instrucciones. Hay algunas ventajas en
esto:

Se escriben menos lneas de cdigo, lo cual significa menos posibilidades de errores.


El programa puede ser ms legible, principalmente porque hay menos lneas. El uso de
nombres de macros que sean descriptivos tambin ayuda a la legibilidad.
Finalmente, si en un momento posterior se hace necesario modificar la funcin que el macro
realiza, nicamente tenemos que cambiar un lugar (el macro) en vez de hacerlo en mltiples
partes del programa en mltiples programas.

Para trabajar con macros, se necesita una pieza de software llamada macroprocesadores, el cual es
generalmente parte de un lenguaje ensamblador. El trabajo de un macroprocesador es sencillo: El
programador proporciona algunas definiciones de macros y que es lo que las va a reemplazar; y el
macroprocesador luego reemplaza cada aparicin del macro con su correspondiente secuencia de
instrucciones definidas.

Un macroprocesador a menudo se combina con un ensamblador para que el programador le


parezca que los dos son uno slo llamado macro ensambladores.

En el MASM de Microsoft, un nuevo macro puede ser creado (o definido) en cualquier punto de un
programa.
Dado que el macroprocesador, ya sea que est o no incluido en el ensamblador, es puesto en un
modo especial de creacin de macro cuando encuentra una definicin de macro. La creacin de uno
no genera ninguna instruccin en el programa. Slo una llamada explcita a un macro genera
instrucciones.

Componentes de un macro
Un macro est pensado para limitar el rea de inters para cualquier otra tarea y para minimizar el
impacto de cambios posteriores. Esto lo consigue aislado y formalizando los canales de
comunicacin, o interfaces entre s mismo y otras componentes del programa.

Todos los macros en el MASM poseen un nombre, un inicio, un cuerpo y un final. Normalmente
especifican una lista de uno o ms parmetros auxiliares que pueden ser parmetros pasados al
macro. El nombre de un macro es un smbolo estndar de ensamblador. Puede incluir de 1 a 31
caracteres alfanumricos, incluso los caracteres especiales ($ _ ? . @).
Los nombres auxiliares son una lista de parmetros, separados por comas, los cuales sern utilizados
dentro del macro. Los parmetros son variables temporales cuyos valores podran cambiar con cada
nueva invocacin del macro. Estos parmetros pueden ser numricos o textos (incluyendo nombres
de registros), otros nombres de macros mnemnicos y etiquetas de programa. Las etiquetas se
refieren o corresponden a valores numricos o posiciones de memoria.

El cuerpo de un macro consiste de opcodes, directivas, etiquetas y comentarios; es decir, el cuerpo


del macro son lneas de cdigo en lenguaje de ensamble adems de documentacin interna.

Cuando se invoca un macro, este es expandido de manera que los parmetros referenciados en el
cuerpo se reemplazan por los valores que les hemos pasado. El final es un ENDM, lo cual seala al
macroensamblador que el cdigo del macro ha terminado.

Macros vrs. Subrutinas


Un macro es en realidad reemplazado por su forma expandida despus de haber sido procesado por
el macroensamblador, de manera que si nuestro programa contiene n llamadas al macro,
entonces n copias de las instrucciones que representa son insertadas en el programa. En cambio
en una sub-rutina existe una sola copia de la secuencia de instrucciones y cada llamada se reemplaza
por un salto a esa seccin, la cual se ejecuta y luego se retorna.

; Esqueleto del ejemplo de un macro a fin de mostrar las partes


; Principales de un macro.

; NOMBRE MACRO DIRECTIVA PARMETROS AUXILIARES

EJEMPLO1 MACRO PARA00,PARA01 ;INICIO DE LA MACRO.

; Ahora van los comentarios internos de la macro.

; El cuerpo de la macro incluye todo lo que se encuentra entre la


; lnea que contiene la directiva MACRO y la directiva ENDM.

MOV AX,PARA00 ;instruccin tpica.


EXITM ; directiva

ENDM ; Fin del macro.

Tal como veremos a continuacin la estructura de un macro tiene muchos puntos en comn con la
estructura de un programa completo en lenguaje ensamblador.

Estructura de un programa en el MASM

En el ejemplo que se presenta a continuacin se pretende mostrar la estructura de un programa en


lenguaje de ensamble en el ambiente del MASM. Se hace nfasis en el uso de las directivas ms
comunes, ya que sera imposible poder incluir todas las directivas en un programa tan pequeo y
sencillo como este. Sin embargo, si queremos conocer las otras directivas estas se encuentran
bastante explicadas en guas posteriores.
Antes de presentar el listado del programa, (ver apndice A) es necesario aclarar que el cdigo
fuente puede ser escrito usando cualquier procesador de texto que genere un archivo en cdigo
ASCII puro. A simple vista se nota que este programa no realiza ninguna cosa importante,
nicamente hemos empleado tres instrucciones en lenguaje de ensamble. De hecho, para el
propsito que ha sido expuesto en este ejemplo, podramos incluso no haber utilizado instrucciones.
Lo importante es observar la estructura y la forma de utilizacin de las directivas.

Debe aclararse que aunque en este ejemplo se han utilizado letras maysculas para las instrucciones
y las directivas, esto es indiferente para el ensamblador. Podemos incluso mezclar maysculas y
minscula. CSEB significa lo mismo que CseB para el programa ensamblador. Adems la lnea de
instruccin puede comenzar en cualquier columna y no es obligatorio utilizar un formato tabulado
para el programa fuente, aunque se recomienda por motivos de claridad y legibilidad de un
programa.

Aunque en un programa en ensamblador es posible trabajar con los cuatro segmentos (CS, SS, DS,
ES), solamente es obligatorio el uso de dos segmentos: el de cdigo y el de pila (stack). Para definir
un segmento utilizamos la directiva SEGMENT, la cual tiene el siguiente formato:

nombre SEGMENT alineamiento combinacin `clase`


:
:
nombre ENDS

El nombre del segmento puede ser nico o puede ser el nombre de varios segmentos. Si esto ltimo
es el caso (varios segmentos tienen asignado el mismo nombre), el MASM trata a los segmentos
como si, fueran piezas de un nico segmento.

El alineamiento define el rango de direcciones de memoria de las cuales ser seleccionada la


direccin de inicio del segmento. El alineamiento puede ser:

BYTE: El segmento puede comenzar en cualquier byte de la memoria.


WORD: El segmento puede comenzar en el lmite de una palabra (donde la direccin sea
par).
PARA: El segmento puede comenzar en el lmite de un prrafo (direccin divisible por 16).
PAGE: El segmento puede comenzar en los lmites de una pgina (los ltimos ocho bits de
la direccin son ceros).

La combinacin indica la manera en que los segmentos sern combinados o cargados cuando se
ejecute el enlazador (linker). Si no se seala ningn tipo de combinacin, cada segmento recibe su
propio segmento fsico cuando es cargado en memoria. La combinacin puede ser cualquiera de las
siguientes: PUBLIC, COMMON, AT (direccin), STACK, MEMORY.

PUBLIC indica que todos los segmentos con el mismo nombre y con atributo PUBLIC sern
encadenados juntos.

STACK sirve para indicar que el segmento es parte de la pila o stack.


COMMON sirve para indicar que todos los segmentos con el mismo nombre comenzaran en la
misma direccin y se traslaparn en memoria.

MEMORY indica que todos los segmentos con este atributo se colocarn en direcciones de nmero
mayor que cualesquiera segmentos. Con AT (memoria), el segmento se coloca en el prrafo indicado
por memoria, que puede ser cualquier expresin slida; sin embargo no puede contener una
referencia a algn smbolo definido posteriormente en el archivo fuente.

La `clase` se emplea para hacer referencia a una coleccin de segmentos, los segmentos con el
mismo nombre de clase se colocan en memoria secuencialmente, siguiendo el orden en que los
encontr el enlazador.

La directiva PAGE (Lneas, columnas) sirve para indicar al ensamblador como queremos que nos
genere el listado ensamblado (los valores por defecto son 66 filas y 80 columnas).

Las directivas TITLE y SUBTTL, sirven para colocar un ttulo y un subttulo a las pginas del listado
ensamblado.

La directiva .8086 le indica al ensamblador que solo debe aceptar instrucciones vlidas para los
procesadores 8086/8088.

La directiva ORG inicializa el contador de localidad del MASM. Este contador de localidad es el que
sirve al MASM para llevar el control de la posicin actual en el equipo fuente.

La directiva COMMENT sirve para escribir comentarios. El comentario es encerrado por un smbolo
delimitador ($,&, , etc.).

La directiva DB sirve para reservar un rea de memoria o para inicializar un rea de memoria de 8
bits; a directiva DW reserva un rea de 16 bits y DD un rea de 32 bits.

En la lnea de nuestro programa ejemplo hemos inicializado una parte de la memoria colocando 64
veces la cadena (`stack`)

La ltima lnea de nuestro programa contiene la directiva END. La cual le indica al ensamblador que
hemos llegado al final del programa fuente. Si despus de END colocamos una etiqueta, estamos
indicndole al ensamblador el punto de entrada (dnde comenzar a ejecutar).

Proceso de ensamble del programa

Una vez que hemos creado nuestro archivo fuente (el cual debe llevar la extensin .ASM) estamos
preparados para utilizar el MASM. Vamos a asumir que tanto el programa fuente como los
programas del MASM se encuentran en un mismo directorio. Esto lo haremos por motivos de
facilidad y claridad de la explicacin. Sin embargo debemos tener en cuenta que esto NO es lo
recomendable si queremos dedicarnos seriamente a la creacin de programas; ya que por lo general
el programa procesador de textos se encuentra en un subdirectorio propio, mientras que el MASM
y el linker se encuentran en otro u otros directorios. Esto no ser un problema si manejamos
aceptablemente los comandos del DOS, ya que la manera de invocar al MASM es muy parecida a la
sintaxis del DOS.

En esta ocasin utilizaremos la manera ms sencilla de ejecutar el ensamble de nuestro programa,


pero se debe tener en cuenta que existen otras formas de invocar al MASM y tambin existen
algunas opciones que podemos escoger al momento de realizar el ensamble.

Si los archivos de nuestro inters se encuentran en el directorio raz del disco A; a partir del prompt
del DOS escribimos:
MASM

El ensamblador nos responde pidindonos el nombre del archivo fuente que queremos ensamblar
(asume que tiene extensin .ASM). Entonces escribimos ese nombre (para este ejemplo es el
archivo PRIMASM.ASM)
Primasm

A continuacin nos pide que indiquemos cual es el nombre que le queremos dar al archivo objeto
que se va a generar. Aparecer entre corchetes el nombre que le ser asignado si nosotros no le
indicamos otro nombre. Si aceptamos ese nombre, nicamente presionamos la tecla ENTER().

De igual manera nos pide que le indiquemos el nombre que queremos poner al listado ensamblado
y al archivo con la referencia cruzada. A diferencia de lo que sucede con el archivo objeto; si solo
presionamos la tecla ENTER le estamos indicando que NO queremos que cree esos archivos.

Para nuestro ejemplo si queremos esos dos archivos, por lo tanto escribimos:

Primasm
Primasm

Para finalizar, el MASM nos indica si detect algn error. En caso de que no nos diga explcitamente
cual es el error cometido, puede indicarnos el nmero de error.

Suponiendo que no se ha detectado ningn error, el siguiente paso es utilizar el programa LINK para
crear un programa ejecutable y relocalizable a partir del programa objeto creado por el MASM.

PROCESO DE ENLAZADO (LINKEO) DEL PROGRAMA

Para ejecutar el encadenamiento (ejecucin del programa LINK), solamente escribimos:

link

A continuacin, se nos pide que indiquemos el archivo objeto que se desea enlazar. En este caso,
el archivo es PRIMASM.OBJ.
A continuacin, se nos pide introducir el nombre del programa ejecutable que va a ser creado. Por
defecto se crea un archivo con el mismo nombre, pero extensin .EXE (PRIMASM.EXE para este
caso). Si este nombre le parece adecuado, solamente presione ENTER ( ).

Finalmente, se pide el nombre que desea ponerle al archivo que contenga el mapa de smbolos. Se
pide tambin el nombre de las bibliotecas que se desean enlazar con nuestro programa objeto. De
momento no se trabajar con estas ltimas peticiones, as que presionaremos [ENTER] 2 veces
seguidas ( ).

Si el enlazador (linker no encuentra ningn error, se crear el programa ejecutable. Para correrlo,
solamente escribimos su nombre a partir de la lnea de comandos del DOS como se muestra:

Primasm

Ya que el programa no posee ninguna instruccin que genere alguna salida visible o audible, no ser
posible apreciar el correcto funcionamiento del programa. Adems, al correr el programa, se
perder el control sobre la computadora. Esto se debe a que los programas escritos para correr bajo
DOS deben cumplir con algunas formalidades que permitan su ejecucin normal y luego, al finalizar,
debe devolver el control al sistema operativo; pero dado que la creacin de programas ejecutables
bajo el DOS NO es uno de los objetivos de esta prctica, se dejar para un laboratorio posterior.

El objetivo de esta prctica es la creacin del listado ensamblado, lo cual ya se hizo. En este listado
ensamblado aparece tanto el cdigo fuente como la representacin del cdigo de mquina para
cada instruccin ensamblada adems de los nmeros de lnea asociados con cada lnea de listado
(estos nmeros sirven como una referencia para conocer la localizacin de smbolos) y una columna
mostrando el desplazamiento en hexadecimal (partiendo de cero) de cada instruccin que aparece
en el listado.

Para ver todo lo anterior, podemos escribir TYPE primasm.lst , o bien podemos auxiliarnos
de un procesador de textos tal como el block de notas (NOTEPAD) o cualquier otro.

Como sugerencia, se recomienda antes de realizar la prctica, trate de ensamblar manualmente el


programa PRIMASM.ASM y luego compare los resultados con los obtenidos en PRIMASM.LST
Desarrollo de la prctica

1. Escriba el programa del apndice A en un procesador de texto y cree un archivo ASCII puro
con extensin .ASM
2. Ensamble el programa y genere el cdigo objeto respectivo. Si encuentra errores, corrjalos
e intente ensamblar nuevamente hasta tener xito.
3. Imprima el cdigo objeto.
4. Utilice el programa LINK (el enlazador) para crear el programa ejecutable.
5. Crralo.
6. Repita todos los pasos anteriores para el programa del apndice B.

Asignaciones

Explique el proceso de ensamble de un programa en macro assembler.

Investigue y explique los mtodos de lectura de teclado y la impresin en pantalla.

Disear un programa en el que se solicite el ingreso de 4 nmeros entre 0 y 20 (los nmeros


menores a 10 deben ser ingresados con un cero a la izquierda), luego del ingreso que
muestre un men estilo tabla solicitando la operacin que se desea realizar, que no distinga
entre minscula y mayscula para seleccionar la opcin del men y que en el caso de
ingresar una opcin no vlida (siempre durante el men) muestre un mensaje de error y
aguarde a que se presione enter para volver al men.

Disear un programa en el cual se ingresen dos nmeros de un byte cada uno, y que solicite
la operacin matemtica a realizar, la cual se seleccionara de acuerdo a la siguiente tabla:

Letra Operacin
S Suma
R Resta
M Multiplicacin
D Divisin
Cualquier otra letra Operacin no valida
Sin que haga diferencia entre maysculas y minsculas, es decir si se ingresa S o s el
programa siempre realice la suma y as con las dems instrucciones.

Disee un programa con dos tablas de 10x5, es decir, tablas de 10 posiciones de 5 bytes
cada una de nombres USERS y PASSWORD la primera posicin de la tabla USERS debe
contener 5 caracteres (USER1) y la primera posicin de la tabla PASSWORD contener 5
caracteres (PASS1). En principio el programa debe solicitar un usuario y contrasea (que
sern los guardados por defecto), de lograr esto correctamente debe mostrarse un men
estilo tabla

La descripcin de las opciones es la siguiente:


debe solicitar un nombre de usuario y una password (imprimir * por cada
N
carcter ingresado) y al finalizar esperar enter para volver al men,
Debe mostrar un mensaje "sesin finalizada" y volver al men y por ende
X
restringir las opciones I y N hasta que se inicie sesin.
B Solicitar lo mismo que al inicio del programa.
Debe imprimir los usuarios y contraseas de la forma USER1-->PASS1 y la opcin
I
E finaliza el programa

Todo ingreso de datos correctamente deber ser almacenado en USERS y PASSWORD


respectivamente, no distinga entre minscula y mayscula para seleccionar la opcin del men y
que en el caso de ingresar una opcin no vlida (siempre durante el men) muestre un mensaje de
error y espere a que se presione enter para volver al men
ANEXO

Apndice A

PAGE 50,132
TITLE PRIMASM Primer programa en ensamblador (PRIMASM.ASM)
SUBTTL Uso de directivas y estructuras de un programa.
.8086

COMMENT +
DESCRIPCION: Este mdulo limpia el contenido
del registro AX, hacindolo cero.
Despus coloca en el registro AX
el nmero 18.
+

STACK SEGMENT PARA STACK 'STACK' ; inicio del segmento de pila.

; A continuacin se inicia con cero el segmento de pila (STACK) y


se
; carga con una cadena de caracteres ( 64 veces la palabra
'STACK').

DB 64 DUP ('STACK')

STACK ENDS ; Fin del segmento de pila.

CSEG SEGMENT PARA PUBLIC 'CODE' ; inicio del segmento de cdigo.

ORG 0

ASSUME CS:CSEG,SS:STACK ; definimos los segmentos.

CODIGO PROC NEAR

SUB AX,AX ; Borra el contenido de AX


MOV AX,18D ; asigna a AX el valor 18 (decimal).
SUB AX,18D ; resta 18 decimal a AX,
; volviendo su valor a cero.

CODIGO ENDP

CSEG ENDS ; fin del segmento de cdigo.

END CODIGO ; fin del programa.


Apndice B

; Programa para desplegar todos los caracteres en pantalla

; El primer paso a dar es definir los segmentos:

; Segmento de pila (STACK) de longitud 256 bytes:

STACK SEGMENT PARA STACK 'STACK'


DB 256 DUP (0)

STACK ENDS

; Segmento de cdigo:

CODE SEGMENT PARA PUBLIC 'CODE'

INICIO PROC FAR


ASSUME CS:CODE,SS:STACK
PUSH DS
MOV AX,0
PUSH AX

; PRIMER PASO: limpiar la pantalla

MOV AX,0B800H ; Direccin del segmento de memoria


; para el adaptador del monitor.
MOV ES,AX ; Fijar a ES como registro base.
MOV DI,0 ; Desplazamiento inicial del segmento ES.
MOV AL,' ' ; Caracter para borrar.
MOV AH,07H ; Byte de atributo para un
; despliegue normal.
MOV CX,2000 ; Nmero de veces a repetir la
; instruccin que sigue a REP.
CLD ; STOS cargue la memoria y
REP STOSW ; Escribe el caracter contenido en AL
; a la pantalla.

; SEGUNDO PASO: Llenar la pantalla con 256 caracteres


; separados por una fila y una columna c/u.

MOV AL,0 ; AL contiene el caracter a desplegar.


MOV AH,0 ; AH contiene el nmero de columna.
MOV DI,160 ; DI contiene el desplazamiento y se
; inicia para que apunte al primer
; caracter de la 2a. fila.
; Lazo que llena la pantalla:

LAZO: MOV ES:[DI],AL ; Pone el caracter en la memoria del


; adaptador.
ADD DI,4 ; Apuntar a la prxima posicin.
ADD AH,2 ; Actualizar la columna.
CMP AH,80 ; Detectar fin de fila.
JB SALTO ; Si no es fin de fila, saltar
; (ir a "SALTO").
ADD DI,160 ; Si es fin de lnea, cambiar de fila.
MOV AH,0 ; Volver a primera columna.
SALTO: CMP AL,255 ; Se han desplegado todos los caracteres?
JE FINAL ; Si ya se desplegaron todos los caracteres,
; ir a la salida.
INC AL ; Ir al prximo caracter.
JMP LAZO ; volver al inicio del lazo.

; TERCER PASO: Despus de escribir todos los caracteres, esperar,


; borrar la pantalla y volver al DOS.

FINAL:
MOV AX,400H ; Define el tiempo del retardo
; junto con CX.
RETARDO: MOV CX,0A000H ; El retardo variar segn la
; velocidad del CPU.
; Aproximadamente 5 seg. en una
; CPU Pentium 75 MHz.
RETARDAR: LOOP RETARDAR
INC CX
DEC AX
JNZ RETARDO
MOV DI,0
MOV AL,' '
MOV AH,07H
MOV CX,2000
REP STOSW
RET

INICIO ENDP
CODE ENDS

END INICIO

Escriba el programa del apndice B como un procedimiento cercano (denominado


CARACT), el cual debe ser llamado por un programa principal similar a
PRIMASM en cuyo segmento de cdigo se define:

CODIGO PROC FAR


PUSH DS
MOV AX,0
PUSH AX
CALL CARACT
;Aqu escribir instrucciones para leer la tecla "enter". Si es la
;tecla "enter" escribir a continuacion:
RET ;retorno a DOS. Si no es la tecla "enter", esperar hasta que lo
;sea.
CODIGO ENDP
CSEG ENDS
END CODIGO

También podría gustarte