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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful