Ingeniería en Sistemas Computacionales

LENGUAJE ENSAMBLADOR

³Uso de Procedimientos, Macros o Librerías y uso del altavoz de la computadora´

Lenguaje Ensamblador

Uso de Procedimientos, Macros y Librerías

Índice Contenido págs.

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

Instituto Tecnológico de la Laguna

Pag. 2

Aparentemente CALL es similar a la instrucción JMP. por la que unos valores facilitados tras un identificador aparecen como argumentos del procedimiento invocado. No hay que olvidar que estamos trabajando a un nivel muy bajo. Sí tenemos a nuestra disposición. según los casos. Estas pueden efectuar. d) Control de otros módulos.Lenguaje Ensamblador Introducción. Este proceso de descomposición continúa hasta que cada módulo tenga una tarea específica que ejecutar. regresa el control al módulo desde donde fue llamado. la necesidad de la estructuración es. si cabe. cualquier tarea. Una vez que se ha guardado el valor de IP o de CS e IP. dependiendo del lenguaje. los valores de CS e IP. 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. éste deberá descomponerse en otros módulos más pequeños. Lo importante es que el puntero de la Instituto Tecnológico de la Laguna Pag. Si hemos introducido valores. permite codificar bloques de sentencias a los que se asigna un nombre. Al trabajar con lenguaje ensamblador. aún es más vital. La diferencia es que. éste ejecuta su función y una vez que la termina. puede requerir una gran lista de sentencias ejecutables. se ejecutan las instrucciones que haya en la dirección indicada. A estos bloques de sentencias. funciones o métodos. se les conoce como procedimientos. La transferencia mágica de parámetros. si se transfiere el control a un submódulo. 3 . al menos la mayoría de ellos. por sencilla que parezca. El primer tipo de salto se denomina NEAR o cercano. Esta toma como parámetro un valor inmediato. Los lenguajes de alto nivel. 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. de tal forma que para ejecutar dichas sentencias. CALL guarda en la pila el valor actual del registro IP. Macros y Librerías MODULARIZACION Y PROGRAMACIÓN HIBRIDA Introducción. Procedimientos. desde cualquier punto de la aplicación basta con introducir ese identificador y. de tal forma que ésta puede recuperarse posteriormente para volver y continuar la ejecución por el punto en el que se interrumpió. Si la tarea asignada a cada submódulo es demasiado compleja. mientras que el segundo se le conoce como salto FAR o lejano. una instrucción capaz de saltar a una dirección dada guardando el actual valor del registro IP. e) Alguna combinación de los anteriores. siempre que tengamos en cuenta que al llegar al final. Todo programa contiene un módulo denominado programa principal que controla todo lo que sucede. c) Manipulación de datos. 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. En el primero se necesitan 16 bits. En el Lenguaje ENSAMBLADOR esta técnica se puede llevar a cabo mediante Macros y Procedimientos. Uso de Procedimientos. puesto que cualquier tarea. En ensamblador se opera con direcciones. Cada uno de estos módulos se analiza. Usando la programación modular el problema se divide en módulos. Esta tarea puede ser: a) Entrada. a pesar de que éstas pueden estar representadas mediante etiquetas que hacen más fácil nuestro trabajo. o bien. es algo que no existe. éstos deben extraerse. se codifica y se prueba de preferencia por separado. ya que transfiere la ejecución a una dirección de forma incondicional. b) Salida. La instrucción que nos permite invocar a un procedimiento es CALL. En muchos casos es el módulo principal. como es lógico. en caso necesario. no obstante. facilita los parámetros adecuados. en caso de que el salto sea una dirección dentro del mismo segmento que indica CS. antes de que se produzca ese salto. donde cada una de los cuales ejecuta una única actividad o tarea y se codifican independientemente de otros módulos. la pila debe encontrarse en la misma situación en la que se encontraba al principio. si el salto es a una dirección de otro segmento. justo antes de devolver el control. más que cualquier otro lenguaje al que esté acostumbrado. la dirección a la que debe transferir el control.

se encargan de generar las instrucciones ensamblador adecuadas. junto con el conjunto de instrucciones en ensamblador que la macro va a generar. de tal forma de liberar esos argumentos después de salir del procedimiento. ¿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. 4 Es el nombre del procedimiento. el compilador genera muchas instrucciones de lenguaje máquina. <para una llamada NEAR. Para cada instrucción simbólica que el programador codifica. constante puede contener ese número. El ensamblador tiene facilidades que el programador puede usar para definir macros. Si la instrucción CALL guarda el actual puntero de instrucción y transfiere la ejecución al 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. Una definición de macro aparece antes de cualquier definición de segmento. entenderá lo importante que es que SS:SP conserven los valores que tenían al iniciar la ejecución del procedimiento. la distancia pude ser NEAR ó FAR. cualquier RET dentro del PROCEDIMIENTO automáticamente toma la misma distancia. La instrucción RET. . la instrucción RET podría transferir la ejecución a un punto incorrecto y causar la caída del sistema. la instrucción RET tiene el efecto inverso. Para macros que se necesiten incluir en un programa. en un lenguaje de alto nivel consistente de macro enunciados. Se transforma en la dirección del procedimiento. Sintaxis: CALL etiqueta etiqueta: Macros. -Reducir errores causados por la codificación repetitiva. en el momento de volver. con la diferencia de que la dirección a la que saltará debe estar almacenada en la pila. A este respecto. sólo codifique el nombre de la macro y el ensamblador genera de manera automática las instrucciones que el programador definió. MASM y TASM cuentan con un preprocesador que. La etiqueta se usa para llamar al PROCEDIMIENTO con una instrucción CALL. de no ser así. Pero para cada enunciado codificado en un lenguaje de alto nivel. por tanto. se puede pensar. a partir de ciertas palabras claves como PROC FAR o PROC NEAR. recuperándose la dirección de la pila.Lenguaje Ensamblador Uso de Procedimientos. el nuevo offset es cargado en IP. -Linealizar un programa en ensamblador. SP es decrementado en dos y el offset es cargado en el STACK . generalmente por una llamada previa a CALL. 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. Después. si se conoce el número de WORDS pasadas al STACK como argumentos. primero tiene que definirlas. esté apuntando a los valores que introdujo en ella la instrucción CALL. La sintaxis de la macro es la siguiente: Instituto Tecnológico de la Laguna Pag. siempre que necesite codificar el conjunto de instrucciones. Sintaxis: etiqueta etiqueta Donde: etiqueta: constante: PROC [NEAR | FAR] secuencia de sentencias RET constante ENDP Es un símbolo asignado como nombre al procedimiento. en ensamblador. Las macros son útiles para los siguientes propósitos: -Simplificar y reducir la cantidad de codificación repetitiva. para hacerlo más legible. también es un salto incondicional. entonces. como C o Pascal. genera una instrucción en lenguaje máquina. STACK se usa para pasar argumentos a un procedimiento. similar a JMP. porque. la etiqueta contiene la dirección de inicio de la primera instrucción del procedimiento. Macros y Librerías pila. Es necesario definir un nombre específico para la macro. Teniendo en cuenta esto.

. Son símbolos que actúan como receptores de valores pasados como argumento a la MACRO cuando ésta es llamada. el argumento mudo MNESAJE también aparece en la instrucción LEA. AX MOV ES. Las instrucciones entre MACRO y ENDM comprenden el cuerpo de la definición de la macro. La definición de la macro siguiente llamada PROMPT. Macros y Librerías Deberá ser único.DS y ES. Cuando el ensamblador encuentra la macro instrucción. @DATA.Lenguaje Ensamblador nombre MACRO [parámetro [. El número máximo de parámetros deberán caber en una línea. Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de la definición de la macro. Un argumento mudo. AX. con él podemos invocar al macro. en una definición de una macro. el programador debe proporcionar el nombre del mensaje. busca en una tabla de instrucciones simbólicas y. PROMPT MACRO MENSAJE LEA AH. y reunir los requisitos de un símbolo.parámetro]. los nombres duplicados harían que el ensamblador generará un mensaje de error.] secuencia de sentencias. 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. Por ejemplo.. el cual hace referencia en el segmento de datos terminada por un signo de pesos ($). generando las instrucciones: expansión de la macro. 5 . Para asegurar que cada nombre generado sea único. 09H LEA DX. AX ENDM El nombre de esta macro es INICIALIZA. En forma subsecuente se puede utilizar la macroinstrucción INICIALIZA en el segmento de código en donde se quiera inicializar los registros. Examinaremos una definición de macro sencilla que inicializa los registros de segmento para un programa . 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. aunque es aceptable cualquier otro nombre válido que sea único. se pueden definir parámetros en ella como argumentos mudos. codifique la directiva LOCAL inmediatamente después de la instrucción macro.EXE INIZIALIZA MACRO MOV AX. deben de estar definidos en alguna parte del programa o deben de ser dados a conocer de alguna otra forma al ensamblador. MENSAJE INT 21H ENDM Cuando se usa la macroinstrucción. Para hacer la macro más flexible. La directiva EXITM nos permite abandonar una macro antes de haberse concluido la lectura de todas las sentencias. proporciona el uso de la función 09h del DOS para desplegar cualquier mensaje. busca macro instrucciones. La directiva MACRO en la primer línea le indica al ensamblador que las instrucciones que siguen hasta ENDM (³fin de la macro´). el ensamblador sustituye el cuerpo de la definición. indica al ensamblador que haga coincidir su parámetro con cualquier aparición del mismo parámetro en el cuerpo de la macro. Un programa utilizaría la macroinstrucción INICIALIZA una sola vez. a falta de una entrada.. Instituto Tecnológico de la Laguna Pag. Ya que el programa contiene una definición de la macro INICIALIZA. @DATA MOV DS. son parte de la definición de la macro. Los nombres a los que se hace referencia en la definición de la macro. ENDM Donde: nombre: parámetros: Uso de Procedimientos.

nombre] Donde nombre: Es el nombre de una variable. Seleccione un PROCEDIMIENTO para: y Si la rutina es larga. Ventajas de los PROCEDIMIENTOS. Es un poco más compleja su declaración. 1. Desventajas de las MACRO 1. su nombre es asociado con su dirección de OFFSET en el archivo . los dejamos como archivos objeto (.OBJ. Un procedimiento no puede recibir parámetros. los símbolos en diferentes módulos pero con el mismo nombre son referenciados a la misma dirección. Uso de Procedimientos. 3. Sobre todo cuando un programa es grande. 6 . Son rápidas porque se ejecutan en línea en un programa. 2. 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. Durante el enlazado. y Si esta creando o experimentando con un programa. Si un símbolo no es declarado como público el nombre del símbolo no se escribe al archivo objeto. Hacen más lenta la ejecución de un programa. 2. La estructura de una MACRO es simple. 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. Hacen grande el código fuente. es conveniente dividirlo en módulos y ensamblar solo aquellos en los que tenemos todavía problemas. y Rutinas que no son llamadas frecuentemente. Hacen más legible un programa. Si el símbolo se declara público.Lenguaje Ensamblador Comparativa entre macros y procedimientos Ventajas de las MACROS. Sintaxis: PUBLIC nombre [. La directiva PUBLIC Se usa para declarar símbolos públicos de tal manera de permitir que ellos puedan ser accesados desde otros módulos. Hacen más legible un programa. Si la rutina es llamada muchas veces. Reducen el código 2. Este proceso ahorra tiempo y posibles errores al modificar involuntariamente módulos que ya están trabajando.EXE debemos tomar en cuenta algunas consideraciones básicas. 3. Al ensamblar y enlazar varios módulos para formar un solo archivo . 1. Las macros pueden pasar y recibir parámetros.OBJ) y solo los enlazamos con aquellos que ya hemos corregido y ensamblado. 1. Sugerencias para el uso de macros y procedimientos Seleccione una MACRO para: y Rutinas cortas. los módulos que ya están trabajando. 4. Desventajas de los PROCEDIMIENTOS. etiqueta o constante numérica definida dentro del archivo presente. Instituto Tecnológico de la Laguna Pag. Macros y Librerías Directivas para programas que usan varios módulos.

se deberá usar la directiva INCLUDE. usamos la directiva EXTRN. La directiva EXTRN Se emplea cuando un símbolo es usado en un módulo y no es declarado en él. FAR. la declaración deberá hacerse en el segmento donde ellos son definidos. deberá declararse uno para usar EXTRN y referenciar una variable no declarada. Por lo anterior se concluye que. se llamará BINASIP. es conveniente hacer la declaración en el segmento de código donde los símbolos son utilizados. ó PROC BYTE. Para seguir usando el macro imp_cad. en el módulo donde es usado deberá ser referenciado como EXTRN.. DWORD. El tipo PROC representa el tipo por default para un procedimiento. como éste es agregado al programa en tiempo de ensamble. nombre:tipo]. Macros y Librerías La declaración PUBLIC puede ponerse en cualquier parte del archivo fuente. WORD. Sintaxis: INCLUDE nom_arch Donde: nom_arch: Especifica un archivo existente el cual contiene sentencias válidas. si no. A continuación un ejemplo Retomando el programa ENSA34. Si en el módulo no existe un segmento de datos. Instituto Tecnológico de la Laguna Pag. uno se va a llamar ENSA34B y el otro. Para indicarle al ensamblador que están declarados en otro módulo. se enviará el siguiente mensaje: UNRESOLVED EXTERNALS nombre del símbolo. El tipo puede ser uno de los siguientes: Descripción Especificador de distancia Especificador de tamaño absoluto Tipos NEAR. * NEAR Es una etiqueta (semejante como procedimiento) deberá declararse en el segmento de código desde el cual los símbolos son utilizados. debe darse tanto la trayectoria como el nombre del archivo. * FAR Es una etiqueta la cual puede ser declarada en cualquier parte del archivo fuente. Sintaxis: EXTRN nombre:tipo [. Si el archivo se encuentra en el directorio actual se puede dar solo el nombre del archivo. El tipo deberá ser el mismo dado al símbolo en el módulo donde es declarado. si un símbolo referenciado como PUBLIC en el módulo donde es declarado. Si el enlazador no encontró la declaración de los símbolos manejados como EXTRN. * * Para declarar datos usando EXTRN. 7 . 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). el cual contiene el procedimiento UNO. La directiva INCLUDE inserta código fuente desde un archivo específico al archivo fuente en donde la directiva es dada. QWORD ó TBYTE ABS El tipo ABS se usa para símbolos que representan números constantes declaradas con EQU. Los símbolos absolutos pueden ser declarados en cualquier parte del archivo fuente.. FWORD. sin embargo el ensamblador marca un error al no encontrar su declaración. se va a dividir en dos módulos.Lenguaje Ensamblador Uso de Procedimientos. el tipo por default es definido al declarar el modelo de memoria utilizado.

cprintf + scanf. por default toma (. Borrar módulos de una biblioteca. comandos: Nos definen las acciones a realizar sobre la librería: + Suma un módulo a la librería. writeln + read. Remplazar módulos de una biblioteca. Estas son las siguientes: /?: Ayuda en línea. sqrt.Lenguaje Ensamblador Uso de Procedimientos. estos módulos almacenan procedimientos.[lib_nuev]] [. 8 . Sumar módulos (.LIB) módulos reubicables (. 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. fprintf. LIB.OBJ) a una biblioteca ya existente. Si no existe se crea. Macros y Librerías Los archivos INCLUDE normalmente contienen. Una biblioteca o librería es un archivo. -+ Reemplaza un módulo de la librería. Si no se proporciona extensión. después de unir los módulos reubicables declarados en la línea de comandos. /NOLOGO Suprime indicativo de LIB.LIB) opciones: Son alternativas usadas en la modificación o creación de una librería. macros. /NOIGNORECASE Es sensible al tamaño. constantes y definiciones. readln + ord. Sacar módulos de una biblioteca como archivos (. clrscr. Instituto Tecnológico de la Laguna Pag.EXE El manejador de bibliotecas (LIB.OBJ). con este tamaño la librería más grande es de 16*65535 = 1048560 bytes. Borra un módulo de la librería.EXE /PAGESIZE:n Define el tamaño de página.arch_list] [. El manejador de bibliotecas nos permite las siguientes acciones sobre una librería: Crear un nuevo archivo de biblioteca. o en bibliotecas.OBJ) y y y y y Sintaxis: LIB lib_vieja [opciones] [comandos] [. son unidos al archivo ejecutable en el momento del enlace. Bibliotecas. gotoxy Los módulos almacenados en las bibliotecas.OBJ separados. clrscr. los cuales realizan procesos específicos. normalmente con la extensión (.EXE) nos permite reunir en un solo archivo (. los PROCEDIMIENTOS se escriben en módulos . gets. La ventaja de una librería es que en el momento del enlace solo llama de la biblioteca. fscanf + pow.] Donde: lib_vieja: Es una librería ya existente a la que se le desea hacer modificaciones. En los lenguajes de alto nivel. por definición es de 16 bytes. ejemplos de procedimientos almacenados en bibliotecas son los siguientes: y PASCAL + write.OBJ) ya compilados o ya ensamblados con anterioridad. gotoxy y C + printf. /HELP Ayuda en pantalla. la cual contiene dos o más módulos (. los procedimientos que estamos utilizando en nuestro programa. /NOEXTDICITONARY No construye directorio. abs. se encuentran en código máquina reubicable (OBJ). sqr.LIB). /IGNORECASE No considera Mayúsculas/Minúsculas.

Copia a un archivo . Lib_nuev: Especifica un nuevo nombre para una librería. 9 .OBJ se crea la librería MILIB. le cambia la extensión por BAK. el comando LIB Cuando se LIB nunca destruye la librería original.LIB. Macros y Librerías Copia a un archivo . especifica este campo. Usando el Macro Assembler de Microsoft Para ensamblar cada módulo.Lenguaje Ensamblador * -* Uso de Procedimientos. C:\USER>masm ensa34C.OBJ un módulo y luego lo borra de la librería. arch_list: Crea un archivo. C:\USER>masm binasib1. A continuación como ya se tienen los archivos . por omisión es el de lib_vieja. Nota: Se considera que ya hay un PATH definido. desde la línea de comandos se usaron las siguientes instrucciones.EXE se tiene considerado su localización en dicho PATH.OBJ un módulo de la librería.lst. la crea con dicho nombre y si no se especifica un nuevo nombre a la librería original. milib. considerando el prompt como: C:\USER> C:\USER>masm imp. y para el archivo LIB. el cual contiene los nombres y símbolos públicos almacenados en la librería. usando la siguiente instrucción: C:\USER>lib milib +binasib1 +imp. si se especifica un nuevo nombre. Instituto Tecnológico de la Laguna Pag.

A0.WR: Utilizada por la CPU para enviar palabras de control o datos al 8255. Macros y Librerías INTERFAZ PROGRAMABLE DE PERIFERICOS (PPI) 8255 El PPI 8255 es un dispositivo de E/S general. . .Lenguaje Ensamblador Uso de Procedimientos.PC7: Puerto C: puerto de entrada/salida de 8 bits. formado por el puerto A y los 4 bits más significativos del puerto C.. . . Esta configuración puede ser alterada por el programador dependiendo los usos que le den. y el grupo B.RESET: Esta señal borra el registro de control y todos los puertos (A.PB0. Las configuraciones de modos son muy flexibles y se acomodan a casi todas las necesidades posibles.. y las 24 lineas están configurados en ³1´. programable.PA7: Puerto A: puerto de entrada/salida de 8 bits. Todos los registros de salida son reseteados ante un cambio de modo. 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. . La configuración por defecto de los tres puertos están configurados de en modo de entrada..A1: Líneas de dirección: permiten seleccionar uno de los tres puertos o el registro de control.PB7: Puerto B: puerto de entrada/salida de 8 bits. B y C.PA0. El 8255 está dividido en dos grupos internos: el grupo A..RD: Utilizada por la CPU para leer información de estado o datos procedentes del 8255. el modo 1 (entrada y salida con señales de control) y el modo 2 (bus bidireccional de comunicaciones). capaz de controlar 24 líneas con diferentes configuraciones (entrada/salida) y en hasta 3 modos de operación. el puerto C está dividido en dos mitades relacionadas con el puerto A y el B. el cuarto sirve para leer o escribir la palabra de control.D7: Bus de datos bidireccional de 3 estados. . incluyendo los biestables de estado.. B y C) son colocados en modo entrada. Instituto Tecnológico de la Laguna Pag. CONEXIONES DEL 8255 . El 8255 soporta 3 modos de operación: el modo 0 (entrada y salida básica).PC0. .D0. 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. El modo para el puerto A y B se puede seleccionar por separado. constituido por el puerto B junto a los 4 bits menos significativos del puerto C. 10 .

bit 5 (PC/XT: a 0 para activar señales de error en el slot de expansión). bit 7 (1 si comprobar error de paridad).. tanto en PC como en XT sirve además para enviar una señal de reconocimiento al teclado). Con este modo es factible conectar dos 8255 entre sí para realizar transferencias de datos en paralelo a una velocidad considerable. por el que los datos pueden ir en un sentido o en otro. quedando las líneas de control fuera del área de influencia de los comandos que afectan a las restantes. 10 Color 80x25. 01 Color 40x25) y bits 6. bit 2 (sólo PC: selecciona el contenido del puerto C). y En PC/XT: los bits 4. bit 4 (entrada de casete). 11 . bits 2. siendo el flujo regulado de nuevo por señales de control a través del puerto C. y En los XT: bits 0. 10 color 80x25. bit 1 (PC/XT: conectado al altavoz). Tanto las entradas como salidas son almacenadas en latch. Puerto C (62h) Si el bit 2 del puerto B (PC) o el bit 3 del puerto B (XT) están a 1: y En los PC: los bits 0. 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)..3 (bancos de RAM en placa base). Este modo sólo puede operar en el Grupo A.. NOTA: Existen varias combinaciones posibles de estos modos. bit 6 (a 1 si comprobar errores en slots de expansión). Los puertos pueden ser configurados de entrada (sin latch) o salida (los datos permanecen memorizados en un latch).. DESCRIPCION DE LOS PUERTOS Puerto A (60h) Tiene una doble función: cuando el bit 7 del puerto B está a 1. Si el bit 7 del puerto B está a 0. sin ningún tipo de control adicional. 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). y Si el bit 2 del puerto B (PC) o el bit 3 del puerto B (XT) están a 1: y En los PC: bits 0. MODO 2 En este modo se constituye un bus bidireccional de 8 bits. y En PC/XT: bit 5 (OUT del contador 2 del 8253)... en PC: a 0 para activar el motor del casete).3 (nº de disqueteras menos 1). los datos permanecen en un latch. Macros y Librerías MODO 0 Esta 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.3 (número de bloques de 16 kb de memoria ¡que obsoleto e inútil!). los datos son leídos y escritos sin más. bit 4 (PC/XT: a 0 para activar la RAM). Existen dos grupos (A y B) formados por los puertos A y B más el puerto C. Tanto si se configura de entrada como de salida..Lenguaje Ensamblador MODOS DE OPERACIÓN DEL 8255 Uso de Procedimientos. Puerto B (61h) Bit 0 (PC/XT: conectado a la línea GATE del contador 2 del 8253). MODO 1 Este modo es el strobed input/output (entrada/salida a través de un protocolo de señales). bits 2.5 (tipo de pantalla: 11 MDA. bit 7 (en PC: empleado para seleccionar la función del puerto A. que es repartido a la mitad entre ambos grupos para gestionar las señales de control.3 parte alta del segundo banco de conmutadores de configuración (no usada).7 (número de unidades de disco. bit 6 (PC/XT: a 1 activa la señal de reloj del teclado). que luego puede ser leído desde la interrupción del teclado. 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. bit 3 (en XT: selecciona contenido del puerto C. si el bit 0=1). bits 2. y En los XT: bit 1 (activo si coprocesador instalado). bits 4. el puerto A recibe el código de rastreo de la tecla pulsada..7 están igual que en el caso anterior (no dependen del bit 2 ó 3 del puerto B).3: mitad inferior del 2º banco de conmutadores de la placa base (RAM en slots de expansión). Instituto Tecnológico de la Laguna Pag. 01 color 40x25)..1 tipo de pantalla (11 MDA.

por lo que sólo se describirá uno.D0: BUS de datos bidireccional de 3 estados.. generador de onda cuadrada.Lenguaje Ensamblador Uso de Procedimientos. RD: Permite al 8254 enviar datos a la CPU. OUT 1: Salida del contador 1. CLK 0: CLOCK 0. Este circuito integrado posee 3 contadores totalmente independientes. En este capítulo. GATE 0: Puerta de entrada al contador 0. Las líneas A0. algo más potente que el 8253 de los PC/XT. Basta con tener en cuenta dos cosas: por un lado. antes de enviar la cuenta inicial al contador. se puede enviar la palabra de control de cada contador Instituto Tecnológico de la Laguna Pag. A0. con el comando read-back del 8254.. 2 y 3 son idénticos en su funcionamiento. Macros y Librerías EL TEMPORIZADOR 8253 U 8254 El 8253/4 es un chip temporizador que puede ser empleado como reloj de tiempo real. de 8 bits y tres estados. entrada de reloj al contador 2. las pocas diferencias serán comentadas cuando llegue el caso. Los contadores 1. Teniendo en cuenta que cada contador tiene su propio puerto y que la palabra de control indica el contador al que está asociada. que pueden ser programados de 6 formas diferentes. Esto significa que. por ejemplo. entrada de reloj al contador 1. GATE 1: Puerta de entrada al contador 1. son totalmente independientes y cada uno de ellos puede ser programado en una modalidad diferente. este registro sólo puede ser escrito (se puede obtener información de estado. generador de ritmo programable. WR: Permite al 8254 aceptar datos de la CPU.A2 seleccionan uno de los tres contadores o el registro de la palabra de control. OUT 2: Salida del contador 2. dicha cuenta inicial debe seguir exactamente el formato seleccionado en la palabra de control (enviar sólo byte bajo. GATE 2: Puerta de entrada al contador 2. no hay que seguir un orden especial a la hora de programar los contadores. CS: Habilita la comunicación con la CPU.. comunica el 8254 con la CPU. CLK 2: CLOCK 2. sin embargo. contador de sucesos. la información vertida estará relacionada con el 8254 que equipa a los AT. D7. El registro de la palabra de control es seleccionado Cuando A0=A1=1. OPERACIONES DE ESCRITURA El 8254 es muy flexible a la hora de ser programado. La lógica de lectura y escritura acepta entradas del bus y genera señales de control para las partes funcionales del 8254. para poder leerlos o escribirlos. etc. como se verá más adelante. escribir siempre primero la palabra de control. 12 . entrada de reloj al contador 0. El buffer del bus de datos.A1: Líneas de dirección para seleccionar uno de los tres contadores o el registro de la palabra de control. OUT 0: Salida del contador 0. enviar sólo byte alto. no disponible en el 8253). Por otro. CLK 1: CLOCK 1. o bien enviar ambos consecutivamente).

. lo que daría un resultado incorrecto. Instituto Tecnológico de la Laguna Pag. Un flanco de subida de GATE provoca la carga del contador (CR -< CE) y que OUT baje en el próximo pulso del reloj.. 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. la parte alta de la cuenta para el contador 0. 13 . 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. o bien enviar todas las palabras de control para los 3 contadores y después las 3 cuentas iniciales. permaneciendo en bajo hasta que el contador alcance el cero.. Si se escribe una nueva cuenta en el contador. el primer byte enviado inhibe la cuenta y OUT es puesto a cero inmediatamente (sin esperar a CLK): tras escribir el segundo byte. después la palabra de control para el contador 1. Si se escribe una nueva cuenta durante un pulso One-Shot. que se produzca un nuevo flanco de subida de GATE: en ese caso. 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. Si se programa el contador para leer/escribir la cuenta como dos bytes consecutivos (bajo y alto). será cargada en el próximo pulso del reloj y el contador comenzará a decrementarse. Es empleado típicamente para contar sucesos. Macros y Librerías seguida de su cuenta inicial. Entonces. luego la parte baja de la cuenta para el contador 1. lógicamente. como luego veremos. 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. 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. MODOS DE OPERACIÓN DEL 8253 Ò 8254 MODO 0: Interrupt On Terminal Count (Interrupción al final de la cuenta). OUT permanecerá a 0 durante N+1 pulsos del reloj tras escribir la cuenta inicial. comenzando el pulso OneShot de N ciclos de reloj de duración. 0FFFEh. etc. el contador sería recargado con el nuevo valor. GATE no influye directamente en OUT. . como se verá más adelante). pulso que no decrementa el contador: para una cuenta inicial N. el contador vuelve a ser recargado si se produce un nuevo flanco de subida de GATE.. El primero es el comando Read-Back. MODO 1: Hardware Retriggerable One-Shot (Monoestable programable). Si se escribe una nueva cuenta mientras GATE=0. Tras escribir la palabra de control.). OUT será inicialmente alta y bajará en el pulso de reloj que sigue al flanco de subida de GATE. a menos.) por lo que lecturas posteriores del mismo devuelven valores pseudoaleatorios.Lenguaje Ensamblador Uso de Procedimientos. de ahí que OUT permanezca en bajo durante N pulsos de reloj tras la última vez que suceda esto. sólo disponible en el 8254 (y no en el 8253). el contador está preparado. El tercer método consiste en el comando de enclavamiento. la cuenta será cargada en el siguiente pulso del reloj. El pulso One-Shot puede repetirse sin necesidad de recargar el contador con el mismo valor. después la parte baja de la cuenta para el contador 0. la cuenta inicial será cargada en el próximo pulso del reloj conectado (CLK). OUT sube y permanece activo hasta el pulso del reloj que siga al próximo flanco de subida de GATE. también es válida cualquier combinación intermedia de estas secuencias (por ejemplo: enviar la palabra de control para el contador 0. ésta será cargada en cualquier caso en el siguiente pulso del reloj: cuando GATE suba. Tras escribir la cuenta inicial y la palabra de control en el contador. La entrada GATE puesta a 0 permite inhibir la cuenta. El contador sigue evolucionando tras llegar a cero (0FFFFh. OUT se pondrá en alto tras N pulsos del reloj (y no N+1 en este caso). Esto permite sincronizar la secuencia de conteo por software. sin afectar a OUT. el One-Shot en curso no resulta afectado. si se envía una cuenta de dos bytes. Tras escribir la palabra de control y la cuenta inicial. OPERACIONES DE LECTURA Existen tres posibles métodos para leer el valor de un contador en el 8254.

Para una cuenta inicial N. Tras escribir la palabra de control y la cuenta inicial. Si GATE=0 la cuenta descendiente se detiene: si GATE es bajado durante un pulso de salida. 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 este modo. Macros y Librerías MODO 2: Rate Generator (Generador de ritmo). el contador será cargado en el próximo pulso del reloj: OUT bajará N pulsos de reloj después. OUT sube inmediatamente sin esperar ningún CLK. Escribir un nuevo valor de cuenta durante el funcionamiento del contador no afecta a la actual secuencia de cuenta. OUT baja durante un pulso de reloj y luego vuelve a subir. el contador será cargado en el próximo pulso del reloj: como ese pulso no decrementa el contador. Este modo es. y la misma secuencia se repite indefinidamente. lo que permite también una sincronización por software. Es empleado típicamente para las interrupciones de los relojes de tiempo real. GATE no afecta a OUT. en caso contrario se recargará con el nuevo valor tras finalizar con normalidad el ciclo en curso. OUT estará en alto al principio: con el flanco de subida de la señal GATE. el contador será cargado en el próximo pulso del reloj: también puede ser sincronizado por software. OUT baja durante un pulso CLK y luego vuelve a subir. GATE no influye en OUT. 14 . Este modo es también periódico: la onda resultante para una cuenta inicial N tiene un período de N ciclos. por tanto. OUT sube inmediatamente. Para valores de cuenta impares. se cargará en el próximo pulso CLK y continuará el proceso de cuenta con la nueva cuenta escrita. Tras escribir la palabra de control y la cuenta inicial. periódico. 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. Este modo es empleado normalmente para la generación de una señal de onda cuadrada. El proceso se inicia cuando se escribe la cuenta inicial. OUT pasará a estado bajo durante un pulso del reloj.Lenguaje Ensamblador Uso de Procedimientos. Después de escribir la palabra de control y la cuenta inicial. OUT no bajará hasta que pasen N+1 pulsos de reloj. al escribir el primero no se altera el funcionamiento del contador hasta que se envíe el segundo. el contador comienza a decrementar la cuenta. Este pulso CLK no decrementa el contador: por ello. Cuando el contador se decremente hasta el valor 1. OUT está en alto al principio. Instituto Tecnológico de la Laguna Pag. MODO 4: Software Triggered Mode (Pulso Strobe iniciado por software). la duración a nivel alto de OUT será un período de reloj mayor que la duración a nivel bajo. ante una cuenta inicial N. Este modo es similar al 2. GATE=0 inhibe el contador y GATE=1 lo habilita. 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. el contador funciona como un divisor por N. Escribir un nuevo valor de cuenta durante el funcionamiento del contador no afecta a la actual secuencia de cuenta. Tras escribir la palabra de control y la cuenta inicial. OUT bajará tras los N pulsos del reloj correspondientes): GATE puede ser utilizado para sincronizar el contador. OUT estará inicialmente en alto. repitiéndose el proceso. con la diferencia de que la salida OUT conmuta al transcurrir la mitad de la cuenta: inicialmente está en alto. la secuencia se repite cada N ciclos de reloj (CLK). Cuando llega a cero. OUT no bajará hasta N+1 pulsos de CLK. para una cuanta inicial N. como cabría esperar. 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. el contador no será cargado hasta el pulso de reloj posterior al flanco de subida de GATE. cuando la cuenta inicial expira. MODO 3: Square Wave Mode (Generador de onda cuadrada). MODO 5: Hardware Triggered Strobe (Pulso Strobe iniciado por hardware). si la cuenta es de 2 bytes. Si se escribe una nueva cuenta durante el proceso. Si GATE=0 la cuenta descendiente se detiene: si GATE es bajado durante un pulso de salida. tras ello. volverá a subir y el contador se recargará con la cuenta inicial. pero al pasar la mitad de la cuenta pasa a estado bajo hasta que la cuenta finaliza. en caso contrario se recargará con el nuevo valor tras finalizar con normalidad el medio-ciclo en curso.

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). Todos los contadores van conectados a un reloj que oscila a una frecuencia de 1. TEMPORIZACION Los contadores 0 y 1. ya están ocupados por el sistema. los PC/XT van equipados con un 8253. Sin embargo. De todas maneras. aumentándolo se puede acelerar el funcionamiento del ordenador.193. la palabra de control se envía al puerto 43h. 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. 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. borrar bit 1 (conexión contador 2 con el altavoz) .2 veces por segundo. Por tanto.536 = 18.11111101b OR AL. por lo que la cadencia de los pulsos es de 1. si bien no lo consideraremos aquí. respectivamente.de un fallo en la memoria. como se verá más adelante. los PS/2 más avanzados tienen un temporizador con un cuarto contador ligado a la interrupción no enmascarable. aunque se podría bajar hasta un valor 2-17 para ralentizar el sistema. el contador será cargado con la nueva cuenta en el próximo pulso del reloj. la actual secuencia del contador no será alterada. ciertamente demasiado baja.Lenguaje Ensamblador Uso de Procedimientos. este contador está programado por defecto con el valor cero (equivalente a 65536).AL . llamando a la vieja INT 8 cada 1/18. La salida del contador 1 controla el refresco de memoria en todas las máquinas. que a su vez invoca a INT 1Ch). Macros y Librerías Si una nueva cuenta inicial es escrita durante el proceso. activar bit 0 (línea GATE del contador 2) . con el riesgo -eso sí. valor que determina la precisión del reloj del sistema. el usuario normalmente programa el contador 2 en el modo 2 ó 3.00000001b JMP SHORT $+2 OUT 61h.193.180 ciclos por segundo (casi 1. su valor normal para el divisor es 18. hay un método para realizar retardos (empleado por la BIOS y algunas aplicaciones) que se vería afectado. en el contador 2 es seleccionable el nivel de la línea GATE a través de bit 0 del puerto E/S 61h.2 interrupciones/segundo. los tres contadores son accedidos.2 segundos para no alterar el funcionamiento normal del ordenador. a través de los puertos 40h. La salida del contador 0 está conectada a IRQ 0 (ligado a la INT 8. 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. La dirección base en el espacio de E/S del ordenador elegida por IBM cuando diseñó el PC es la 40h. La salida del contador 2 puede estar conectado al altavoz del ordenador para producir sonido. algo menos versátil. La señal GATE de los contadores 0 y 1 está siempre a 1. detectado por los chips de paridad -si los hay-. acelerándose en ocasiones hasta casi un 10% la velocidad de proceso del equipo. Este contador ha sido conectado con el doble propósito de temporizar y de generar sonido. EL 8254 EN LA PC Todos los AT y PS/2 llevan instalado un 8254 o algo equivalente. 41h y 42h. 15 . en la práctica el único disponible es el 2. Se puede modificar el valor de recarga de este contador en un programa. 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. Es el único contador que queda realmente libre para el usuario.61h AND AL. especialmente este último. en los PC/XT se puede aumentar entre 19 y 1000 sin demasiados riesgos. es preciso habilitar la puerta GATE activando el bit 0 del puerto 61h. Para emplearlo en las temporizaciones. alternativamente puede emplearse para temporizar.180/65. no es conveniente alterar esta especificación porque. estado de espera para E/S Instituto Tecnológico de la Laguna Pag. lo que suele dar quebraderos de cabeza a la hora de producir sonido.2 Mhz). que provoca generalmente el bloqueo del equipo.

la frecuencia con que se hace vibrar al bit que lo produce. es preciso poner primero a cero el bit 0 del mismo puerto (61h): CLI .61h XOR AL. 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. invertir bit 1 JMP SHORT $+2 OUT 61h. que dada la calidad del altavoz también está en función de la frecuencia. una vez más.180/frecuencia en Hz) a dicho contador (programado en modo 3). como veremos).300 . Existe el pequeño problema de que la duración del sonido ha de ser múltiplo de 1/18. Cuanto más deprisa se realice el proceso. 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. 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.2 segundos si se desea utilizar el reloj del sistema para determinarla (un bucle de retardo sería. Al final. Pero aquí nos conformaremos con describir la programación del altavoz. conviene borrar ambos bits de nuevo. Por tanto. el temporizador es el encargado de producir el sonido (este es el segundo método.61h AND AL. con la utilización del 8254 o sin él. Uso de Procedimientos. 256 vueltas otro_ciclo: PUSH CX IN AL.11111110b JMP SHORT $+2 . En todos los PCs existen dos métodos diferentes para generar sonido. Ahora no es preciso inhibir las interrupciones para garantizar la calidad del sonido: Instituto Tecnológico de la Laguna Pag. entre otras IN AL. que veremos por separado. si bien las tarjetas de sonido han solventado el problema. enviando el período del sonido (1. 16 . que sólo superan por muy escaso margen a alguno de los micros legendarios de los 80. no sin hacer malabarismos). Para emplear este sistema. 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. en cualquier caso. éste se encarga de generar el sonido. control sobre el volumen. Por fortuna. 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. 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. Esto permite obtener sonidos idénticos en todos los ordenadores.Lenguaje Ensamblador SÍNTESIS DE SONIDO. Es por ello que el pitido de error que produce el teclado es a menudo distinto entre computadoras. No existe. Macros y Librerías La producción de sonido es uno de los puntos más débiles de las computadoras compatibles.193. mayor será la frecuencia del sonido. Alternativamente.AL MOV CX. Este método de producción de sonido tiene varios inconvenientes. evitar posible INT 8. bajar GATE del contador 2 del 8254 MOV CX. la baja calidad del altavoz del PC redondea la onda cuadrada y produce un sonido algo más musical de forma involuntaria. ya que cuando está en alto y se activa también el bit 1 del puerto E/S 61h.2 . 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.AL . 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).100h . repitiendo el proceso a gran velocidad) se puede generar una onda cuadrada de sonido. si no se tiene mucho cuidado. Por un lado. estado de espera para E/S OUT 61h. así.

17 .Lenguaje Ensamblador Este diseño esta aplicado en el .----------------.Macro FinalizarBocina--------------finBoc macro IN AL. 61H <-AND AL. 00000011B <--OUT 61H. AL <-endm Uso de Procedimientos.Macro IniciarBocina--------------iniBoc macro IN AL. adoptada por la American Standards Asociation en 1936 Instituto Tecnológico de la Laguna Pag.----------------. 61H <-OR AL. Macros y Librerías 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. AL <-Endm . La escala cromática temperada. 11111100B <--OUT 61H.

1 int 21h sub al.36 nhex dw 0 msge db "Teclea tu NIP:$" . ds:datos inicio: mov ax. 10.inicializamos la variable nhex en 0 .Lenguaje Ensamblador Uso de Procedimientos.Segmento de CODIGO code segment para 'code' assume cs:code. " Antonio Vela".0000 clear color call pedir call acomodo finBoc call acomodo call acomodo mov ah. Código.Dígitos del 0 al 9 mal db "***Acceso Denegado***$" cont dw 3 archivo db "Exposicion hecha por Equipo 1 de ensamblador ".Finaliza la bocina si es que está habilitada tras un nuevo intento.13.Apagamos la bocina mediante la macro .mac . la cual emite un sonido con cierta frecuencia si la clave de acceso que se le está solicitando es incorrecta. 13. " Jose Juan Zamora" .Accede al primer digito tecleado y lo acomoda .10. datos mov ds. ax mov nhex. 2010h jne mala clear color imprimir archivo finBoc imprimir linea Instituto Tecnológico de la Laguna Pag.30h or byte ptr nhex.Muestra el mensaje que pide al usuario el NIP . En este programa se hace uso del altavoz de la computadora. include bocina. . " Pedro Martínez $" datos ends . 10.Al ASCCI a(41h) conversión a hexa .13. y si el código ingresado es correcto imprime en pantalla un mensaje sobre el programa y el nombre de los integrantes del equipo. al imprimir linea imprimir linea cmp nhex. 13.Segmento de PILA pila segment para stack 'stack' db 64 dup (?) pila ends . ss:pila. 10. Macros y Librerías Desarrollo. 18 . Este programa fue realizado utilizando algunos procedimientos y algunas macros.mac include macros.Segmento de DATOS datos segment para public 'data' linea db 10.

4C00H INT 21H .1 Int 21h sub al.se prepara cl para hacer una rotación de 4bits para acomodar los dígitos pulsados. cl ret acomodo endp code ends end inicio .PROCEDIMIENTOS pedir proc near .Visualizar msge mov ah. 297 frecuencia dx iniBoc imprimir mal imprimir linea imprimir linea imprimir linea imprimir linea mov ax. . cont dec ax mov cont. Instituto Tecnológico de la Laguna Pag.Asignamos el índice del contador a intentos.restamos 30h para nivelar a nivel hexa de la maquina.9 lea dx. 19 .Leer el primer digito . msge Int 21h ret pedir endp acomodo proc near mov ah.Lenguaje Ensamblador jmp fin mala: mov dx. Macros y Librerías .4 rol nhex. .Si numero intentos=0 salimos de la aplicación. .pasamos 4 reglones. 0 je fin color jmp inicio Fin: finBoc MOV AX.30h or byte ptr nhex.y lo guardara en al . .imprimimos la cadena de acceso denegado .se hace un or afectando nhex . ax cmp cont. al mov cl. .finalizamos la aplicación después de 3 intentos fallidos.le mandamos una frecuencia 297 .La opción 1 de la Int 21 pedirá un carácter. Uso de Procedimientos.

la dirección del puerto OUT 42H.Macro colores--------------color macro mov ah. 00000011B OUT 61H. 42h es donde esta conectada físicamente XCHG AL.Lenguaje Ensamblador Uso de Procedimientos.----------------.limpia la pantalla mov al. Esta macro es para sacar la base de MOV AX.mac .----------------. a sonar la bocina.03h int 10h endm . AH . 07h mov al. 61H AND AL.Macro limpiar--------------clear macro mov ah.----------------.-----------------Macro imprimir---------------imprimir macro cad lea dx. OUT 42H. AL ENDM . BASE .Macro FinalizarBocina------------finBoc macro IN AL. 4F50h int 10h endm Instituto Tecnológico de la Laguna Pag.Macro Fecuencia--------------frecuencia MACRO BASE . 20 .----------------.9 int 21h endm . 00h mov bh. AL . 06h mov cx.mac . AL endm macros. 00h mov dx.Macro IniciarBocina--------------iniBoc macro IN AL. 11111100B OUT 61H. 61H OR AL.cad mov ah.00h . bocina. Macros y Librerías MACROS. la bocina.----------------. AL endm .