28
Ingeniería en Sistemas Computacionales LENGUAJE ENSAMBLADOR “Uso de Procedimientos, Macros o Librerías y uso del altavoz de la computadora”

uso de procedimientos y macros (lenguaje ensamblador)

Embed Size (px)

Citation preview

Page 1: uso de procedimientos y macros (lenguaje ensamblador)

Ingeniería en Sistemas Computacionales

LENGUAJE ENSAMBLADOR

“Uso de Procedimientos, Macros o Librerías y uso del altavoz de la computadora”

Page 2: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Índice

Contenido págs.

Introducción .......................................................................................................................................................................3Interfaz programable de periféricos (ppi) 8255.............................................................................................................10Temporizador 8253 u 8254........................................................................................................................... 12Desarrollo y código...........................................................................................................................................................18Conclusiones .....................................................................................................................................................................21Referencias .......................................................................................................................................................................22

Instituto Tecnológico de la Laguna Pag. 2

Page 3: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Introducción.

MODULARIZACION Y PROGRAMACIÓN HIBRIDA

Introducción.

La programación modular es uno de los métodos de diseño mas flexibles y poderosos para el mejoramiento de la productividad de un programa. Usando la programación modular el problema se divide en módulos, donde cada una de los cuales ejecuta una única actividad o tarea y se codifican independientemente de otros módulos. Cada uno de estos módulos se analiza, se codifica y se prueba de preferencia por separado.

Al trabajar con lenguaje ensamblador, la necesidad de la estructuración es, si cabe, aún es más vital, puesto que cualquier tarea, por sencilla que parezca, puede requerir una gran lista de sentencias ejecutables. No hay que olvidar que estamos trabajando a un nivel muy bajo, más que cualquier otro lenguaje al que esté acostumbrado.

Todo programa contiene un módulo denominado programa principal que controla todo lo que sucede; si se transfiere el control a un submódulo, éste ejecuta su función y una vez que la termina, regresa el control al módulo desde donde fue llamado. En muchos casos es el módulo principal.Si la tarea asignada a cada submódulo es demasiado compleja, éste deberá descomponerse en otros módulos más pequeños. Este proceso de descomposición continúa hasta que cada módulo tenga una tarea específica que ejecutar. Esta tarea puede ser:a) Entrada.b) Salida.

c) Manipulación de datos.d) Control de otros módulos.e) Alguna combinación de los anteriores.

En el Lenguaje ENSAMBLADOR esta técnica se puede llevar a cabo mediante Macros y Procedimientos.

Procedimientos.

Los lenguajes de alto nivel, al menos la mayoría de ellos, permite codificar bloques de sentencias a los que se asigna un nombre, de tal forma que para ejecutar dichas sentencias, desde cualquier punto de la aplicación basta con introducir ese identificador y, en caso necesario, facilita los parámetros adecuados. A estos bloques de sentencias, dependiendo del lenguaje, se les conoce como procedimientos, funciones o métodos, según los casos.

En ensamblador se opera con direcciones, a pesar de que éstas pueden estar representadas mediante etiquetas que hacen más fácil nuestro trabajo. La transferencia mágica de parámetros, por la que unos valores facilitados tras un identificador aparecen como argumentos del procedimiento invocado, es algo que no existe. Sí tenemos a nuestra disposición, no obstante, una instrucción capaz de saltar a una dirección dada guardando el actual valor del registro IP, de tal forma que ésta puede recuperarse posteriormente para volver y continuar la ejecución por el punto en el que se interrumpió.La instrucción que nos permite invocar a un procedimiento es CALL. Esta toma como parámetro un valor inmediato, la dirección a la que debe transferir el control, o bien indirecto a través de un registro o un campo que contendrá la dirección a la que tiene que apuntar IP a partir de ese momento.

Aparentemente CALL es similar a la instrucción JMP, ya que transfiere la ejecución a una dirección de forma incondicional. La diferencia es que, antes de que se produzca ese salto, CALL guarda en la pila el valor actual del registro IP, en caso de que el salto sea una dirección dentro del mismo segmento que indica CS, o bien, los valores de CS e IP, si el salto es a una dirección de otro segmento. El primer tipo de salto se denomina NEAR o cercano, mientras que el segundo se le conoce como salto FAR o lejano. En el primero se necesitan 16 bits, tan sólo la dirección relativa al segmento que indica CS y en el segundo los 32 bits precisos para dar valor a CS e IP tras guardarlos en la pila.

Una vez que se ha guardado el valor de IP o de CS e IP, se ejecutan las instrucciones que haya en la dirección indicada. Estas pueden efectuar, como es lógico, cualquier tarea, siempre que tengamos en cuenta que al llegar al final, justo antes de devolver el control, la pila debe encontrarse en la misma situación en la que se encontraba al principio. Si hemos introducido valores, éstos deben extraerse. Lo importante es que el puntero de la

Instituto Tecnológico de la Laguna Pag. 3

Page 4: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

pila, en el momento de volver, esté apuntando a los valores que introdujo en ella la instrucción CALL. Si la instrucción CALL guarda el actual puntero de instrucción y transfiere la ejecución al procedimiento, la instrucción RET tiene el efecto inverso, recuperándose la dirección de la pila, devolviéndola a CS e IP e incrementando éste último para proceder a ejecutar la instrucción que sigue al CALL que invocó el procedimiento.

La instrucción RET, por tanto, también es un salto incondicional, similar a JMP, con la diferencia de que la dirección a la que saltará debe estar almacenada en la pila, generalmente por una llamada previa a CALL. Teniendo en cuenta esto, entenderá lo importante que es que SS:SP conserven los valores que tenían al iniciar la ejecución del procedimiento, porque, de no ser así, la instrucción RET podría transferir la ejecución a un punto incorrecto y causar la caída del sistema.

¿Cómo sabrá la instrucción RET si debe recuperar de la pila sólo el valor de IP o también el de CS? La respuesta es que depende de cómo se haya definido el procedimiento al que se invocó con CALL. MASM y TASM cuentan con un preprocesador que, a partir de ciertas palabras claves como PROC FAR o PROC NEAR, se encargan de generar las instrucciones ensamblador adecuadas.

Sintaxis:etiqueta PROC [NEAR | FAR]

secuencia de sentenciasRET constante

etiqueta ENDP

Donde:etiqueta: Es un símbolo asignado como nombre al procedimiento, la distancia pude ser NEAR ó FAR,

cualquier RET dentro del PROCEDIMIENTO automáticamente toma la misma distancia.constante: STACK se usa para pasar argumentos a un procedimiento, si se conoce el número de WORDS

pasadas al STACK como argumentos, constante puede contener ese número, de tal forma de liberar esos argumentos después de salir del procedimiento.

La etiqueta se usa para llamar al PROCEDIMIENTO con una instrucción CALL, entonces, la etiqueta contiene la dirección de inicio de la primera instrucción del procedimiento. Esta instrucción realiza su trabajo colocando en el STACK la dirección de la siguiente instrucción y transfiriendo el control a la dirección especificada por el operando. <para una llamada NEAR, SP es decrementado en dos y el offset es cargado en el STACK ; el nuevo offset es cargado en IP.

Sintaxis: CALL etiquetaetiqueta: Es el nombre del procedimiento. Se transforma en la dirección del procedimiento.

Macros.

Para cada instrucción simbólica que el programador codifica, en ensamblador, genera una instrucción en lenguaje máquina. Pero para cada enunciado codificado en un lenguaje de alto nivel, como C o Pascal, el compilador genera muchas instrucciones de lenguaje máquina. A este respecto, se puede pensar, en un lenguaje de alto nivel consistente de macro enunciados.

El ensamblador tiene facilidades que el programador puede usar para definir macros. Es necesario definir un nombre específico para la macro, junto con el conjunto de instrucciones en ensamblador que la macro va a generar. Después, siempre que necesite codificar el conjunto de instrucciones, sólo codifique el nombre de la macro y el ensamblador genera de manera automática las instrucciones que el programador definió.

Las macros son útiles para los siguientes propósitos:-Simplificar y reducir la cantidad de codificación repetitiva.-Reducir errores causados por la codificación repetitiva.-Linealizar un programa en ensamblador, para hacerlo más legible.

Para macros que se necesiten incluir en un programa, primero tiene que definirlas. Una definición de macro aparece antes de cualquier definición de segmento. La sintaxis de la macro es la siguiente:

Instituto Tecnológico de la Laguna Pag. 4

Page 5: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

nombre MACRO [parámetro [,parámetro]....] secuencia de sentencias.

ENDM

Donde:nombre: Deberá ser único, y reunir los requisitos de un símbolo, con él podemos invocar al macro.parámetros: Son símbolos que actúan como receptores de valores pasados como argumento a la MACRO

cuando ésta es llamada. El número máximo de parámetros deberán caber en una línea.

Examinaremos una definición de macro sencilla que inicializa los registros de segmento para un programa .EXE

INIZIALIZA MACROMOV AX, @DATAMOV DS, AXMOV ES, AX

ENDM

El nombre de esta macro es INICIALIZA, aunque es aceptable cualquier otro nombre válido que sea único. La directiva MACRO en la primer línea le indica al ensamblador que las instrucciones que siguen hasta ENDM (“fin de la macro”), son parte de la definición de la macro. Las instrucciones entre MACRO y ENDM comprenden el cuerpo de la definición de la macro.

Los nombres a los que se hace referencia en la definición de la macro, @DATA, AX,DS y ES, deben de estar definidos en alguna parte del programa o deben de ser dados a conocer de alguna otra forma al ensamblador. En forma subsecuente se puede utilizar la macroinstrucción INICIALIZA en el segmento de código en donde se quiera inicializar los registros. Cuando el ensamblador encuentra la macro instrucción, busca en una tabla de instrucciones simbólicas y, a falta de una entrada, busca macro instrucciones. Ya que el programa contiene una definición de la macro INICIALIZA, el ensamblador sustituye el cuerpo de la definición, generando las instrucciones: expansión de la macro. Un programa utilizaría la macroinstrucción INICIALIZA una sola vez, aunque otras macros están diseñadas para ser utilizadas cualquier número de veces y cada vez que el ensamblador genere la misma expansión de la macro.

Para hacer la macro más flexible, se pueden definir parámetros en ella como argumentos mudos. La definición de la macro siguiente llamada PROMPT, proporciona el uso de la función 09h del DOS para desplegar cualquier mensaje.

PROMPT MACRO MENSAJELEA AH, 09HLEA DX, MENSAJEINT 21HENDM

Cuando se usa la macroinstrucción, el programador debe proporcionar el nombre del mensaje, el cual hace referencia en el segmento de datos terminada por un signo de pesos ($). Un argumento mudo, en una definición de una macro, indica al ensamblador que haga coincidir su parámetro con cualquier aparición del mismo parámetro en el cuerpo de la macro. Por ejemplo, el argumento mudo MNESAJE también aparece en la instrucción LEA.

Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de la definición de la macro. Si utiliza la macro más de una vez en el mismo programa y el ensamblador define los elementos de datos para cada aparición, los nombres duplicados harían que el ensamblador generará un mensaje de error. Para asegurar que cada nombre generado sea único, codifique la directiva LOCAL inmediatamente después de la instrucción macro. La directiva EXITM nos permite abandonar una macro antes de haberse concluido la lectura de todas las sentencias.

Instituto Tecnológico de la Laguna Pag. 5

Page 6: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Comparativa entre macros y procedimientos

Ventajas de las MACROS.1. Son rápidas porque se ejecutan en línea en un programa.2. Las macros pueden pasar y recibir parámetros.3. La estructura de una MACRO es simple.4. Hacen más legible un programa.

Desventajas de las MACRO1. Hacen grande el código fuente.

Ventajas de los PROCEDIMIENTOS.1. Reducen el código2. Hacen más legible un programa.

Desventajas de los PROCEDIMIENTOS.1. Hacen más lenta la ejecución de un programa.2. Es un poco más compleja su declaración.3. Un procedimiento no puede recibir parámetros.

Sugerencias para el uso de macros y procedimientosSeleccione una MACRO para:

Rutinas cortas. Rutinas que no son llamadas frecuentemente. Si esta creando o experimentando con un programa.

Seleccione un PROCEDIMIENTO para: Si la rutina es larga.

Si la rutina es llamada muchas veces.

Directivas para programas que usan varios módulos.

Sobre todo cuando un programa es grande, es conveniente dividirlo en módulos y ensamblar solo aquellos en los que tenemos todavía problemas, los módulos que ya están trabajando, los dejamos como archivos objeto (.OBJ) y solo los enlazamos con aquellos que ya hemos corregido y ensamblado. Este proceso ahorra tiempo y posibles errores al modificar involuntariamente módulos que ya están trabajando.

Al ensamblar y enlazar varios módulos para formar un solo archivo .EXE debemos tomar en cuenta algunas consideraciones básicas. Los símbolos declarados dentro de un módulo son privados del módulo y no son conocidos en otra parte del programa a menos que así lo indiquemos usando la directiva PUBLIC.

La directiva PUBLICSe usa para declarar símbolos públicos de tal manera de permitir que ellos puedan ser accesados desde

otros módulos. Si un símbolo no es declarado como público el nombre del símbolo no se escribe al archivo objeto. El símbolo tiene el valor de su dirección de OFFSET durante el ensamblado, pero el nombre y dirección no están disponibles para el enlazador.

Si el símbolo se declara público, su nombre es asociado con su dirección de OFFSET en el archivo .OBJ. Durante el enlazado, los símbolos en diferentes módulos pero con el mismo nombre son referenciados a la misma dirección.

Sintaxis:PUBLIC nombre [, nombre]

Dondenombre: Es el nombre de una variable, etiqueta o constante numérica definida dentro del archivo presente.

Instituto Tecnológico de la Laguna Pag. 6

Page 7: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

La declaración PUBLIC puede ponerse en cualquier parte del archivo fuente. Los símbolos declarados PUBLIC dentro de un módulo van a ser usados en otro archivo en el cual no se han declarado (ni pueden ser declarados), sin embargo el ensamblador marca un error al no encontrar su declaración. Para indicarle al ensamblador que están declarados en otro módulo, usamos la directiva EXTRN.

Si el enlazador no encontró la declaración de los símbolos manejados como EXTRN, se enviará el siguiente mensaje:

UNRESOLVED EXTERNALS nombre del símbolo.

Por lo anterior se concluye que, si un símbolo referenciado como PUBLIC en el módulo donde es declarado, en el módulo donde es usado deberá ser referenciado como EXTRN.

La directiva EXTRN

Se emplea cuando un símbolo es usado en un módulo y no es declarado en él.Sintaxis:

EXTRN nombre:tipo [, nombre:tipo]...

El tipo deberá ser el mismo dado al símbolo en el módulo donde es declarado. El tipo puede ser uno de los siguientes:

Descripción Tipos

Especificador de distancia NEAR, FAR, ó PROCEspecificador de tamaño BYTE, WORD, DWORD, FWORD, QWORD ó TBYTEabsoluto ABS

El tipo ABS se usa para símbolos que representan números constantes declaradas con EQU.El tipo PROC representa el tipo por default para un procedimiento, el tipo por default es definido al declarar

el modelo de memoria utilizado.

* NEAREs una etiqueta (semejante como procedimiento) deberá declararse en el segmento de código desde el cual los símbolos son utilizados.

* FAR Es una etiqueta la cual puede ser declarada en cualquier parte del archivo fuente, es conveniente hacer la declaración en el segmento de código donde los símbolos son utilizados.

* Para declarar datos usando EXTRN, la declaración deberá hacerse en el segmento donde ellos son definidos. Si en el módulo no existe un segmento de datos, deberá declararse uno para usar EXTRN y referenciar una variable no declarada.

* Los símbolos absolutos pueden ser declarados en cualquier parte del archivo fuente.

A continuación un ejemploRetomando el programa ENSA34, se va a dividir en dos módulos, uno se va a llamar ENSA34B y el otro, el

cual contiene el procedimiento UNO, se llamará BINASIP. Para seguir usando el macro imp_cad, como éste es agregado al programa en tiempo de ensamble, se deberá usar la directiva INCLUDE.

La directiva INCLUDE inserta código fuente desde un archivo específico al archivo fuente en donde la directiva es dada.

Sintaxis:INCLUDE nom_arch

Donde:nom_arch: Especifica un archivo existente el cual contiene sentencias válidas. Si el archivo se encuentra en el

directorio actual se puede dar solo el nombre del archivo, si no, debe darse tanto la trayectoria como el nombre del archivo.

Instituto Tecnológico de la Laguna Pag. 7

Page 8: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Los archivos INCLUDE normalmente contienen; macros, constantes y definiciones, los PROCEDIMIENTOS se escriben en módulos .OBJ separados, o en bibliotecas.

Bibliotecas.

Una biblioteca o librería es un archivo, normalmente con la extensión (.LIB), la cual contiene dos o más módulos (.OBJ), estos módulos almacenan procedimientos, los cuales realizan procesos específicos, ejemplos de procedimientos almacenados en bibliotecas son los siguientes:

PASCAL+ write, writeln+ read, readln+ ord, abs, sqr, sqrt, clrscr, gotoxy

C+ printf, fprintf, cprintf+ scanf, fscanf+ pow, gets, clrscr, gotoxy

Los módulos almacenados en las bibliotecas, se encuentran en código máquina reubicable (OBJ), son unidos al archivo ejecutable en el momento del enlace, después de unir los módulos reubicables declarados en la línea de comandos.

En los lenguajes de alto nivel, se proveen mecanismos para que ciertas bibliotecas (normalmente las que contienen funciones o procedimientos de E/S y de uso común) sean llamadas de manera implícita al realizar el enlazado.

LIB.EXEEl manejador de bibliotecas (LIB.EXE) nos permite reunir en un solo archivo (.LIB) módulos reubicables

(.OBJ) ya compilados o ya ensamblados con anterioridad. La ventaja de una librería es que en el momento del enlace solo llama de la biblioteca, los procedimientos que estamos utilizando en nuestro programa.

El manejador de bibliotecas nos permite las siguientes acciones sobre una librería: Crear un nuevo archivo de biblioteca. Sumar módulos (.OBJ) a una biblioteca ya existente. Borrar módulos de una biblioteca. Remplazar módulos de una biblioteca. Sacar módulos de una biblioteca como archivos (.OBJ)

Sintaxis:LIB lib_vieja [opciones] [comandos] [,arch_list] [,[lib_nuev]] [;]

Donde:lib_vieja: Es una librería ya existente a la que se le desea hacer modificaciones. Si no existe se crea. Si no se proporciona extensión, por default toma (.LIB)

opciones: Son alternativas usadas en la modificación o creación de una librería. Estas son las siguientes:/?: Ayuda en línea./HELP Ayuda en pantalla./IGNORECASE No considera Mayúsculas/Minúsculas./NOEXTDICITONARY No construye directorio./NOIGNORECASE Es sensible al tamaño./NOLOGO Suprime indicativo de LIB.EXE/PAGESIZE:n Define el tamaño de página, por definición es de 16 bytes, con este tamaño

la librería más grande es de 16*65535 = 1048560 bytes.

comandos: Nos definen las acciones a realizar sobre la librería:+ Suma un módulo a la librería.- Borra un módulo de la librería.-+ Reemplaza un módulo de la librería.* Copia a un archivo .OBJ un módulo de la librería.

Instituto Tecnológico de la Laguna Pag. 8

Page 9: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

-* Copia a un archivo .OBJ un módulo y luego lo borra de la librería.

arch_list: Crea un archivo, el cual contiene los nombres y símbolos públicos almacenados en la librería.

Lib_nuev: Especifica un nuevo nombre para una librería, por omisión es el de lib_vieja. Cuando se especifica este campo, el comando LIB

LIB nunca destruye la librería original, si se especifica un nuevo nombre, la crea con dicho nombre y si no se especifica un nuevo nombre a la librería original, le cambia la extensión por BAK.

Usando el Macro Assembler de MicrosoftPara ensamblar cada módulo, desde la línea de comandos se usaron las siguientes instrucciones,

considerando el prompt como: C:\USER>

C:\USER>masm imp;C:\USER>masm binasib1;C:\USER>masm ensa34C;

A continuación como ya se tienen los archivos .OBJ se crea la librería MILIB.LIB, usando la siguiente instrucción:

C:\USER>lib milib +binasib1 +imp, milib.lst;

Nota: Se considera que ya hay un PATH definido, y para el archivo LIB.EXE se tiene considerado su localización en dicho PATH.

Instituto Tecnológico de la Laguna Pag. 9

Page 10: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

INTERFAZ PROGRAMABLE DE PERIFERICOS (PPI) 8255El PPI 8255 es un dispositivo de E/S general, programable, capaz de controlar 24 líneas con diferentes configuraciones (entrada/salida) y en hasta 3 modos de operación.

CONEXIONES DEL 8255- D0..D7: Bus de datos bidireccional de 3 estados.

- RESET: Esta señal borra el registro de control y todos los puertos (A, B y C) son colocados en modo entrada.

- RD: Utilizada por la CPU para leer información de estado o datos procedentes del 8255.

- WR: Utilizada por la CPU para enviar palabras de control o datos al 8255.

- A0..A1: Líneas de dirección: permiten seleccionar uno de los tres puertos o el registro de control.

- PA0..PA7: Puerto A: puerto de entrada/salida de 8 bits.

- PB0..PB7: Puerto B: puerto de entrada/salida de 8 bits.

- PC0..PC7: Puerto C: puerto de entrada/salida de 8 bits.

DESCRIPCION DE SU FUNCIONAMIENTO

Las dos líneas de direcciones definen cuatro puertos de E/S en el ordenador: los tres primeros permiten acceder a los puertos A, B y C; el cuarto sirve para leer o escribir la palabra de control. El 8255 está dividido en dos grupos internos: el grupo A, formado por el puerto A y los 4 bits más significativos del puerto C; y el grupo B, constituido por el puerto B junto a los 4 bits menos significativos del puerto C. El puerto C está especialmente diseñado para ser dividido en dos mitades y servir de apoyo a los puertos A y B en algunos sistemas.

El 8255 soporta 3 modos de operación: el modo 0 (entrada y salida básica), el modo 1 (entrada y salida con señales de control) y el modo 2 (bus bidireccional de comunicaciones).La configuración por defecto de los tres puertos están configurados de en modo de entrada, y las 24 lineas están configurados en “1”. Esta configuración puede ser alterada por el programador dependiendo los usos que le den.

El modo para el puerto A y B se puede seleccionar por separado; el puerto C está dividido en dos mitades relacionadas con el puerto A y el B. Todos los registros de salida son reseteados ante un cambio de modo, incluyendo los biestables de estado. Las configuraciones de modos son muy flexibles y se acomodan a casi todas las necesidades posibles.

Instituto Tecnológico de la Laguna Pag. 10

Page 11: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

MODOS DE OPERACIÓN DEL 8255

MODO 0Esta configuración implementa simples funciones de entrada/salida para cada bit de los 2 puertos de 8 bits y los 2 puertos de 4 bits; los datos son leídos y escritos sin más, sin ningún tipo de control adicional. Los puertos pueden ser configurados de entrada (sin latch) o salida (los datos permanecen memorizados en un latch).

MODO 1Este modo es el strobed input/output (entrada/salida a través de un protocolo de señales). Existen dos grupos (A y B) formados por los puertos A y B más el puerto C, que es repartido a la mitad entre ambos grupos para gestionar las señales de control. Tanto si se configura de entrada como de salida, los datos permanecen en un latch. Con este modo es factible conectar dos 8255 entre sí para realizar transferencias de datos en paralelo a una velocidad considerable, con posibilidad de generar interrupciones a la CPU en el momento en que los datos son recibidos o hay que enviar uno nuevo (consúltese documentación técnica).

MODO 2 En este modo se constituye un bus bidireccional de 8 bits, por el que los datos pueden ir en un sentido o en otro, siendo el flujo regulado de nuevo por señales de control a través del puerto C. Este modo sólo puede operar en el Grupo A. Tanto las entradas como salidas son almacenadas en latch.

NOTA: Existen varias combinaciones posibles de estos modos, en las que las líneas del puerto C que no son empleadas como señales de control pueden actuar como entradas o salidas normales, quedando las líneas de control fuera del área de influencia de los comandos que afectan a las restantes.DESCRIPCION DE LOS PUERTOS

Puerto A (60h)Tiene una doble función: cuando el bit 7 del puerto B está a 1, el puerto A recibe el código de rastreo de la tecla pulsada, que luego puede ser leído desde la interrupción del teclado. Si el bit 7 del puerto B está a 0, entonces el puerto A devuelve información sobre la configuración del sistema en los PC (no en los XT): en el bit 0 (a 1 si hay disqueteras), bits 2..3 (número de bloques de 16 kb de memoria ¡que obsoleto e inútil!), bits 4..5 (tipo de pantalla: 11 MDA, 10 Color 80x25, 01 Color 40x25) y bits 6..7 (número de unidades de disco, si el bit 0=1).

Puerto B (61h)Bit 0 (PC/XT: conectado a la línea GATE del contador 2 del 8253), bit 1 (PC/XT: conectado al altavoz), bit 2 (sólo PC: selecciona el contenido del puerto C), bit 3 (en XT: selecciona contenido del puerto C; en PC: a 0 para activar el motor del casete), bit 4 (PC/XT: a 0 para activar la RAM), bit 5 (PC/XT: a 0 para activar señales de error en el slot de expansión), bit 6 (PC/XT: a 1 activa la señal de reloj del teclado), bit 7 (en PC: empleado para seleccionar la función del puerto A; tanto en PC como en XT sirve además para enviar una señal de reconocimiento al teclado).

Puerto C (62h)Si el bit 2 del puerto B (PC) o el bit 3 del puerto B (XT) están a 1:

En los PC: los bits 0..3: mitad inferior del 2º banco de conmutadores de la placa base (RAM en slots de expansión); bit 4 (entrada de casete).

En los XT: bit 1 (activo si coprocesador instalado), bits 2..3 (bancos de RAM en placa base). En PC/XT: bit 5 (OUT del contador 2 del 8253), bit 6 (a 1 si comprobar errores en slots de expansión),

bit 7 (1 si comprobar error de paridad). Si el bit 2 del puerto B (PC) o el bit 3 del puerto B (XT) están a 1: En los PC: bits 0..3 parte alta del segundo banco de conmutadores de configuración (no usada). En los XT: bits 0..1 tipo de pantalla (11 MDA, 10 color 80x25, 01 color 40x25), bits 2..3 (nº de

disqueteras menos 1). En PC/XT: los bits 4..7 están igual que en el caso anterior (no dependen del bit 2 ó 3 del puerto B).

Instituto Tecnológico de la Laguna Pag. 11

Page 12: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

EL TEMPORIZADOR 8253 U 8254El 8253/4 es un chip temporizador que puede ser empleado como reloj de tiempo real, contador de sucesos, generador de ritmo programable, generador de onda cuadrada, etc. En este capítulo, la información vertida estará relacionada con el 8254 que equipa a los AT, algo más potente que el 8253 de los PC/XT; sin embargo, las pocas diferencias serán comentadas cuando llegue el caso.

Este circuito integrado posee 3 contadores totalmente independientes, que pueden ser programados de 6 formas diferentes.

- D7..D0: BUS de datos bidireccional de 3 estados.

- CLK 0: CLOCK 0, entrada de reloj al contador 0.

- OUT 0: Salida del contador 0.

- GATE 0: Puerta de entrada al contador 0.

- CLK 1: CLOCK 1, entrada de reloj al contador 1.

- OUT 1: Salida del contador 1.

- GATE 1: Puerta de entrada al contador 1.

- CLK 2: CLOCK 2, entrada de reloj al contador 2.

- OUT 2: Salida del contador 2.

- GATE 2: Puerta de entrada al contador 2.

- A0..A1: Líneas de dirección para seleccionar uno de los tres contadores o el registro de la palabra de control.

- CS: Habilita la comunicación con la CPU.

- WR: Permite al 8254 aceptar datos de la CPU.

- RD: Permite al 8254 enviar datos a la CPU.

El buffer del bus de datos, de 8 bits y tres estados, comunica el 8254 con la CPU. La lógica de lectura y escritura acepta entradas del bus y genera señales de control para las partes funcionales del 8254. Las líneas A0..A2 seleccionan uno de los tres contadores o el registro de la palabra de control, para poder leerlos o escribirlos. El registro de la palabra de control es seleccionado Cuando A0=A1=1, este registro sólo puede ser escrito (se puede obtener información de estado, como se verá más adelante, con el comando read-back del 8254, no disponible en el 8253).

Los contadores 1, 2 y 3 son idénticos en su funcionamiento, por lo que sólo se describirá uno; son totalmente independientes y cada uno de ellos puede ser programado en una modalidad diferente.

OPERACIONES DE ESCRITURA

El 8254 es muy flexible a la hora de ser programado. Basta con tener en cuenta dos cosas: por un lado, escribir siempre primero la palabra de control, antes de enviar la cuenta inicial al contador. Por otro, dicha cuenta inicial

Instituto Tecnológico de la Laguna Pag. 12

Page 13: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

debe seguir exactamente el formato seleccionado en la palabra de control (enviar sólo byte bajo, enviar sólo byte alto, o bien enviar ambos consecutivamente). Teniendo en cuenta que cada contador tiene su propio puerto y que la palabra de control indica el contador al que está asociada, no hay que seguir un orden especial a la hora de programar los contadores. Esto significa que, por ejemplo, se puede enviar la palabra de control de cada contador seguida de su cuenta inicial, o bien enviar todas las palabras de control para los 3 contadores y después las 3 cuentas iniciales; también es válida cualquier combinación intermedia de estas secuencias (por ejemplo: enviar la palabra de control para el contador 0, después la palabra de control para el contador 1, después la parte baja de la cuenta para el contador 0, luego la parte baja de la cuenta para el contador 1, la parte alta de la cuenta para el contador 0, etc...).

Un nuevo valor de cuenta inicial puede ser almacenado en un contador en cualquier momento, sin que ello afecte al modo en que ha sido programado (el resultado de esta operación dependerá del modo, como se verá más adelante). Si se programa el contador para leer/escribir la cuenta como dos bytes consecutivos (bajo y alto), el sentido común indica que entre ambos envíos/recepciones no conviene transferir el control a una subrutina que utilice ese mismo contador para evitar un resultado incorrecto.

OPERACIONES DE LECTURA

Existen tres posibles métodos para leer el valor de un contador en el 8254. El primero es el comando Read-Back, sólo disponible en el 8254 (y no en el 8253), como luego veremos. El segundo consiste en leer simplemente el contador accediendo a su puerto correspondiente: este método requiere inhibir la entrada CLK al contador (por ejemplo, a través de la línea GATE o utilizando circuitería exterior de apoyo) con objeto de evitar leer la cuenta en medio de un proceso de actualización de la misma, lo que daría un resultado incorrecto. El tercer método consiste en el comando de enclavamiento.

MODOS DE OPERACIÓN DEL 8253 Ò 8254

MODO 0: Interrupt On Terminal Count (Interrupción al final de la cuenta).Es empleado típicamente para contar sucesos. Tras escribir la palabra de control, OUT está inicialmente en estado bajo, y permanecerá así hasta que el contador alcance el cero: entonces se pone a 1 y no volverá a bajar hasta que se escriba una nueva cuenta o una nueva palabra de control. La entrada GATE puesta a 0 permite inhibir la cuenta, sin afectar a OUT. El contador sigue evolucionando tras llegar a cero (0FFFFh, 0FFFEh, ...) por lo que lecturas posteriores del mismo devuelven valores pseudoaleatorios.

Tras escribir la cuenta inicial y la palabra de control en el contador, la cuenta inicial será cargada en el próximo pulso del reloj conectado (CLK), pulso que no decrementa el contador: para una cuenta inicial N, OUT permanecerá a 0 durante N+1 pulsos del reloj tras escribir la cuenta inicial.Si se escribe una nueva cuenta en el contador, será cargada en el próximo pulso del reloj y el contador comenzará a decrementarse; si se envía una cuenta de dos bytes, el primer byte enviado inhibe la cuenta y OUT es puesto a cero inmediatamente (sin esperar a CLK): tras escribir el segundo byte, la cuenta será cargada en el siguiente pulso del reloj. Esto permite sincronizar la secuencia de conteo por software.

Si se escribe una nueva cuenta mientras GATE=0, ésta será cargada en cualquier caso en el siguiente pulso del reloj: cuando GATE suba, OUT se pondrá en alto tras N pulsos del reloj (y no N+1 en este caso).

MODO 1: Hardware Retriggerable One-Shot (Monoestable programable).OUT será inicialmente alta y bajará en el pulso de reloj que sigue al flanco de subida de GATE, permaneciendo en bajo hasta que el contador alcance el cero. Entonces, OUT sube y permanece activo hasta el pulso del reloj que siga al próximo flanco de subida de GATE.

Tras escribir la palabra de control y la cuenta inicial, el contador está preparado. Un flanco de subida de GATE provoca la carga del contador (CR -< CE) y que OUT baje en el próximo pulso del reloj, comenzando el pulso One-Shot de N ciclos de reloj de duración; el contador vuelve a ser recargado si se produce un nuevo flanco de subida de GATE, de ahí que OUT permanezca en bajo durante N pulsos de reloj tras la última vez que suceda esto. El pulso One-Shot puede repetirse sin necesidad de recargar el contador con el mismo valor. GATE no influye directamente en OUT.

Instituto Tecnológico de la Laguna Pag. 13

Page 14: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Si se escribe una nueva cuenta durante un pulso One-Shot, el One-Shot en curso no resulta afectado, a menos, lógicamente, que se produzca un nuevo flanco de subida de GATE: en ese caso, el contador sería recargado con el nuevo valor.

MODO 2: Rate Generator (Generador de ritmo).En este modo, el contador funciona como un divisor por N. Es empleado típicamente para las interrupciones de los relojes de tiempo real.

OUT estará inicialmente en alto. Cuando el contador se decremente hasta el valor 1, OUT pasará a estado bajo durante un pulso del reloj; tras ello, volverá a subir y el contador se recargará con la cuenta inicial, repitiéndose el proceso. Este modo es, por tanto, periódico, y la misma secuencia se repite indefinidamente. Para una cuenta inicial N, la secuencia se repite cada N ciclos de reloj (CLK).Si GATE=0 la cuenta descendiente se detiene: si GATE es bajado durante un pulso de salida, OUT sube inmediatamente. Un flanco de subida en GATE provoca una recarga del contador con el valor de cuenta inicial en el siguiente pulso del reloj (después, como cabría esperar, OUT bajará tras los N pulsos del reloj correspondientes): GATE puede ser utilizado para sincronizar el contador.Tras escribir la palabra de control y la cuenta inicial, el contador será cargado en el próximo pulso del reloj: OUT bajará N pulsos de reloj después, lo que permite también una sincronización por software.

Escribir un nuevo valor de cuenta durante el funcionamiento del contador no afecta a la actual secuencia de cuenta; si se recibe un flanco de subida de GATE antes del final del período el contador se recargará con ese nuevo valor de cuenta inicial tras el próximo pulso del reloj y volverá a comenzar, en caso contrario se recargará con el nuevo valor tras finalizar con normalidad el ciclo en curso.

MODO 3: Square Wave Mode (Generador de onda cuadrada).Este modo es empleado normalmente para la generación de una señal de onda cuadrada. Este modo es similar al 2, con la diferencia de que la salida OUT conmuta al transcurrir la mitad de la cuenta: inicialmente está en alto, pero al pasar la mitad de la cuenta pasa a estado bajo hasta que la cuenta finaliza. Este modo es también periódico: la onda resultante para una cuenta inicial N tiene un período de N ciclos.

Si GATE=0 la cuenta descendiente se detiene: si GATE es bajado durante un pulso de salida, OUT sube inmediatamente sin esperar ningún CLK. Un flanco de subida en GATE provoca una recarga del contador con el valor de cuenta inicial en el siguiente pulso del reloj: GATE puede ser utilizado para sincronizar el contador.

Tras escribir la palabra de control y la cuenta inicial, el contador será cargado en el próximo pulso del reloj: también puede ser sincronizado por software.

Escribir un nuevo valor de cuenta durante el funcionamiento del contador no afecta a la actual secuencia de cuenta; si se recibe un flanco de subida de GATE antes del final del medio-período el contador se recargará con ese nuevo valor de cuenta inicial tras el próximo pulso del reloj y volverá a comenzar, en caso contrario se recargará con el nuevo valor tras finalizar con normalidad el medio-ciclo en curso.

Para valores de cuenta impares, la duración a nivel alto de OUT será un período de reloj mayor que la duración a nivel bajo.

MODO 4: Software Triggered Mode (Pulso Strobe iniciado por software).OUT está en alto al principio; cuando la cuenta inicial expira, OUT baja durante un pulso de reloj y luego vuelve a subir. El proceso se inicia cuando se escribe la cuenta inicial.

GATE=0 inhibe el contador y GATE=1 lo habilita; GATE no influye en OUT. Tras escribir la palabra de control y la cuenta inicial, el contador será cargado en el próximo pulso del reloj: como ese pulso no decrementa el contador, para una cuanta inicial N, OUT no bajará hasta N+1 pulsos de CLK. Si se escribe una nueva cuenta durante el proceso, se cargará en el próximo pulso CLK y continuará el proceso de cuenta con la nueva cuenta escrita; si la cuenta es de 2 bytes, al escribir el primero no se altera el funcionamiento del contador hasta que se envíe el segundo.

Instituto Tecnológico de la Laguna Pag. 14

Page 15: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

MODO 5: Hardware Triggered Strobe (Pulso Strobe iniciado por hardware).OUT estará en alto al principio: con el flanco de subida de la señal GATE, el contador comienza a decrementar la cuenta. Cuando llega a cero, OUT baja durante un pulso CLK y luego vuelve a subir.Después de escribir la palabra de control y la cuenta inicial, el contador no será cargado hasta el pulso de reloj posterior al flanco de subida de GATE. Este pulso CLK no decrementa el contador: por ello, ante una cuenta inicial N, OUT no bajará hasta que pasen N+1 pulsos de reloj. GATE no afecta a OUT.

Si una nueva cuenta inicial es escrita durante el proceso, la actual secuencia del contador no será alterada; si se produce un flanco de subida en GATE antes de que la nueva cuenta sea escrita pero después de que expire la cuenta actual, el contador será cargado con la nueva cuenta en el próximo pulso del reloj.

EL 8254 EN LA PC

Todos los AT y PS/2 llevan instalado un 8254 o algo equivalente; los PC/XT van equipados con un 8253, algo menos versátil; los PS/2 más avanzados tienen un temporizador con un cuarto contador ligado a la interrupción no enmascarable, si bien no lo consideraremos aquí. Todos los contadores van conectados a un reloj que oscila a una frecuencia de 1.193.180 ciclos por segundo (casi 1,2 Mhz). La dirección base en el espacio de E/S del ordenador elegida por IBM cuando diseñó el PC es la 40h. Por tanto, los tres contadores son accedidos, respectivamente, a través de los puertos 40h, 41h y 42h; la palabra de control se envía al puerto 43h.

La señal GATE de los contadores 0 y 1 está siempre a 1; en el contador 2 es seleccionable el nivel de la línea GATE a través de bit 0 del puerto E/S 61h. La BIOS programa por defecto el contador 0 en el modo 3 (generador de onda cuadrada) y el contador 1 en el modo 2 (generador de ritmo); el usuario normalmente programa el contador 2 en el modo 2 ó 3.La salida del contador 0 está conectada a IRQ 0 (ligado a la INT 8, que a su vez invoca a INT 1Ch); este contador está programado por defecto con el valor cero (equivalente a 65536), por lo que la cadencia de los pulsos es de 1.193.180/65.536 = 18,2 veces por segundo, valor que determina la precisión del reloj del sistema, ciertamente demasiado baja. Se puede modificar el valor de recarga de este contador en un programa, llamando a la vieja INT 8 cada 1/18,2 segundos para no alterar el funcionamiento normal del ordenador, si bien no es conveniente instalar programas residentes que cambien permanentemente esta especificación: los programas del usuario esperan encontrarse el temporizador a la habitual y poco útil frecuencia de 18,2 interrupciones/segundo.

La salida del contador 1 controla el refresco de memoria en todas las máquinas, su valor normal para el divisor es 18; aumentándolo se puede acelerar el funcionamiento del ordenador, con el riesgo -eso sí- de un fallo en la memoria, detectado por los chips de paridad -si los hay-, que provoca generalmente el bloqueo del equipo. De todas maneras, en los PC/XT se puede aumentar entre 19 y 1000 sin demasiados riesgos, acelerándose en ocasiones hasta casi un 10% la velocidad de proceso del equipo. En los AT la ganancia de velocidad es mucho menor y además este es un punto demasiado sensible que conviene no tocar para no correr riesgos, aunque se podría bajar hasta un valor 2-17 para ralentizar el sistema. Sin embargo, no es conveniente alterar esta especificación porque, como se verá más adelante, hay un método para realizar retardos (empleado por la BIOS y algunas aplicaciones) que se vería afectado.

La salida del contador 2 puede estar conectado al altavoz del ordenador para producir sonido; alternativamente puede emplearse para temporizar. Es el único contador que queda realmente libre para el usuario, lo que suele dar quebraderos de cabeza a la hora de producir sonido.

TEMPORIZACIONLos contadores 0 y 1, especialmente este último, ya están ocupados por el sistema; en la práctica el único disponible es el 2. Este contador ha sido conectado con el doble propósito de temporizar y de generar sonido. Para emplearlo en las temporizaciones, es preciso habilitar la puerta GATE activando el bit 0 del puerto 61h; también hay que asegurarse de que la salida del contador no está conectada al altavoz (a menos que se desee música mientras se cronometra) poniendo a 0 el bit 1 del mismo puerto (61h):

IN AL,61h AND AL,11111101b ; borrar bit 1 (conexión contador 2 con el altavoz) OR AL,00000001b ; activar bit 0 (línea GATE del contador 2) JMP SHORT $+2 ; estado de espera para E/S

Instituto Tecnológico de la Laguna Pag. 15

Page 16: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

OUT 61h,AL

SÍNTESIS DE SONIDO.

La producción de sonido es uno de los puntos más débiles de las computadoras compatibles, que sólo superan por muy escaso margen a alguno de los micros legendarios de los 80, si bien las tarjetas de sonido han solventado el problema. Pero aquí nos conformaremos con describir la programación del altavoz. En todos los PCs existen dos métodos diferentes para generar sonido, con la utilización del 8254 o sin él, que veremos por separado.

CONTROL DIRECTO DEL ALTAVOZ

El altavoz del ordenador está ligado en todas las máquinas al bit 1 del puerto E/S 61h. Si se hace cambiar este bit (manteniéndolo durante cierto tiempo alto y durante cierto tiempo bajo, repitiendo el proceso a gran velocidad) se puede generar una onda cuadrada de sonido. Cuanto más deprisa se realice el proceso, mayor será la frecuencia del sonido. Por fortuna, la baja calidad del altavoz del PC redondea la onda cuadrada y produce un sonido algo más musical de forma involuntaria. No existe, en cualquier caso, control sobre el volumen, que dada la calidad del altavoz también está en función de la frecuencia. Este método de producción de sonido tiene varios inconvenientes. Por un lado, la frecuencia con que se hace vibrar al bit que lo produce, si no se tiene mucho cuidado, está a menudo más o menos ligada a la capacidad de proceso de la computadora: esto significa que el sonido es más grave en máquinas lentas y más agudo en las rápidas. Esto es particularmente grave y evidente cuando las temporizaciones se hacen con ciclos de retardo con registros de la CPU: la frecuencia del sonido está totalmente ligado a de la velocidad de la máquina en que se produce. Es por ello que el pitido de error que produce el teclado es a menudo distinto entre computadoras, aunque tengan el mismo teclado instalado.Antes de comenzar a producir el sonido con este método hay que bajar la línea GATE del 8254, ya que cuando está en alto y se activa también el bit 1 del puerto E/S 61h, el temporizador es el encargado de producir el sonido (este es el segundo método, como veremos). Por tanto, es preciso poner primero a cero el bit 0 del mismo puerto (61h):

CLI ; evitar posible INT 8, entre otras IN AL,61h AND AL,11111110b JMP SHORT $+2 ; estado de espera para E/S OUT 61h,AL ; bajar GATE del contador 2 del 8254 MOV CX,100h ; 256 vueltas otro_ciclo: PUSH CX IN AL,61h XOR AL,2 ; invertir bit 1 JMP SHORT $+2 OUT 61h,AL MOV CX,300 ; constante de retardo retardo: LOOP retardo POP CX LOOP otro_ciclo STI

CONTROL DEL ALTAVOZ MEDIANTE EL TEMPORIZADOR

El otro método posible consiste en emplear el contador 2 del temporizador conectado al altavoz; así, enviando el período del sonido (1.193.180/frecuencia en Hz) a dicho contador (programado en modo 3), éste se encarga de generar el sonido. Esto permite obtener sonidos idénticos en todos los ordenadores. Existe el pequeño problema de que la duración del sonido ha de ser múltiplo de 1/18,2 segundos si se desea utilizar el reloj del sistema para determinarla (un bucle de retardo sería, una vez más, dependiente de la máquina) ya que el contador 2 está ahora ocupado en la producción de sonido y no se puede usar para temporizar (al menos, no sin hacer malabarismos).

Instituto Tecnológico de la Laguna Pag. 16

Page 17: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Alternativamente, se podría evaluar la velocidad de la CPU para ajustar las constantes de retardo o aumentar la velocidad de la interrupción periódica.

Para emplear este sistema, primero se prepara el contador 2 para temporizar (poniendo a 1 el bit 0 del puerto 61h) y luego se conecta su salida al altavoz (poniendo a 1 el bit 1 del puerto 61h). Al final, conviene borrar ambos bits de nuevo. Ahora no es preciso inhibir las interrupciones para garantizar la calidad del sonido:

Este diseño esta aplicado en el ;----------------- Macro IniciarBocina---------------iniBoc macro

IN AL, 61H <--OR AL, 00000011B <---OUT 61H, AL <--

Endm

;----------------- Macro FinalizarBocina---------------finBoc macro

IN AL, 61H <-- AND AL, 11111100B <--- OUT 61H, AL <--endm

Las frecuencias en Hz de las distintas notas musicales están oficialmente definidas y los músicos suelen tenerlas en cuenta a la hora de afinar los instrumentos. La escala cromática temperada, adoptada por la American Standards Asociation en 1936

Instituto Tecnológico de la Laguna Pag. 17

Page 18: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

Desarrollo.En este programa se hace uso del altavoz de la computadora, la cual emite un sonido con cierta frecuencia si la clave de acceso que se le está solicitando es incorrecta, y si el código ingresado es correcto imprime en pantalla un mensaje sobre el programa y el nombre de los integrantes del equipo.Este programa fue realizado utilizando algunos procedimientos y algunas macros.

Código.

include bocina.macinclude macros.mac ;Segmento de PILApila segment para stack 'stack'

db 64 dup (?)pila ends

;Segmento de DATOSdatos segment para public 'data' linea db 10,13,36 nhex dw 0 msge db "Teclea tu NIP:$" ;Dígitos del 0 al 9 mal db "***Acceso Denegado***$" cont dw 3 archivo db "Exposicion hecha por Equipo 1 de ensamblador ", 10, 10, 13, " Antonio Vela", 10,13, " Jose Juan Zamora" ,10, 13, " Pedro Martínez $"datos ends

;Segmento de CODIGOcode segment para 'code'

assume cs:code, ss:pila, ds:datos

inicio:mov ax, datosmov ds, axmov nhex,0000 ;inicializamos la variable nhex en 0clearcolorcall pedir ;Muestra el mensaje que pide al usuario el NIPcall acomodo ;Accede al primer digito tecleado y lo acomodafinBoc ;Finaliza la bocina si es que está habilitada tras un nuevo intento.call acomodo call acomodomov ah,1int 21h ;Al ASCCI a(41h) conversión a hexasub al,30hor byte ptr nhex, alimprimir lineaimprimir lineacmp nhex, 2010hjne malaclearcolorimprimir archivofinBoc ;Apagamos la bocina mediante la macro

imprimir linea

Instituto Tecnológico de la Laguna Pag. 18

Page 19: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

jmp finmala:

mov dx, 297 ;le mandamos una frecuencia 297frecuencia dxiniBocimprimir mal ;imprimimos la cadena de acceso denegadoimprimir linea ;pasamos 4 reglones.imprimir lineaimprimir lineaimprimir lineamov ax, cont ;Asignamos el índice del contador a intentos.

dec ax mov cont, ax cmp cont, 0 ;Si numero intentos=0 salimos de la aplicación. je fin color jmp inicioFin: ;finalizamos la aplicación después de 3 intentos fallidos. finBoc MOV AX, 4C00H INT 21H

;PROCEDIMIENTOSpedir proc near

;Visualizar msgemov ah,9lea dx, msgeInt 21h ;Leer el primer digitoret

pedir endp

acomodo proc nearmov ah,1 ;La opción 1 de la Int 21 pedirá un carácter. Int 21h ;y lo guardara en alsub al,30h ;restamos 30h para nivelar a nivel hexa de la maquina.or byte ptr nhex, al ;se hace un or afectando nhexmov cl,4 ;se prepara cl para hacer una rotación de 4bits para acomodar los dígitos pulsados.rol nhex, clret

acomodo endp

code ends end inicio

Instituto Tecnológico de la Laguna Pag. 19

Page 20: uso de procedimientos y macros (lenguaje ensamblador)

Lenguaje Ensamblador Uso de Procedimientos, Macros y Librerías

MACROS.

bocina.mac;----------------- Macro Fecuencia---------------frecuencia MACRO BASE ; Esta macro es para sacar la base de MOV AX, BASE ; a sonar la bocina, la dirección del puerto OUT 42H, AL ; 42h es donde esta conectada físicamente XCHG AL, AH ; la bocina. OUT 42H, ALENDM

;----------------- Macro IniciarBocina---------------iniBoc macro

IN AL, 61HOR AL, 00000011BOUT 61H, AL

endm

;----------------- Macro FinalizarBocina-------------finBoc macro

IN AL, 61H AND AL, 11111100B OUT 61H, ALendm

macros.mac;-----------------Macro imprimir----------------imprimir macro cad

lea dx,cadmov ah,9int 21h

endm;----------------- Macro limpiar---------------clear macro

mov ah,00h ;limpia la pantallamov al,03hint 10h

endm;----------------- Macro colores---------------color macro

mov ah, 07hmov al, 00hmov bh, 06hmov cx, 00hmov dx, 4F50hint 10h

endm

Instituto Tecnológico de la Laguna Pag. 20