Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Capitolo 2

Home » Programma il Computer » Tutorial Assembly

Capitolo 2 - Gli strumenti di lavoro

  Gli strumenti di Lavoro

LINKER 8/10 [44 di 87] 

    

    Come viene trattato il file EXE dal Loader del Dos?
     
bulletUna importante caratteristica dei files EXE consiste nel poter disporre di una quantità di memoria grande fino a 4 segmenti: poiché ciascuno di essi copre un'area di 64 kBytes i files EXE sono in grado di gestire fino a 256 kBytes.

      

bulletI 4 segmenti sono, di solito, associati al codice (e puntati con CS), allo stack (SS), ai dati (DS) e ad altri dati extra (ES); in ogni caso devono essere presenti almeno il segmento di codice e quello di stack.

      

bulletPur non essendo possibile derogare a questa regola, la dimensione di un EXE può talvolta essere anche più grande di 256k: questo è possibile per la possibilità di applicare la tecnica degli Overlay che consente di occupare la memoria in dotazione con pezzi di programma (overlay) di volta in volta diversi, in funzione delle esigenze contingenti, rigorosamente al posto di altri; gli overlay (copertura) sono dunque parti di codice alternative, contenute comunque nell'EXE, così da portare la dimensione di questi ultimi a valori maggiori di 256k.

      

bulletVediamo in dettaglio le fasi di allocazione di un EXE da parte del loader del Dos:
bulletlegge in memoria i primi 27 bytes dell'header (Informazioni di controllo).
NB: le citazioni agli offset,  indicate nei punti seguenti sono riferire a questa parte dell'header.
bulletriserva (alloca) una porzione di memoria in funzione della dimensione del modulo caricabile e dei numeri di allocazione (offset 000A e offset 000C). In ogni caso il Dos tenta di allocare 65536 paragrafi (FFFFH), pari ad un gigaBytes di memoria e, non essendo (ovviamente) in grado di farlo, riceve (da se stesso, cioè dalle sue funzioni) tutta la memoria attualmente libera. Se è più grande della minima necessaria  (cioè quella del programma caricato più quella indicata dall'offset 000A, MinimunAllocation) il Dos alloca la quantità specificata all'offset 000C, MaximunAllocation; in alternativa allocherà la maggior quantità possibile.
bullet crea un Prefisso di Segmento di programma (PSP).
bulletdetermina la lunghezza del modulo caricabile (cioè quella del programma, al netto dell'header stesso) sottraendo la dimensione dell'header (offset 0008, HeaderParagraphs) da quella del file (offset 0004, PageCount) ed aggiustandola verso il basso in funzione del valore dell'offset 0002, LastPageSize.
bulletcarica il modulo caricabile subito dopo il PSP.
bulletlocalizza l'inizio della Tabella di Rilocazione (offset 0018, StartOfRelocationTable): analizza le sue voci, cioè tutti i riferimenti ai registri di segmento presenti nel modulo caricabile, e provvede a ricalcolarne il valore in funzione del valore della voce e di quello del segmento in cui viene caricato il modulo; il risultato viene sostituito a quello irrisolto, nel modulo stesso.
bulletcarica i registri di segmento DS e ES in modo da puntare il PSP (e quindi all'inizio del primo segmento trovato libero); poiché i dati del nostro programma sono inseriti in segmenti solitamente diversi da questo, il programmatore deve provvedere a scrivere le istruzioni necessarie ad obbligare il processore (in run-time) a puntare le zone dati ed extra-dati effettive.
bulletcarica la coppia CS:IP in modo da puntare all'interno del segmento di codice sulla base delle indicazioni lasciate dal Linker per CS all'offset 0016, InitialCS, e per IP all'offset 0014, InitialIP (a sua volta impostate dall'assemblatore a partire dal valore dell'etichetta d'indirizzo (per esempio INIZIO) scritta subito dopo la direttiva END).
bulletcarica la coppia SS:SP in modo da puntare all'interno del segmento di stack sulla base delle indicazioni lasciate dal Linker per SS all'offset 000E, InitialSS, e per SP all'offset 0010, InitialSP (a sua volta impostate dall'assemblatore a partire dal valore dell'etichetta STACK scritta subito dopo la direttiva SEGMENT).
bulletnaturalmente segnala errore se la memoria disponibile non è sufficiente a contenere il nostro modulo caricabile, sempre con l'aiuto delle tabelle dell'header (minimum load size, dimensione minima di caricamento).
bulletquando tutto questo è stato portato a termine cede il controllo al modulo eseguibile EXE e il programma comincia a girare in memoria...

    

Pagina Precedente Capitolo 2 Pagina Successiva LINKER 8/10   Torna alla Home  del Capitolo1 del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
44 di 87
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

    

CAP 2 » 1. Catena di Compilazione 2. Editor 3. Assemblatore 4. Linker 5. Exe2Bin
6.
Ambiente di Lavoro 7. Gestore d'Ambiente Macro 8. Gestore d'Archivi OG
9. Matrici per i Programmi Sorgente 10. Gestore di Librerie Lib 
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati