1 / 35

Universidad Autónoma de Madrid Escuela Politécnica Superior

ETC-II. Laboratorio de Estructura y Tecnología de Computadores Proyecto Piano. Universidad Autónoma de Madrid Escuela Politécnica Superior. Septiembre-2009. Introducción. Programar en Ensamblador x86 un Teclado electrónico para MSDOS Objetivos: Aprender a programar el entorno 8086

gerry
Download Presentation

Universidad Autónoma de Madrid Escuela Politécnica Superior

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ETC-II Laboratorio de Estructura y Tecnología de Computadores Proyecto Piano Universidad Autónoma de Madrid Escuela Politécnica Superior Septiembre-2009

  2. Introducción Programar en Ensamblador x86 un Teclado electrónico para MSDOS Objetivos: Aprender a programar el entorno 8086 Aprender a realizar un driver Aprender la interacción con los recursos hardware Aprender la interacción entre C y Lenguaje ensamblador Conocimientos: Programación y depuración 8086 Funcionamiento de interrupciones software Comunicación con programas residentes Timer del PC (interrupción 0x1C , generación de sonidos) RTC Uso de la pila para paso de parámetros Septiembre-2009

  3. Introducción • Generación de un sonido mediante el altavoz del PC: • El altavoz del PC está conectado al bit 1 del Puerto 61H (xxxx-xxox) • Cambiando el estado del bit a ciertas frecuencias se produce una señal audible. • Según la frecuencia, tenemos un sonido (nota) u otro. • Dos opciones: • Bucle con espera activa y acceso directo al altavoz • Usar el Timer 0 para generar la señal cuadrada automáticamente PC Señal Eléctrica conectada al altavoz Onda sonora Septiembre-2009

  4. Escala musical temperada 12 Relación entre una nota y la siguiente 2 f 2f Septiembre-2009

  5. Estructura Proyecto Teclado Electrónico Práctica 1 Mandamos la nota Servicios Int 61H Práctica 2 Driver INT 61H Generador Notas musicales por TMR y RTC Practica 3 Programa en C para leer canciones de fichero Librería en ASM que hace de interfaz entre C y el driver Mandamos la nota Septiembre-2009

  6. Práctica 1 Práctica 1: Diseño del teclado Hacer un programa en ensamblador que dibuja un teclado en la pantalla (modo QVGA / VGA) y que detecta las teclas introducidas por el usuario. Este programa llamará al driver ‘sonido.com’ que se encargará de reproducir las notas por el altavoz. Este driver se proporcionará a los alumnos. Septiembre-2009

  7. Práctica 1 objetivos • Práctica 1: Objetivos • Detectar instalación correcta del driver: • Vector interrupción distinto de cero. • Comprobación palabra clave. • Comprobación Identificador del driver. • Dibujar el teclado (Texto o QVGA) • Leer teclas asignadas y mandar orden al simulador • Leer el estado del simulador para mostrar el estado del teclado • Implementar funciones duración y tono. • Usar Makefile y Depurador (TD) • Opcional: • Melodías pre-seleccionadas • Teclado ampliado • Sonidos a otras escalas • Efectos… Septiembre-2009

  8. Práctica 1 Ejemplo Driver en memoria Estado nota Lo gestiona el simulador pero lo lee el programa Septiembre-2009

  9. Práctica 1 entregables Práctica 1: Entregables Programa: piano.asm Fichero: Makefile Librerias: Opcionales (VGA/Texto , Teclado, …) Práctica 1 Teclado Electrónico Simulador Drvmio.com INT 61H Generador Notas musicales Septiembre-2009

  10. Práctica 1: Estructura Driver Estructura Driver Se accede mediante interrupción software: INT61H Nos ofrece servicios, seleccionables por registro AH Resto de registro para paso de parámetros Parte 2: Residente en memoria Palabra de seguridad 0FECAH Configura vector Deja parte residente en memoria Parte 1: Instalación Septiembre-2009

  11. Práctica 1: Servicios del Driver Septiembre-2009

  12. Práctica 1: Comprobación Driver 1º Comprobamos que hay algo en memoria Memoria 2 bytes Tabla Interrupciones 0 Int #0 2 2º 4 Servicios Driver Int #1 6 0FECAH +3 Offset 184H Int #61H Segmento 186H IRET 3º Comprobamos Servicio Identificación MOV AH, 0 INT 61H CMP AX,0EE01H Septiembre-2009

  13. Práctica 1: Librerías • Una librería mantiene una estructura muy parecida a la de un programa normal, pero con algunas características especiales: • Es un archivo fuente .ASM que generalmente sólo lleva la definición del segmento de código, ya que comparte pila y segmento de datos con el programa principal que llama a las funciones de la misma. • Las funciones que queramos exportar o hacer visibles se declaran como PUBLIC en el archivo fuente de la librería. • Los programas que quieran llamar a esas funciones las tendrán que declarar como EXTERN • Una librería se compila con el TASM primero y una vez obtenido el .OBJ se encapsula en un fichero .LIB mediante el comando TLIB. Septiembre-2009

  14. Ejemplo de libreria Solo segmento de código No hay punto de entrada GetKey es accesible el resto no Septiembre-2009

  15. Ejemplo de librería: compilación • tasm /zi teclado.asm • para generar el fichero teclado.obj (suponiendo que el archivo que contiene la libreria se llame teclado.asm) • tlib teclado.lib -+teclado.obj • para generar el fichero teclado.lib que es la librería encapsulada. El -+ indica re-emplazo, es decir, si dentro del archivo teclado.lib ya existe una función GetKey procede a su reemplazo por la nueva versión. En caso de que no exista la añade directamente. • tlink /v program.obj teclado.lib • Una vez que se tiene el archivo teclado.lib se podrá compilar cualquier programa que use funciones de la librería. Septiembre-2009

  16. Ejemplo de libreria Programa.asm Indico función externa Llamada a la función. Cómo si fuese una interna Septiembre-2009

  17. La herramienta make entorno de compilación, nos permite hacer la compilación de un programa más sencilla permitir definir en un fichero una serie de reglas o pasos de compilación para que a partir de una serie de archivos fuente se obtenga el fichero o ficheros ejecutables. Las reglas está contenidas en un fichero que tiene que llamarse Makefile y que será llamado por defecto al ejecutar el comando make. Cuidado, Makefile sin extensión. Un ejemplo sencillo de fichero Makefile es: test.exe: test.obj tlink /v test.obj test.obj: test.asm tasm /zi test.asm clean: del *.obj del test.exe Si tecleamos make clean, nos aseguramos de partir de un punto limpio Makefiles

  18. # Ejemplo de fichero Makefile all: drvmio.com test.exe drvmio.com: drvmio.obj TLINK /t /v drvmio.obj test.exe: test.obj teclado.lib TLINK /V test.obj teclado.lib .asm.obj: TASM /zi $< .obj.lib: TLIB $&.lib -+$< clean: del *.obj del *.map del *.exe del *.lib del *.com Makefiles Si ponemos makeall se ejecutan todos estos procesos Proyecto 1: drvmio.com Proyecto 2: test.exe Reglas de construcción genéricas Limpieza

  19. Práctica 2 Práctica 2: Diseño driver generador de notas Hacer un driver que use el TMR2 y el RTC para generar un tono a la frecuencia de cada nota musical. Este driver sustituirá al proporcionado en la práctica anterior. Opcional: Que el driver saque sonidos por el puerto paralelo Práctica 1 Teclado Electrónico Práctica 2 Driver INT 61H Generador Notas musicales por TMR y RTC Septiembre-2009

  20. Práctica 2: Interrupciones involucradas • Interrupción 61h: Driver • Acceso a las funciones del driver desde programas externos • Interrupción software. No PIC, no EOI, IRET, síncrona. • Hay que instalar la interrupción • Interrupción 70h: Reloj Tiempo Real (RTC) • Cada vez que suene una nota se activará para medir el tiempo que tiene que sonar. Cuando salte ‘n-veces’ la interrupción desactivaremos el sonido. • Hay que instalar la interrupción y configurar los PIC, los registros A y B del RTC con la interrupción PIE del mismo. • Interrupción hardware: PIC, EOI, IRET, asíncrona • Interrupción 1Ch: Generada por el TMR (INT 08h) • Se llama 18.2/seg y nos servirá para hacer efecto gráfico. Se configura al instalar el driver, y se desactiva al desinstalar el driver. Hay que instalar la interrupción. • Pseudo-software: No PIC, no EOI, IRET, asíncrona Septiembre-2009

  21. Práctica 2: Estructura Driver Estructura Driver Se accede mediante interrupción software: INT61H Nos ofrece servicios, seleccionables por registro AH Resto de registro para paso de parámetros Parte 2: Residente en memoria Palabra de seguridad 0FECAH Configura vectores interrupción Deja parte residente en memoria Parte 1: Instalación Septiembre-2009

  22. Práctica 2: Segmento de datos MOV AX,DATO1 INT 61h … PUSH DS MOV AX,CS MOV DS,AX MOV AX,DATO2 POP DS IRET MOV AX,DATO2 IRET 2 Programa Principal DATO1 Driver DATO2 1 3 2 DS CS ES SS Septiembre-2009

  23. Práctica 2: El Temporizador (TMR 8253) El Chip 8253 contiene tres temporizadores de 16-bits Lo vamos a usar para generar sonidos. Registros internos (Accesibles directamente en los puertos siguientes): 40h : Contador 0 -> controla el reloj sistema -> INT8 -> INT 1Ch 41h : Contador 1-> Refresco memoria RAM 42h : Contador 2 -> Generación de tonos en el altavoz 43h : Registro de control Se accede a ellos mediante las instrucciones IN/OUT 18.2Hz (INT 1CH) 0 1 Amplificador y Filtro 2 Puerto 42h Puerto 61h 7 1 0 Septiembre-2009

  24. Práctica 2: Temporizador Registro de Control SC1..SC0: Seleccionan el contador que vamos a configurar 0 0 : Contador 0 0 1 : Contador 1 1 0 : Contador 2 1 1 : Sin uso RL1..RL0: Modo de acceso a los contadores 0 0 : Captura de la cuenta en un latch (leer sin para contador) 0 1 : Leer/Escribir el byte más significativo 1 0 : Leer/Escribir el byte menos significativo 1 1 : Leer/Escribir ambos bytes (primero menos significativo) M2..M0: Modo de funcionamiento (x11 -> Aestable, generador de onda cuadrada) BCD: Cuenta en modo BCD Septiembre-2009

  25. Práctica 2: Reloj en Tiempo Real (RTC) • El Chip MC146818 mantiene la hora del sistema cuando esta apagado • Lo vamos a usar para temporizar la duración del sonido. Usaremos su capacidad de generar interrupciones hardware. • Tiene 64 registros internos, de los cuales nosotros vamos a usar: • Registro A (Dirección 10): Configuración general (Frecuencia) • Frec. Osc. = 32.768khz • Registro B (Dirección 11): Configuración interrupciones (PIE). PIE=1, SQWE=0 • Registro C (Dirección 12): Estado (PIE). Con leer se borran los flags. • El acceso a sus registros internos se hace indirectamente a través del puerto 70h y 71h mediante instrucciones IN/OUT. • Para realizar lectura: • Se escribe (OUT) en el puerto 70h la dirección de la posición que se desea leer. • Se realiza una lectura en el puerto 71h. • Para realizar una escritura • Se escribe (OUT) en el puerto 70h la dirección de la posición que se desea escribir • Se escribe (OUT) en el puerto 71h el dato que se quiere escribir Septiembre-2009

  26. Práctica 2: Controlador Interrupciones (PIC) Direcciones del PIC-0 (maestro): 20h y 21h Direcciones del PIC-1 (esclavo): A0h y A1h Interrupciones PIC-0: 08h (IR0), 09h (IR1)…0Fh (IR7) Interrupciones PIC-1: 70h (IR8), 71h (IR9)…7Fh (IR15) Septiembre-2009

  27. Práctica 2: Controlador Interrupciones (PIC) • El RTC genera la interrupción 70h que proviene del PIC-esclavo. • Para poderla recibir tenemos que configurar el PIC maestro y el esclavo. • Para indicar que hemos recibido una interrupción tenemos que mandar EOI no especifico (OCW2 = 020h) al PIC esclavo y maestro. • Configuración: • PIC Maestro: • 21h: Máscara de interrupción (habilitar entrada IR2 – esclavo) • 20h: Mandar comandos (EOI no específico OCW2) • PIC esclavo: • A1h: Máscara de interrupción (habilitar entrada IR0 – RTC) • A0h: Mandar comandos (EOI no específico OCW2) • Ejemplo: • IN AL, 021h ; Leo máscara interrupción del PIC maestro • AND AL, 0FBh ; Pongo a cero (habilito) entrada del PIC esclavo • OUT 021h,AL ; Guardo el valor en la máscara Septiembre-2009

  28. Práctica 3 Práctica 3: Interacción de Ensamblador con el Lenguaje C Hacer un programa en C y una librería intermedia que llame al driver anterior y reproduzca canciones escritas en un fichero. Opcional: Tener un teclado y poder reproducir y guardar canciones. Practica 3 Driver INT 61H Generador Notas musicales por TMR y RTC Programa en C para leer canciones de fichero Librería en ASM que hace de interfaz entre C y el driver Septiembre-2009

  29. Paso de parámetros de C a ASM Paso de parámetros de C a ASM El paso de parámetros se realizará por lo PILA. intfuncion_asm(charparam1, intparam2, long intparam3) ; Lectura de Param2 PUSH BP ; BP como índice MOV BP,SP MOV AX, SS:[BP+8] ; AX=Param2 … POP BP ; equilibrado PILA RET +2 +2 +2 +2 Septiembre-2009

  30. Paso de parámetros de ASM a C • Paso de ASM a C • El paso de parámetros se realiza por DX:AX • int funcion_asm(int param1, int param2, int param3) • Retorno de 16 bits en AX • Retorno de 32 bits en DX:AX • Ejemplo: • Un entero se devuelve en AX • Un puntero se devuelve en DX (segmento):AX (offset) • ; Función en Ensamblador • PUSH BP • MOV BP,SP • MOV AX, [BP+8] ; AX = Param2 • POP BP • RET • Esta función devuelve el valor de PARAM2 ( { return param2 } ) Septiembre-2009

  31. Paso de parámetros de C a ASM Ejemplo implementación de la práctica: Fichero 1: Programa en C #include “libdriver.h” void main() { int id; id = driver_identificador(); // obtener el identificador if (id!=0xEE01) { printf(“Error\n”); // si no es 0xEE01 salgo else { driver_playnota(1); // toco una nota hasta que pare while (driver_estado() == 1) ; } } Septiembre-2009

  32. Paso de parámetros de C a ASM fichero 2 : libdriver.h (Usado para compilar en C) int driver_identificador(); void driver_playnota(unsigned int); int driver_estado() ; fichero 3 : libdriver.asm (Librería puente) _LIBDRIVER segment assume cs:_LIBDRIVER db 10h DUP (?) (… código de las funciones ---) _LIBDRIVER ends public _driver_identificador public _driver_playnota public _driver_estado end Septiembre-2009

  33. Paso de parámetros de C a ASM ;------------------------------------ ; int driver_identificador() ;------------------------------------ _driver_identificador PROC FAR push bp mov ah,0 ; función identificación del driver int 61h ; Resultado en AX pop bp ret ; En AX esta el valor de indentificacion _driver_identificador ENDP (*) PUSH BP, POP BP no haría falta dado que en este caso no tenemos que acceder a la pila para buscar parámetros. Es una función que solo devuelve un valor (**) Es necesario poner “_” para que C pueda encontrar las funciones de la librería. Septiembre-2009

  34. Paso de parámetros de C a ASM ; int driver_playnota(int nota) ; stack-4 -> offset retorno ; stack-2 -> segmento retorno (Si lo definimos como NEAR no se guarda el CS) ; stack -> nota ; por AX devuelvo el resultado _driver_playnota PROC FAR push bp mov bp,sp ; para acceder a la PILA mov ax,ss:[bp+6] ; saco la posición a leer de la PILA mov ah,2 ; función Play Nota (En AL está la NOTA) int 61h xor al,al ; En AH =0 si no hay Error pop bp ret _driver_playnota ENDP Septiembre-2009

  35. Paso de parámetros de C a ASM Compilación: testc.exe: testc.c libdriver.asm tcc -v -ml -Ic:\compila\tc\include -Lc:\compila\tc\lib testc.c libdriver.asm Librería ASM Programa en C Depuración y modo FAR Compilador de C Septiembre-2009

More Related