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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful