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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful