Diferencia entre revisiones de «ETC-II 2008/09»
(→Objetivos) |
(→Enlaces) |
||
(No se muestran 69 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
= Ultima hora = | = Ultima hora = | ||
− | + | = Listados clase = | |
− | + | ||
+ | [http://www.iearobotics.com/wiki/images/e/e8/Lista-etcii-1a.pdf Listado 1a]<br> | ||
+ | [http://www.iearobotics.com/wiki/images/e/e4/Lista-etcii-2a.pdf Listado 2a]<br><br> | ||
− | == Resumen Objetivos Entrega == | + | = Bugs = |
+ | |||
+ | * (25-nov-2008) Esta semana os he comentado que había un problema con el ejemplo DRVMIO.ASM ya que a algunas personas les funcionaba y a otras no. El problema no estaba en el programa, estaba en el Makefile. El tema es que se estaba compilando como un .EXE aunque luego se renombraba a .COM. | ||
+ | La opción correcta para compilar es:<br> | ||
+ | '''tasm /zi drvmio.asm'''<br> | ||
+ | '''tlink /t /V drvmio.obj'''<br> | ||
+ | (*) Si tenéis problemas para pasar los dos parámetros, usad el '''/t''' que es el que se encarga de generar el .COM<br><br> | ||
+ | |||
+ | * (Oct-08) En el driver hay un error. Solo devuelve 128 posiciones de memoria. En la zona de descargas podeis encontrar una version que corrige el error ('''EEPROM.COM''') y pronto estará en la web. (Por cierto el uninstall tampoco funciona por ahora) | ||
+ | |||
+ | = Práctica 3 = | ||
+ | |||
+ | Publicados los ejemplos de la práctica 3.<br> | ||
+ | |||
+ | [http://arantxa.ii.uam.es/~gdrivera/labetcii/curso0809/pract3.htm Página Oficial] | ||
+ | <br><br> | ||
+ | ''' La práctica se puede probar usando el programa realizado en la práctica 1, el simulador. Pero se recomienda usar el driver real ya que se tendrá en cuenta para la nota.''' | ||
+ | |||
+ | = Práctica 2 = | ||
+ | |||
+ | [http://arantxa.ii.uam.es/~gdrivera/labetcii/curso0809/pract2.htm Página Oficial] | ||
+ | |||
+ | === Pasos para realizar la práctica === | ||
+ | * Empezar por la estructura básica del driver. Que se instale y que responda a la función STATUS, EESISE. | ||
+ | * Añadir la comunicación con el puerto paralelo. Añadir al driver el poder apagar y encender el LED. (Usar un programa aparte o la propia práctica 1 para activarlo y/o desactivarlo). | ||
+ | * Leerse la documentación de la memoria EE_WIRE (activación, función de inicio, lectura, escritura... cronogramas) | ||
+ | * Implementar la lectura / escritura en la memoria. Usar temporización pasiva (un bucle) | ||
+ | * Estudiarse el RTC | ||
+ | * Añadir la temporización con el RTC y quitar la pasiva. | ||
+ | <br> | ||
+ | ''' La práctica se probará usando el programa realizado en la prática 1, por eso todos aquellos a los que les falte alguna funcionalidad la tendrán que añadir''' | ||
+ | |||
+ | === Programas de ayuda === | ||
+ | |||
+ | * Esqueleto de driver (instalar, parser,...). A completar con las funciones de acceso a la memoria por parte del alumno | ||
+ | * RTC (ejemplo del RTC). Usarlo para integrarlo en el driver, para ello completar el código con la teoría del RTC. | ||
+ | * Paral (ejemplo de uso del puerto paralelo). Usar el acceso para realizar el driver pedido. | ||
+ | * DosBox con acceso al puerto paralelo. | ||
+ | * Ejemplo de driver con RTC integrado | ||
+ | * Ejemplo de acceso a la memoria en lectura y escritura | ||
+ | |||
+ | Los programas anteriores se encuentran en la zona de [http://www.iearobotics.com/wiki/index.php?title=ETC-II_2008/09#Descarga_de_archivos descargas] de esta página. | ||
+ | |||
+ | = Práctica 1 = | ||
+ | |||
+ | === Ayudas === | ||
+ | * En la zona de descargas teneis un programa que se llama '''TEST.ASM''' que permite probar el driver. Para ello crea un fichero que se llama MEM2.BIN, lo rellena de datos y luego comprueba que se leen bien. Además los representa en ASCII en la pantalla. | ||
+ | * Os he dejado el archivo libreria.zip que contiene un ejemplo de ''libreria'' y ''makefile avanzado''. | ||
+ | |||
+ | === Resumen Objetivos Entrega === | ||
* Realización del programa Lector/Editor Hexadecimal | * Realización del programa Lector/Editor Hexadecimal | ||
Línea 12: | Línea 63: | ||
* Compilación usando Makefiles | * Compilación usando Makefiles | ||
− | == Consejos == | + | === Consejos Práctica 1 === |
− | === Pasos para la programación del Editor === | + | ==== Pasos para la programación del Editor ==== |
1. Hacer la estructura del programa partiendo en uno de los ejemplos de la práctica 0<br> | 1. Hacer la estructura del programa partiendo en uno de los ejemplos de la práctica 0<br> | ||
Línea 26: | Línea 77: | ||
<br> | <br> | ||
Conviene usar ''Makefile'' desde el principio. | Conviene usar ''Makefile'' desde el principio. | ||
+ | |||
+ | ==== Librerías ==== | ||
+ | |||
+ | Una librería mantiene una estructura muy parecida a la de un programa, pero con algunas características especiales:<br> | ||
+ | 1. 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.<br> | ||
+ | 2. Las funciones que queramos exportar o hacer visibles se declaran como PUBLIC en el archivo fuente de la librería.<br> | ||
+ | 3. Los programas que quieran llamar a esas funciones las tendrán que declarar como EXTERN<br> | ||
+ | 4. 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.<br> | ||
+ | <br> | ||
+ | Veamos un ejemplo de librería (archivo teclado.asm):<br> | ||
+ | |||
+ | <pre> | ||
+ | ;================================== | ||
+ | ;= Ejemplo de libreria = | ||
+ | ;================================== | ||
+ | |||
+ | ;DEFINICION DEL SEGMENTO DE CODIGO | ||
+ | TECLADOLIB SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:TECLADOLIB | ||
+ | |||
+ | ; Funcion que mira si hay tecla pulsada | ||
+ | ; Es equivalente a kbhit(); | ||
+ | ; devuelve en AL 0 si no hay tecla | ||
+ | ; devuelve en AL 1 si hay tecla | ||
+ | IsKey PROC FAR | ||
+ | MOV AH,0BH | ||
+ | MOV AL,0H | ||
+ | INT 21H | ||
+ | RET | ||
+ | IsKey ENDP | ||
+ | |||
+ | |||
+ | ; Funcion que devuelve la tecla pulsada en AL | ||
+ | ; Accede al buffer del teclado y devuelve la tecla pulsada | ||
+ | ; Si se pulsa una tecla extendida se devuelve 0x00, y luego | ||
+ | ; habra que volver a llamar a la funcion para saber cual ha | ||
+ | ; sido la tecla pulsada | ||
+ | ReadKey PROC FAR | ||
+ | PUSH DX | ||
+ | MOV AH,06H | ||
+ | MOV DL,0FFH | ||
+ | INT 21H | ||
+ | POP DX | ||
+ | RET | ||
+ | ReadKey ENDP | ||
+ | |||
+ | |||
+ | ; Funcion que espera a que se pulse una tecla | ||
+ | ; momento en la que la devuelve en AL | ||
+ | GetKey PROC FAR | ||
+ | CALL IsKey | ||
+ | CMP AL,0 | ||
+ | JE GetKey | ||
+ | |||
+ | CALL ReadKey | ||
+ | RET | ||
+ | GetKey ENDP | ||
+ | |||
+ | TECLADOLIB ENDS | ||
+ | PUBLIC GetKey | ||
+ | END | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | Vemos que se trata de un archivo ''teclado.asm'' que tiene una declaración de un solo segmento (el de código). En ese segmento lo único que encontramos son procedimientos (funciones) y no hay programa principal, ni procedimiento principal. En la etiqueta END no se indica por donde se empieza a ejecutar ese código, de hecho, nunca se ejecutará ya que no llegará a ser un programa ''.EXE''.<br> | ||
+ | Podemos poner todos los procemientos que queramos o que sean necesarios, en el ejemplo hay tres:<br> | ||
+ | * IsKey | ||
+ | * ReadKey | ||
+ | * GetKey | ||
+ | Pero de los tres sólo será visible desde el exterior el ''GetKey'' dado que es el único que se ha hecho público con la directiva '''PUBLIC'''. Por lo tanto, los procedimientos que queramos que sean públicos tendrán que estar listados abajo con la etiqueta '''PUBLIC''' delante.<br> | ||
+ | <br> | ||
+ | Lo siguiente es ver como se compila un fichero fuente de librería. Los pasos son los siguientes: | ||
+ | * '''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. | ||
+ | * Una vez que se tiene el archivo '''teclado.lib''' se podrá compilar cualquier programa que use funciones de la librería con el comando: '''tlink /v program.obj teclado.lib''' | ||
+ | <br> | ||
+ | Veamos ahora un programa que usa esa librería (archivo program.asm)<br> | ||
+ | <pre> | ||
+ | ;/---------------------------------------------/ | ||
+ | ;/ Practicas de ETC-II UAM / | ||
+ | ;/ Andres Prieto-Moreno 21-oct-2008 / | ||
+ | ;/ ETC-II / | ||
+ | ;/ / | ||
+ | ;/---------------------------------------------/ | ||
+ | |||
+ | extrn GetKey:far | ||
+ | |||
+ | ; SEGMENTO DE DATOS | ||
+ | datosg SEGMENT | ||
+ | TEXTO DB "Pulse una tecla para salir",13,10,'$' | ||
+ | datosg ENDS | ||
+ | |||
+ | ; SEGMENTO DE PILA | ||
+ | |||
+ | stacksg SEGMENT STACK "STACK" | ||
+ | DB 400H DUP (0) | ||
+ | stacksg ends | ||
+ | |||
+ | |||
+ | ; CODIGO DEL PROGRAMA | ||
+ | |||
+ | codesg SEGMENT | ||
+ | assume cs:codesg, DS:datosg, SS:stacksg | ||
+ | |||
+ | |||
+ | ;======================= | ||
+ | ;= Programa princpal = | ||
+ | ;======================= | ||
+ | |||
+ | program proc far | ||
+ | ; Configuracion inicial de los registros | ||
+ | MOV AX,datosg | ||
+ | MOV DS,AX | ||
+ | |||
+ | MOV AX,stacksg | ||
+ | MOV SS,AX | ||
+ | |||
+ | MOV SP,0400H; | ||
+ | |||
+ | ; imprime mensaje | ||
+ | MOV DX, OFFSET TEXTO | ||
+ | MOV AH,9 | ||
+ | INT 21H | ||
+ | |||
+ | ; espera a que se pulse una tecla | ||
+ | CALL GetKey | ||
+ | |||
+ | |||
+ | fin: ; devuelve el control al DOS | ||
+ | MOV AX, 4C00H | ||
+ | INT 21H | ||
+ | |||
+ | program endp | ||
+ | |||
+ | codesg ends | ||
+ | end program | ||
+ | |||
+ | |||
+ | </pre> | ||
+ | |||
+ | Lo importante es que este código usa la función '''GetKey''' que pertenece a una librería externa. Por eso al principio del todo se ha indicado con la directiva '''extrn GetKey:far'''. Por lo demás el programa es como cualquier otro.<br> | ||
+ | La forma de compilar, considerando que la librería ya exista, sería:<br> | ||
+ | >tasm /zi program.asm <br> | ||
+ | >tlink /v program.obj teclado.lib <br> | ||
+ | En caso de que no exista la libreria habría que crearla con los pasos anteriores. Cualquier cambio en el código de la librería nos obliga a recompilar la librería y el programa principal. Por eso la utilización de ''Makefiles'' nos puede ahorrar mucho tiempo. | ||
+ | |||
+ | === Fichero Makefile === | ||
+ | |||
+ | La herramienta ''make'' nos permite simplicar la compilación de un programa, al permitir definir en un fichero una serie de reglas o pasos, para que a partir de una serie de archivos fuente se obtenga el fichero o ficheros ejecutables del proyecto.<br> | ||
+ | Dichas reglas se escribirán en un fichero llamado '''Makefile''' que será llamado por defecto al ejecutar el comando '''make'''<br> | ||
+ | Un ejemplo sencillo de ''Makefile'' es el siguiente:<br> | ||
+ | <pre> | ||
+ | |||
+ | test.exe: test.obj | ||
+ | tlink /v test.obj | ||
+ | |||
+ | test.obj: test.asm | ||
+ | tasm /zi test.asm | ||
+ | |||
+ | |||
+ | clean: | ||
+ | del *.obj | ||
+ | del test.exe | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | Se lee de la siguiente forma. Para generar el programa ejecutable ''test.exe'' necesitamos el fichero objeto ''test.obj'' y para ello se ejecuta el comando ''tlink /v test.obj''.<br> | ||
+ | En caso de que no exista el ''test.obj'' se buscará por el fichero la regla para construirlo. En este caso aparece más abajo y se interpreta: Para generar el ''test.obj'' se parte del ''test.asm'' y crea mediante el comando ''tasm /zi test.asm''.<br> | ||
+ | Por último tenemos una opción para borrar los pasos intermedios de la compilación y el resultado. Esto es útil cuando nos queremos asegurar que el proceso empiece desde el principio y que no use ningún ''.obj'' anterior. Se invoca haciendo:<br> | ||
+ | >make clean<br> | ||
+ | <br> | ||
+ | Veamos ahora otro ejemplo un poco más avanzado.<br> | ||
+ | <pre> | ||
+ | # Ejemplo de fichero Makefile avanzado | ||
+ | |||
+ | program.exe: program.obj teclado.lib | ||
+ | TLINK /V program.obj teclado.lib | ||
+ | |||
+ | .asm.obj: | ||
+ | TASM /ZI $< | ||
+ | |||
+ | .obj.lib: | ||
+ | TLIB $&.lib -+$< | ||
+ | |||
+ | clean: | ||
+ | del *.obj | ||
+ | del *.map | ||
+ | del *.exe | ||
+ | del *.lib | ||
+ | </pre> | ||
+ | |||
+ | Se lee de la misma forma que el anterior, pero ahora considera que hay una librería. Para generar el programa ''program.exe'' se necesitan los ficheros ''program.obj'' y la librería ''teclado.lib''. El comando para generar el ejecutable es ''tlink /v program.obj teclado.lib''<br> | ||
+ | El cambio viene ahora, en lugar de establecer reglas específicas para cada archivo, ponemos una global '''.asm.obj:''' que se traduce: Para generar cualquier ASM se parte de un OBJ y se ejuta el comando: '''TASM /ZI $<''' donde '''$<''' me indica el nombre del archivo ''.ASM'' que estamos intentanto pasar a ''.OBJ''<br> | ||
+ | La siguiente línea es igual, nos viene a decir que para generar una librería se parte del ''.obj'' y que el comando produce un archivo .lib con el nombre que estemos tratando en ese momento.<br><br> | ||
+ | Lo bueno de este Makefile, es que al estar parametrizado, con definir las dependencias del programa principal nos bastará, ya que la herramienta Make sabrá como generar cada una de ellas y sin haber necesitado especificarlas. | ||
= Descarga de archivos = | = Descarga de archivos = | ||
+ | ''' DosBox con acceso al puerto paralelo''' | ||
+ | * [http://www.iearobotics.com/wiki/images/7/79/DosBox-paralelo.zip DosBox.zip] archivo ZIP que contiene el DosBox/paralelo<br> | ||
+ | |||
+ | ''' Programas apoyo práctica 1''' | ||
+ | * [http://www.iearobotics.com/wiki/images/0/0e/EEPROM.zip eeprom.com] archivo ZIP que contiene el nuevo driver<br> | ||
+ | * [http://www.iearobotics.com/wiki/images/d/d2/Test.asm Test.asm] Comprobación de driver y funciones de conversión a HEX-ASCII<br> | ||
+ | * [http://www.iearobotics.com/wiki/images/0/0f/Makefile.simple.simple Makefile.simple] makefile simple<br> | ||
+ | * [http://www.iearobotics.com/wiki/images/0/0c/Makefile.avanzado Makefile.avanzado] makefile avanzado<br> | ||
+ | * [http://www.iearobotics.com/wiki/images/f/f7/Libreria.zip libreria.zip] Ejemplo creación y uso de librerías<br> | ||
+ | * [http://www.iearobotics.com/wiki/images/5/5f/Teclado.asm Teclado.asm] Fuentes de libreria con funciones del teclado<br> | ||
+ | <br> | ||
+ | ''' Programas apoyo práctica 2''' | ||
+ | * [http://www.iearobotics.com/wiki/images/f/f8/DRVMIO.ASM DRVMIO.ASM] Esqueleto de driver para la INT61H<br> | ||
+ | * [http://www.iearobotics.com/wiki/images/b/b6/Makefile Makefile] Ejemplo para compilar un programa .COM con depuración. | ||
+ | <!--* [http://www.iearobotics.com/wiki/images/2/27/RTC.ASM Rtc] Ejemplo de programa que configura y usa el RTC.--> | ||
+ | * [http://www.iearobotics.com/wiki/images/b/b6/PARAL.ASM Paralelo] Hace parpadear el LED de la mochila hardware (bit D3) | ||
+ | <!--* [http://www.iearobotics.com/wiki/images/f/ff/Test_driver_rtc.zip Test_driver_rtc] Programa de prueba para un driver que contiene y usa las funciones del RTC.--> | ||
+ | * [http://www.iearobotics.com/wiki/images/e/e0/Wire.zip Test_eewire] Programa de prueba de una memoria EEWIRE. | ||
+ | ''' Programas de apoyo práctica 3''' | ||
+ | * [http://www.iearobotics.com/wiki/images/5/5f/Makefile_P3_0809 Makefile_P3_0809] Ejemplo para compilar un programa con TCC y ASM. | ||
+ | * [http://www.iearobotics.com/wiki/images/7/71/Microw.zip Microw.zip] Driver de prueba. | ||
+ | * [http://www.iearobotics.com/wiki/images/f/f4/DUMP.C dump.c] Ejemplo de programa en C que llama a la libreria. | ||
+ | * [http://www.iearobotics.com/wiki/images/7/79/LIB.zip libreria_P3.zip] Esqueleto de la libreria (FAR MODE)<br> | ||
= Enlaces = | = Enlaces = | ||
* [http://arantxa.ii.uam.es/~gdrivera/labetcii/curso0809/practica.htm Web Oficial de la asignatura] | * [http://arantxa.ii.uam.es/~gdrivera/labetcii/curso0809/practica.htm Web Oficial de la asignatura] | ||
− | * [http://www.iearobotics.com/personal/andres/docencia/labetc/ Documentación de otros años] | + | <!--* [http://www.iearobotics.com/personal/andres/docencia/labetc/ Documentación de otros años]--> |
* [http://www.gui.uva.es/udigital/ Universo digital del PC] | * [http://www.gui.uva.es/udigital/ Universo digital del PC] |
Revisión actual del 16:21 28 oct 2009
Contenido
Ultima hora
Listados clase
Bugs
- (25-nov-2008) Esta semana os he comentado que había un problema con el ejemplo DRVMIO.ASM ya que a algunas personas les funcionaba y a otras no. El problema no estaba en el programa, estaba en el Makefile. El tema es que se estaba compilando como un .EXE aunque luego se renombraba a .COM.
La opción correcta para compilar es:
tasm /zi drvmio.asm
tlink /t /V drvmio.obj
(*) Si tenéis problemas para pasar los dos parámetros, usad el /t que es el que se encarga de generar el .COM
- (Oct-08) En el driver hay un error. Solo devuelve 128 posiciones de memoria. En la zona de descargas podeis encontrar una version que corrige el error (EEPROM.COM) y pronto estará en la web. (Por cierto el uninstall tampoco funciona por ahora)
Práctica 3
Publicados los ejemplos de la práctica 3.
Página Oficial
La práctica se puede probar usando el programa realizado en la práctica 1, el simulador. Pero se recomienda usar el driver real ya que se tendrá en cuenta para la nota.
Práctica 2
Pasos para realizar la práctica
- Empezar por la estructura básica del driver. Que se instale y que responda a la función STATUS, EESISE.
- Añadir la comunicación con el puerto paralelo. Añadir al driver el poder apagar y encender el LED. (Usar un programa aparte o la propia práctica 1 para activarlo y/o desactivarlo).
- Leerse la documentación de la memoria EE_WIRE (activación, función de inicio, lectura, escritura... cronogramas)
- Implementar la lectura / escritura en la memoria. Usar temporización pasiva (un bucle)
- Estudiarse el RTC
- Añadir la temporización con el RTC y quitar la pasiva.
La práctica se probará usando el programa realizado en la prática 1, por eso todos aquellos a los que les falte alguna funcionalidad la tendrán que añadir
Programas de ayuda
- Esqueleto de driver (instalar, parser,...). A completar con las funciones de acceso a la memoria por parte del alumno
- RTC (ejemplo del RTC). Usarlo para integrarlo en el driver, para ello completar el código con la teoría del RTC.
- Paral (ejemplo de uso del puerto paralelo). Usar el acceso para realizar el driver pedido.
- DosBox con acceso al puerto paralelo.
- Ejemplo de driver con RTC integrado
- Ejemplo de acceso a la memoria en lectura y escritura
Los programas anteriores se encuentran en la zona de descargas de esta página.
Práctica 1
Ayudas
- En la zona de descargas teneis un programa que se llama TEST.ASM que permite probar el driver. Para ello crea un fichero que se llama MEM2.BIN, lo rellena de datos y luego comprueba que se leen bien. Además los representa en ASCII en la pantalla.
- Os he dejado el archivo libreria.zip que contiene un ejemplo de libreria y makefile avanzado.
Resumen Objetivos Entrega
- Realización del programa Lector/Editor Hexadecimal
- Creación de librerias (teclado)
- Uso de los servicios de la BIOS y del DOS
- Detectar la correcta instalación de un driver en memoria
- Compilación usando Makefiles
Consejos Práctica 1
Pasos para la programación del Editor
1. Hacer la estructura del programa partiendo en uno de los ejemplos de la práctica 0
2. Comprobar que existe el driver: Tabla INT, 0CAFEH y STATUS
3. Leer toda la memoria y dejar los valores en un ARRAY en el programa principal.
4. Pinta esos datos en pantalla de forma ordenada: Necesaria función conversion de binario a representación hexadecimal en ASCII
5. Funciones de teclado (Por ejemplo usando Libreria) e implementación del cursor.
6. Meter inteligencia al cursor, de forma que sepa en que byte está en cada momento.
7. Meter funcionalidad de edición de valores.
8. Añadir resto de funciones. Scroll, CTRL-G, ...
Conviene usar Makefile desde el principio.
Librerías
Una librería mantiene una estructura muy parecida a la de un programa, pero con algunas características especiales:
1. 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.
2. Las funciones que queramos exportar o hacer visibles se declaran como PUBLIC en el archivo fuente de la librería.
3. Los programas que quieran llamar a esas funciones las tendrán que declarar como EXTERN
4. 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.
Veamos un ejemplo de librería (archivo teclado.asm):
;================================== ;= Ejemplo de libreria = ;================================== ;DEFINICION DEL SEGMENTO DE CODIGO TECLADOLIB SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:TECLADOLIB ; Funcion que mira si hay tecla pulsada ; Es equivalente a kbhit(); ; devuelve en AL 0 si no hay tecla ; devuelve en AL 1 si hay tecla IsKey PROC FAR MOV AH,0BH MOV AL,0H INT 21H RET IsKey ENDP ; Funcion que devuelve la tecla pulsada en AL ; Accede al buffer del teclado y devuelve la tecla pulsada ; Si se pulsa una tecla extendida se devuelve 0x00, y luego ; habra que volver a llamar a la funcion para saber cual ha ; sido la tecla pulsada ReadKey PROC FAR PUSH DX MOV AH,06H MOV DL,0FFH INT 21H POP DX RET ReadKey ENDP ; Funcion que espera a que se pulse una tecla ; momento en la que la devuelve en AL GetKey PROC FAR CALL IsKey CMP AL,0 JE GetKey CALL ReadKey RET GetKey ENDP TECLADOLIB ENDS PUBLIC GetKey END
Vemos que se trata de un archivo teclado.asm que tiene una declaración de un solo segmento (el de código). En ese segmento lo único que encontramos son procedimientos (funciones) y no hay programa principal, ni procedimiento principal. En la etiqueta END no se indica por donde se empieza a ejecutar ese código, de hecho, nunca se ejecutará ya que no llegará a ser un programa .EXE.
Podemos poner todos los procemientos que queramos o que sean necesarios, en el ejemplo hay tres:
- IsKey
- ReadKey
- GetKey
Pero de los tres sólo será visible desde el exterior el GetKey dado que es el único que se ha hecho público con la directiva PUBLIC. Por lo tanto, los procedimientos que queramos que sean públicos tendrán que estar listados abajo con la etiqueta PUBLIC delante.
Lo siguiente es ver como se compila un fichero fuente de librería. Los pasos son los siguientes:
- 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.
- Una vez que se tiene el archivo teclado.lib se podrá compilar cualquier programa que use funciones de la librería con el comando: tlink /v program.obj teclado.lib
Veamos ahora un programa que usa esa librería (archivo program.asm)
;/---------------------------------------------/ ;/ Practicas de ETC-II UAM / ;/ Andres Prieto-Moreno 21-oct-2008 / ;/ ETC-II / ;/ / ;/---------------------------------------------/ extrn GetKey:far ; SEGMENTO DE DATOS datosg SEGMENT TEXTO DB "Pulse una tecla para salir",13,10,'$' datosg ENDS ; SEGMENTO DE PILA stacksg SEGMENT STACK "STACK" DB 400H DUP (0) stacksg ends ; CODIGO DEL PROGRAMA codesg SEGMENT assume cs:codesg, DS:datosg, SS:stacksg ;======================= ;= Programa princpal = ;======================= program proc far ; Configuracion inicial de los registros MOV AX,datosg MOV DS,AX MOV AX,stacksg MOV SS,AX MOV SP,0400H; ; imprime mensaje MOV DX, OFFSET TEXTO MOV AH,9 INT 21H ; espera a que se pulse una tecla CALL GetKey fin: ; devuelve el control al DOS MOV AX, 4C00H INT 21H program endp codesg ends end program
Lo importante es que este código usa la función GetKey que pertenece a una librería externa. Por eso al principio del todo se ha indicado con la directiva extrn GetKey:far. Por lo demás el programa es como cualquier otro.
La forma de compilar, considerando que la librería ya exista, sería:
>tasm /zi program.asm
>tlink /v program.obj teclado.lib
En caso de que no exista la libreria habría que crearla con los pasos anteriores. Cualquier cambio en el código de la librería nos obliga a recompilar la librería y el programa principal. Por eso la utilización de Makefiles nos puede ahorrar mucho tiempo.
Fichero Makefile
La herramienta make nos permite simplicar la compilación de un programa, al permitir definir en un fichero una serie de reglas o pasos, para que a partir de una serie de archivos fuente se obtenga el fichero o ficheros ejecutables del proyecto.
Dichas reglas se escribirán en un fichero llamado Makefile que será llamado por defecto al ejecutar el comando make
Un ejemplo sencillo de Makefile es el siguiente:
test.exe: test.obj tlink /v test.obj test.obj: test.asm tasm /zi test.asm clean: del *.obj del test.exe
Se lee de la siguiente forma. Para generar el programa ejecutable test.exe necesitamos el fichero objeto test.obj y para ello se ejecuta el comando tlink /v test.obj.
En caso de que no exista el test.obj se buscará por el fichero la regla para construirlo. En este caso aparece más abajo y se interpreta: Para generar el test.obj se parte del test.asm y crea mediante el comando tasm /zi test.asm.
Por último tenemos una opción para borrar los pasos intermedios de la compilación y el resultado. Esto es útil cuando nos queremos asegurar que el proceso empiece desde el principio y que no use ningún .obj anterior. Se invoca haciendo:
>make clean
Veamos ahora otro ejemplo un poco más avanzado.
# Ejemplo de fichero Makefile avanzado program.exe: program.obj teclado.lib TLINK /V program.obj teclado.lib .asm.obj: TASM /ZI $< .obj.lib: TLIB $&.lib -+$< clean: del *.obj del *.map del *.exe del *.lib
Se lee de la misma forma que el anterior, pero ahora considera que hay una librería. Para generar el programa program.exe se necesitan los ficheros program.obj y la librería teclado.lib. El comando para generar el ejecutable es tlink /v program.obj teclado.lib
El cambio viene ahora, en lugar de establecer reglas específicas para cada archivo, ponemos una global .asm.obj: que se traduce: Para generar cualquier ASM se parte de un OBJ y se ejuta el comando: TASM /ZI $< donde $< me indica el nombre del archivo .ASM que estamos intentanto pasar a .OBJ
La siguiente línea es igual, nos viene a decir que para generar una librería se parte del .obj y que el comando produce un archivo .lib con el nombre que estemos tratando en ese momento.
Lo bueno de este Makefile, es que al estar parametrizado, con definir las dependencias del programa principal nos bastará, ya que la herramienta Make sabrá como generar cada una de ellas y sin haber necesitado especificarlas.
Descarga de archivos
DosBox con acceso al puerto paralelo
- DosBox.zip archivo ZIP que contiene el DosBox/paralelo
Programas apoyo práctica 1
- eeprom.com archivo ZIP que contiene el nuevo driver
- Test.asm Comprobación de driver y funciones de conversión a HEX-ASCII
- Makefile.simple makefile simple
- Makefile.avanzado makefile avanzado
- libreria.zip Ejemplo creación y uso de librerías
- Teclado.asm Fuentes de libreria con funciones del teclado
Programas apoyo práctica 2
- DRVMIO.ASM Esqueleto de driver para la INT61H
- Makefile Ejemplo para compilar un programa .COM con depuración.
- Paralelo Hace parpadear el LED de la mochila hardware (bit D3)
- Test_eewire Programa de prueba de una memoria EEWIRE.
Programas de apoyo práctica 3
- Makefile_P3_0809 Ejemplo para compilar un programa con TCC y ASM.
- Microw.zip Driver de prueba.
- dump.c Ejemplo de programa en C que llama a la libreria.
- libreria_P3.zip Esqueleto de la libreria (FAR MODE)