USO DE MEMORIA Y PERIFÉRICOS CON EMU8086 Kervin Sánchez Herrera. Estructura del Computador MEMORIA Uso de Memoria • La memoria ROM ya está escrita y contiene el programa BOOT de inicio, este programa se ubica entre las direcciones de memoria 80000h:800E9h y no se puede modificar. • La memoria RAM se ubica entre las direcciones 00000h:00FFFh se divide en datos y programa a ejecutar. • El programa empieza en 00400h y el tamaño del mismo depende del programador. • El programador debe tener cuidado de no guardar datos en la dirección del programa para no causar problemas de ejecución. Mapa de Memoria Programa • Las variables se definen usando DW y DB los cuales definen variables de tamaño Palabra o Byte correspondientemente. • Cuando se relacionan variables con registros, las variables de tamaño Byte se deben usar con registros cortos como AL, y las variables de tamaño Palabra con registros largos como AX. Código del Programa • El compilador traduce el programa a lenguaje binario. • Por el estilo de programación las variables son puestas en el mismo bloque del programa. Direccionamiento de Variables • Cuando se crean variables en el programa con DB o DW, y luego se llaman las variables en el programa (como el ejemplo) se utiliza un modo de direccionamiento llamado direccionamiento especial o Directo, en el cual no se usan registros para el desplazamiento, solo se usa un desplazamiento dado en la instrucción y el Segmento de Datos. Direccionamiento de Variables (2) • El desplazamiento se brinda en el mismo código de la instrucción. • La parte alta de la dirección de la variable se llena con el DS. • Qué pasa si el DS=CS? Qué pasa si el DS=0000H? Direccionamiento de Variables (3) • Si el DS es igual al CS, la variable se almacena en la parte más baja de el código del programa, en la misma dirección donde se inicializaron las variables. • Si el DS es igual al inicio de la memoria RAM, las variables se almacenarán en esa parte de la RAM respetando los desplazamientos de dirección dados en el Programa. • Cual método Elegir? Método Direccionamiento de Variables • Cualquiera de los dos métodos es valido siempre y cuando se tengan las siguientes consideraciones. • Si el DS=CS: • Se debe tener cuidado al hacer arreglos de Datos, ya que al estar tan cerca del programa se puede borrar los mismos!!! • La inicialización de los vectores de interrupciones debe hacerse manualmente. • Si el DS=0000h: • Se puede trabajar libremente con arreglos sin preocuparse de que el programa este cercano. • Se facilita el inicializar los vectores de interrupción. • Se pierden los datos inicializados en el programa ya que estos fueron copiados en la RAM del programa!!! VECTORES DE INTERRUPCIÓN Inicialización de Vectores de Interrupción • Se pueden inicializar con variables o directamente. • Su tamaño siempre es de 4 bytes!!! • En la dirección se escribe: • Desplazamiento Bajo. • Desplazamiento Alto. • Segmento Bajo. • Segmento Alto. • En ese preciso orden específico!!! Inicialización de Vectores por Variables • Se debe hacer concordar las variables con el espacio para los vectores en 00000H. • El DS debe ser 0000H. • Cada Variable debe ser de 4 bytes. (2 palabras). • Dado el método de programación, la dirección del segmento siempre es igual al CS (0040H). • Para que sirve la variable muerta? • Porque no hay Vector0? Inicialización de Vectores Directamente • De igual forma se escribe en forma • • • • de palabra. Se debe tener cuidado que el DS este en 0000H. De igual forma la dirección del segmento siempre es igual al CS (0040H). Estos vectores son los mismos que para el método de inicialización por Variables. Porque ahora si hay Vector0? Inicialización de Vectores Vectores de Interrupciones PUERTO UART Puerto UART • El puerto UART al igual que el resto de puertos, no necesita inicialización. • Es un puerto de escritura y de lectura. • Su tamaño es de un byte. • Genera interrupciones de envío y recibido! (si no se desea trabajar con interrupciones, se debe usar la instrucción CLI, al inicio del código). • Se ubica en el puerto 00h. Escritura y Lectura en el UART • Siempre se usa el registro AL o AX para leer o escribir de puertos. • Se usa AL, dado que el tamaño del puerto es de 1 byte. CONTADOR Unidad Contador • La unidad contador es de solo escritura, no se puede leer desde ella. • Tiene un tamaño de 1 byte. • Responde mediante la patilla de TEST, la cual se prueba mediante la instrucción WAIT (traducción a PUSHA, POP). Este puerto no genera interrupciones!!!. • Realiza Cuentas en unidades de ms. • Se ubica en el puerto 01H Escritura en el contador • Se usa el registro AL, dado que el tamaño del puerto es de 1 byte. • Se usa PUSHA o POPA para esperar la cuenta. • En este caso se realiza una cuenta de 32H = 50 ms. REGISTRO LEDS Registro de LEDS • Es solo de escritura, no se pueden leer datos de él. • Tiene un tamaño de escritura de 1 byte. • No genera interrupciones. • Se muestra en 8 LEDS externos del sistema. • Se ubica en el puerto 02H Escritura en Registro LEDS • Se usa el registro AL, para escribir los datos. • En este caso se escribe AAH = 10101010 B. PUERTO MOUSE Puerto Mouse • De este puerto se obtienen 5 bytes de información. • Los primeros 2 corresponden a la posición del mouse • • • • • horizontal. Se ubica en el puerto 03H. Los 2 siguientes corresponden a la posición del mouse vertical. Se ubica en el puerto 05H. El ultimo corresponde al estado de los botones. Se ubica en el puerto 07H. El estado de los botones genera una interrupción (no la posición, solo los botones). Las posiciones son de tamaño Palabra, mientras que el estado de los botones es de tamaño Byte. Todos son puertos de solo Lectura!, no se pueden escribir. Lectura del Puerto Mouse • Se usa AX para las posiciones ya que son de tamaño Palabra. • Se usa AL, para el estado de los botones ya que su tamaño es 1 bite. Mapa de Puertos MEMORIA DE VIDEO Memoria de Video • La memoria de video se ubica en 01000H:010FFH. • Es una memoria de solo escritura, no puede ser leída. • Contiene 32 elementos imprimibles en forma de rectángulos, cada uno de ellos necesita de 8 bytes (4 palabras) para su definición. • Los elementos están organizados de forma ascendente. • Dado que no puede ser leída, es una buena practica guardar los parámetros en otra parte de la memoria RAM. Organización de la Memoria de Video Métodos para escribir en la Memoria de Video • Dado que no se puede leer en la memoria de Video, la mejor practica es guardar los datos en alguna parte de la memoria RAM y copiar estos a la memoria de Video cuando sea necesario. • La memoria de Video puede ser escrita mediante el método directo, el cual utiliza el segmento de código DS o mediante el método Indirecto el cual utiliza el segmento de código ES, mediante uso de strings. • Lo mas importante es mantener el orden en que se copian los datos para poder obtener una imagen clara en la pantalla. Método directo • Consiste en copiar los elementos desde una parte de la memoria hacia la memoria de video un elemento a la vez. • Se puede implementar mediante ciclos usando CMP o LOOPs. • Se deben mantener las variables originales en la parte de la memoria designada para ello. Método Directo (2) Método Indirecto • Se requiere que las variables estén definidas en alguna parte de la Memoria RAM. • Consiste en realizar el copiado mediante movimiento de strings. • Se usa la instrucción MOVS y REP, las cuales son muy similares a MOV y LOOP. • Se debe definir el ES. Instrucción MOVS • La instrucción MOVS, se usa definiendo el tamaño de byte o palabra, mediante las formas: MOVSB y MOVSW. • Esta instrucción mueve el dato cuya dirección es DSx10h+SI a la dirección ESx10h+DI. • Mueve datos desde el Segmento de Datos hasta el segmento Extra. • Utiliza los índices DI y SI como índices de destino y origen. • MOVSB, mueve un byte, mientras que MOVSW mueve una palabra. Instrucción REP • Esta instrucción se usa como prefijo solamente para instrucciones de strings. Como MOVS, CMPS, SCAS, LODS y STOS. • Cumple la misma función que LOOP, disminuye el registro CX y termina cuando la cuenta es 0. • Además cumple la función de disminuir o aumentar los registros índices según sea la bandera D. • El uso de esta junto con MOVS reduce el código de copiado. Método Indirecto (2) Recomendaciones Finales • Nunca se debe perder de vista la dirección donde se esta escribiendo o leyendo, no solo del desplazamiento sino también del segmento! • Las banderas son necesarias en muchos procesos, siempre deben ser tomadas en consideración. • Nunca se debe escribir o leer donde no esta permitido ya que esto provoca errores! • Se debe definir bien lo que se desea hacer antes de sentarse a programar! Referencias: • Intel Corporation. iAPX 86/88, 186/188 User´s Manual. 1ra Ed., Intel Literature Sales, USA, 1986. • Brey, Barry B. Microprocesadores Intel. 7ma Ed., Pearson Pretice Hill, Mexico, 2006. • Intel Corporation. 8088 8-bit HMOS microprocessor data sheet. 1990.