Practica 0 ETC 2

Anuncio
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
Descargar