Practica 0 ETC 2 Objetivos: Escribir un programa en ensamblador Intel 8086. Conocer la estructura básica de un programa en ensamblador de Intel 8086. Conocer el ciclo de programación de un programa ASM. Conocer las herramientas de programación de Borland: TASM, TLINK,TD. Conocer como se incluye un programa compilado (.OBJ) en una biblioteca y como se utiliza. Conocer TLIB de Borland. Requisitos para la Practica 0 ETC 2 (conocimientos de los alumnos que se necesitan antes de la practica). Conocimiento de la arquitectura básica del 8086. - Registros - Memoria. Segmentos. - Modos de direccionamiento. Conocimiento del ensamblador i86: Directivas: Comentarios, SEGMENT, ENDS, PROC,ENDP, ASSUME, PUBLIC, EXTRN,END. Declaraciones: DW, DB DB 40 DUP (?). Interacción básica con DOS (tal como está en las paginas WEB). Teclado, Consola, Terminación del programa. Estructura de un programa ASM Estructura mínima: A SEGMENT INT 20h A ENDS END La estructura en nivel mas alto: <nombre segmento> SEGMENT <atributos del segmento> ..... contenido del segmento <nombre segmento> ENDS <nombre segmento> SEGMENT <atributos del segmento> ..... contenido del segmento <nombre segmento> ENDS <nombre segmento> SEGMENT <atributos del segmento> ..... contenido del segmento <nombre segmento> ENDS END <princ. del programa> La estructura del contenido de un segmento: <declaraciones> <nombre proc> PROC <atributos de procedimiento> ... instrucciones <nombre proc> ENDP En un buen programa: No hay instrucciones ejecutables fuera del PROC. No hay mezclas innecesarias de datos e instrucciones. Esta bien estructurado. Hay comentarios obligatorios antes de cada PROC, SEGMENT y módulo. Los comentarios del programa contienen: Autor, fecha, organización, titulo, breve descripción, símbolos exportados e importados, si el programa esta limitada a un sistema operativo o maquina. Los comentarios del segmento describen el contenido de cada segmento, si está vacío, etc. Los comentarios del PROC contienen: Que hace, Donde están los argumentos entrada (registros, pila etc.). Donde esta el resultado (registros, pila memoria etc.). Que efectos laterales produce: En particular si se trata de un programa ASM – lista de todos los registros que pueden cambiar. Con 8086 especial atención requieren los registros de segmentos (DS,ES,SS,CS) y los FLAGS D e I. (STD,STI ...). Que recursos del sistema y del SO utiliza. Problemas de resolver en esta practica: Obligatorio: Escribir una función que convierte un numero en AX a una cadena de símbolos ASCII en la memoria que se apunta en ES:DI. CL contiene el numero de los decimales. Si CH es 0, AX se escribe sin signo y con ceros al principio; si CH es 1, AX se escribe con signo ‘+’ o ‘-‘ y con 5 dígitos. No obligatorio: Sustituir todos los ceros al principio antes de la coma decimal con espacio. Obligatorio: Incluir las funciones en una biblioteca, exportando los símbolos necesarios. Obligatorio: Escribir un programa principal, que utilizando la función de conversión, escribe el código ASCII que uno teclea multiplicado por 1,23. Por ejemplo: si el código ASCII es 64 la salida del programa será 78,72=64*1.23. Enlazar el programa principal con la biblioteca y comprobar el programa. Bibliotecas: Para que sirven: Para agrupar muchos ficheros OBJ en un solo fichero. Facilita la reutilización del código. Estructura mejor el programa, siendo por ello imprescindible al escribir proyectos grandes. Normalmente es mucho mas independiente de otros módulos que una colección de ficheros OBJ. Contenido de un fichero LIB. En su versión más simple es una colección de ficheros OBJ. Para encontrar más fácilmente los símbolos que definen sus componentes se añaden estructuras extras. (Para los curiosos, leer las paginas man de ar de UNIX). Puesto que cada SO o compilador proporciona herramientas para el manejo de bibliotecas, el conocimiento de la estructura interna no es importante. Como se utiliza TLIB (ESSENCIAL LIB): Añadir un fichero OBJ (MYPROG.OBJ) a una biblioteca MYLIB.LIB y crearla si no existe: TLIB MYLIB +MYPROG Borrar un fichero OBJ (MYPROG.OBJ) de una biblioteca (MYLIB.LIB). TLIB MYLIB -MYOBJ Sustituir un fichero OBJ (MYPROG.OBJ) de una biblioteca con su nueva versión. TLIB MYLIB -+MYOBJ Nota: El orden -+ es importante. Comprobar si la biblioteca esta es correcta: TLIB MYLIB. Como se utiliza una biblioteca: Si el modulo que necesita una biblioteca se llama por ejemplo MYMAIN.OBJ y la biblioteca MYLIB.LIB, entonces podemos escribir: TLINK MYMAIN MYLIB.LIB Esto en una pagina aparte. Preguntas para comprobar los requisitos: Cada pregunta puede tener múltiples respuestas correctas: 1.1. ¿Qué significa la línea? END START 1. Fin del programa. El programa arranca desde START. 2. Es un error porque falta un tabulador antes de END. 3. Fin del programa. START se ignora. 1.2. ¿Qué significa la línea? PROC NEAR 1. Es un error. 2. El procedimiento tiene un tamaño menor de 64K. 3. Las llamadas del procedimiento se compilan como CALL NEAR y no como CALL far. 1.3. ¿Qué significa? MYPROC PROC NEAR MY_LABEL: NOP MYPROC ENDP ... CALL MY_LABEL ... 1. 2. 3. Es un error, porque no termina en RET. El compilador da un mensaje de error. Es un error, porque MY_LABEL no es visible fuera de MYPROC. El compilador da un error. Es una construcción correcta. El ensamblador no da ningún error. 1.4. ¿Qué significa? CODE SEGMENT NEAR 1. 2. 3. Es un error. Un segmento con tamaño máximo de 64K. Un segmento con procedimientos de tipo NEAR. 1.5. ¿Qué significa? CODE SEGMENT PUBLIC ‘CODE’ (texto libre). 1.6. ¿Cuál es el valor del offset de SEGUNDO? CODE SEGMENT PARA ORG 100h PUSHF CODE ENDS DATA SEGMENT PARA BUFER DB 256 DUP (?) DATA ENDS CODE SEGMENT NOP SEGUNDO: INT 20H CODE ENDS END 1. 2. 3. 4. 5. Es un error, porque el segmento CODE se define 2 veces. 111h 102h 202h 212h 1.7. ¿Cuál es el offset de SEGUNDO? FIJO SEGMENT AT 40h ORG 100h DW 10h DUP (2,4) SEGUNDO DW 5 FIJO ENDS 1. 2. 3. 4. 102h 104h 120h 110h 1.8. ¿Qué significa ASSUME? DATA SEGMENT XX DW 0 DATA ENDS DATA1 SEGMENT ... DATA1 ENDS ... ASSUME ES:DATA, DS:DATA1 ... 1. 2. 3. Asignación a ES del valor del segmento DATA. A partir de este momento el compilador compila todas las referencias a XX con el segmento ES. Todas las referencias a XX que utilizan DS por defecto van a compilarse como SEG ES Instrucción. 1.9. ¿Qué significa ASSUME DS:NOTHING? (texto libre). 1.10. ¿En qué casos es apropiado utilizar ASSUME? 1. 2. 3. 4. Al cambiar un registro de segmento. Al declarar un segmento. Al llamar a una función FAR. Al llamar a una interrupción que cambia un registro de segmento. 1.11. ¿Cuál es el valor del offset de SEGUNDO? ORG 100h AAA PROC NEAR PRIMERO: NOP RET AAA ENDP DW 2 DUP (10h) AAA PROC NEAR SEGUNDO: RET AAA ENDP 1. 2. 3. 4. Es un error, porque AAA se define 2 veces. 102h 104h 112h 1.12. Cuales de las funciones podemos llamar de otros módulos: EXTRN DDD:FAR CODE SEGMENT PUBLIC ‘CODE’ AAA PROC NEAR .... AAA ENDP BBB PROC FAR .... BBB PROC FAR CODE ENDS ..... CODE1 SEGMENT PUBLIC ‘DATA’ CCC PROC FAR ..... CCC ENDP CODE1 ENDS PUBLIC AAA PUBLIC CCC END AAA 1. 2. 3. 4. 5. Ninguno AAA BBB CCC DDD