390 likes | 483 Views
CLASE 19 BIBLIOTECAS Y ARCHIVOS DE INCLUSIÓN. Ya se ha visto que, para ayudar en la estructuración de un programa, están disponibles dos utilidades: procedimientos y macros .
E N D
Ya se ha visto que, para ayudar en la estructuración de un programa, están disponibles dos utilidades: procedimientos y macros. Sin embargo, esto no soluciona otro problema que continúa en los archivos grandes, y es que el tiempo que se requiere para su desarrollo aumenta exponencialmente ante un crecimiento lineal del programa:
Tiempo de Desarrollo Tamaño del Archivo Tiempo de Desarrollo de un Programa en función del Tamaño del archivo:
Esto se debe a que todas las actividades se tardan más en desarrollar para un archivo grande que para uno pequeño. En primer lugar, el tiempo de edición, ensamblaje, enlace y carga aumenta. En segundo lugar, el tiempo que gasta el programador para manipular, entender y depurar un programa grande también aumenta. Multiplicando estos factores aparece la alinealidad de la relación tiempo versus tamaño.
Se desea, entonces, hallar formas de reducir este tiempo. Para ello, se parte de las siguientes reflexiones: Manipular archivos pequeños es mejor y más rápido que manipular archivos grandes, tanto para la máquina como para las herramientas como para el programador.
No es inteligente reensamblartodoun archivo para detectar si una nueva línea de código es correcta. Lo correcto sería reensamblar sólo el procedimiento al cual pertenece. Ambas reflexiones llevan a deducir que la clave para optimizar el proceso de desarrollo consiste en fraccionar un programa grande y manejar cada porción con cierta independencia.
El proceso de fraccionarun archivo grande en otros menores y trabajar con cada uno por separado se denomina proyecto. Aquí, el archivo fuente se divide en varios subarchivos y cada uno de ellos se ensambla para obtener un módulo, los módulos se fusionan para lograr el archivo ejecutable correspondiente al fuente original. PROYECTO:
Archivo 1 Módulo 1 Archivo 2 Módulo 2 . . . . . . Archivo n Módulo n Particionado Ensamblaje Enlace Gran Programa Archivo Ejecutable
La primera pregunta que surge es cómo partir el programa. Lo recomendable aquí es hacer que cada archivo contenga un grupo dado de procedimientos, en lo posible relacionados entre sí. Si tal archivo se le pasa al ensamblador, éste genera el archivo objeto correspondiente, que se conoce como un módulo.
Lo importante de este mecanismo es que el ensamble de un archivo que sea sintácticamente correcto se hace sólo una vez. El módulo obtenido queda entonces listo para enlazarse con otros módulos, de esta forma, el tiempo de ensamble se reduce, de ensamblar todo el proyectoa ensamblar sólo el móduloen el cual se está trabajando actualmente.
Para que esto funcione se requiere solucionar un nuevo problema: ¿Qué debe hacer el ensamblador cuando un procedimiento invoque a otro procedimientoque está en otro archivo?
Proyecto Archivo 1 proc1 proc1 call proc2 call proc2 Archivo k proc2 proc2
Dado que un procedimiento se identifica por su dirección de inicio, el ensamblador en realidad no necesita saberen qué archivo está el procedimiento llamado. Sólo necesita saber queen alguna parteexiste. Es labor del enlazadorubicar su dirección real y remplazarla cuando genere el archivo ejecutable. Dos directivas del ensamblador ayudan a esta labor:
EXTRN = External. Indica que el elemento que sigue es declarado externamente al archivo. Aplicable a procedimientos y variables. PUBLIC = El elemento mencionado (procedimiento o variable) va a ser usado fuera del archivo en que se crea, es decir, es un elemento público. EXTRN Y PUBLIC:
Las variables y procedimientos externos deben declararse al comienzo del archivo indicando su tamaño (variables) o su alcance (procedimientos), siguiendo la sintaxis: EXTRN variable:TAMAÑO EXTRN procedimiento:ALCANCE EXTRN:
Las variables o procedimientos que quieran hacerse públicos deben declararse como tales al comienzo del segmentoal cual pertenecen, de la forma:PUBLIC variable PUBLIC procedimiento PUBLIC:
Aplicado al ejemplo anterior, la convención sería: Archivo 1 Archivo k EXTRN proc2:NEAR PUBLIC proc2 proc1 proc2 call proc2
La directiva EXTRN le dice al ensamblador que proc2existe en alguna parte externa al archivo actual, así que suponga que existe y deje su dirección vacía para que sea llenada por el enlazador. La directiva PUBLIC instruye al ensamblador para que genere una tabla en el módulo objeto con las direcciones de todos los elementos declarados públicos. Dicha tabla será útil para que el enlazador pueda unir las partes.
Labores que hace el Ensamblador: EXTRN proc2:NEAR ??1 = proc2 proc1 call ??1 call proc2 proc2 = 125H:14H PUBLIC proc2 proc2 proc2
??1 = proc2 call ??1 proc2 = 125H:14H proc2 Labores que hace el Enlazador: call 125H:14H
El esquema dado es útil, pero adolece de dos inconvenientes: a. Debe recordarse cuáles son todos los procedimientos que son externos y declararlos como tales al inicio del archivo. b. El enlazador fusiona los módulos completos uno tras otro, ya sea que los procedimientos que existen en ellos se usen o no.
Ambos problemas se han ya solucionado y dan justamente título a esta conferencia: los archivos de inclusión y las bibliotecas. Archivos de inclusión y Bibliotecas:
Es un archivo tipo texto asociado con un módulo y que puede contener tres clases de información: Declaración de constantes. Declaración e implementación de macros. Declaración de procedimientos. ARCHIVO DE INCLUSIÓN:
La directiva INCLUDE instruye al ensamblador para que incluya o añada el contenido del archivo indicado al archivo actual antesde hacer el ensamblaje del conjunto. Normalmente, los archivos de inclusión se identifican con la extensión .INC.
A continuación se muestra un ejemplo donde aparecen los tres archivos fuentes típicos en un programa fragmentado en varios archivos: El archivo de inclusión (macros y prototipos de procedimientos) El archivokfuente (código de los procedimientos del fragmento k-ésimo) El archivo de proyecto, donde se invocan los procedimientos
; Archivo FILES.INC: ; Constantes TOTALMASK EQU ”*.*” ;MacrosfDIR MACRO MSK . . . ENDM ; Declaración de procedimientos disponiblesEXTRN pDIR:NEAR
; Archivo FILES.ASM: ; Hacer públicos los procedimientos PUBLIC pDIR ; Código de los procedimientos pDIR PROC NEAR . . . pDIR ENDP
; Archivo MYPROJ.ASM: ; Incluir el archivo de definiciones INCLUDE FILES.INC ; Pueden invocarse las macros, . . . ; . . . usar las constantes declaradas . . . ; . . . y acceder a los procedimientos fDIR TOTALMASK
Algunos programadores equivocadamentecolocan procedimientos dentro de los archivos de inclusión. Aunque esto no genera ningún error y produce archivos correctos, va en contra del propósito original de estos archivos, puesto que el ensamblador debe reensamblar el código de tales procedimientos constantemente. Al ubicarlos aparte de él tal reensamblaje no se requiere.
Esto equivale al error de ubicar funciones de C en los archivos cabecera invocados con la sentencia #include “filename.h”
Es un archivo similar a un módulo (código objeto) que, además, tiene una tabla donde se indica el nombre y la ubicación dentro del archivo de cada uno de los procedimientos que éste contiene. BIBLIOTECA DEPROCEDIMIENTOS:
Esa tabla, al ser usada por el enlazador, le permite añadir al archivo ejecutable sólo los procedimientos que se están usando en el proyecto actual. Ahora se muestra gráficamente la idea planteada:
LIBRARY.LIB LIBRARY.OBJ manejadordebibliotecas proc1=100proc2=350proc3=720 proc1 proc2 100 proc1 proc3 350 proc2 720 proc3
MYPROJ.ASM MYPROJ.OBJ EXTRN proc2:NEAR ??1 = proc2 call proc2 call ??1 ensamblador
proc1=100proc2=350proc3=720 100 proc1 350 proc2 720 proc3 ??1 = proc2 call ??1 call proc2 Enlazador
Es común que el fabricante del ensamblador suministre una utilidad adicional para que el programador construya y dé mantenimiento a sus bibliotecas. MANEJADOR DEBIBLIOTECAS (LIBRARY MANAGER):
Las opciones comunes a estas utilidades suelen ser: + = añadir módulo a la biblioteca (también usado para crear una biblioteca nueva) - = borrar módulo de la biblioteca * = extraer módulo sin borrarlo -+ = remplazar un módulo existente -* = extraer módulo y borrarlo
¿Cómo se utiliza el ensamblado condicional y qué opciones tiene?. PREGUNTA 19: