(Incompleto) DIFFERENZE TRA I FILE COM ED EXE

(tratto dal sito:http://www.giobe2000.it/Tutorial/Indice/Home.asp)

Struttura dell'HEADER nei file EXE

L

Struttura del prefisso di segmento di un programma

(tratto da: http://www.giobe2000.it/Tutorial/Schede/05-PSP/501.asp)

Il PSP è un'area di memoria di 256 bytes collocata all'inizio del segmento destinato (dal loader del dos) ad un programma eseguibile, nel momento del suo caricamento in memoria.
Quando il Loader del DOS è chiamato ad allocare memoria per un programma eseguibile, riserva per esso almeno un intero segmento (65526 locazioni consecutive) e imposta tutti i registri di segmento, CS, DS, ES e SS in modo che puntino a tale area.

Nelle prime locazioni di questo segmento, a partire cioè dall'indirizzo di offset 0000H, predispone il PSP.

Nelle prime 92 locazioni, al di sotto dell'offset 005CH, abbiamo dati gestionali molto importanti, come:
- l'indirizzo a cui verrà ceduto il controllo quando il programma ha termine,
- gli indirizzi delle procedure di servizio relative agli errori critici e alla combinazione di tasti Ctrl-C,
- il puntatore alle stringhe AsciiZ dell'Environment (ambiente) che DOS utilizza per passare informazioni al programma.
Per questa ragione è fortemente sconsigliato alterare il contenuto del PSP, almeno al fino a questo indirizzo.

Il contenuto delle rimanenti 164 locazioni non è indispensabile: sono sostanzialmente dei buffer di servizio utilizzabili dal nostro programma, ufficialmente per il trasferimento di dati verso o da la memoria di massa, per altro con tecniche ormai obsolete.
Ciò significa che in determinate condizioni questa parte del prefisso può essere recuperata al programma, specialmente quando esso deve rimanere residente (TSR).

Solitamente il programma (codice e dati) viene caricato subito dopo il PSP, a partire, quindi, dalla locazione 0100H, almeno per gli eseguibili intrasegmentali, cioè di tipo COM: in questo caso il contenuto dei registri di segmento non viene modificato, cioè puntano ancora tutti l'inizio del PSP; i 4 segmenti sono dunque fisicamente sovrapposti.
In un programma tipo EXE può capitare invece che la sua intestazione (header) suggerisca al loader di cambiare l'indirizzo di partenza del codice (comunque puntato da CS:IP) lasciando in IP ad un valore diverso da 0100H; in questo caso può succedere che CS e SS assumano valori diversi da quelli inizialmente predisposti, uguali a DS e ES.

In ogni caso DS e ES continuano dunque a puntare all'inizio del PSP.

Nelle prossime pagine la scheda affronta i dettagli del Prefisso del Segmento di Programma; ecco l'elenco degli argomenti:

Caricamento di un file COM

L'allocazione in memoria di questo tipo eseguibile è di gran lunga meno impegnativa di quella relativa ad un programma EXE; vediamo in dettaglio le fasi di allocazione di un COM da parte del loader del Dos:
1) localizza il più grande blocco di memoria libero in memoria Ram, la cui dimensione supera di almeno 258 bytes la dimensione del file COM.
2) crea nei primi 256 byte un Prefisso di Segmento di programma (PSP). Inserisce nei primi due byte il valore CD20h che corrisponde all'istruzione INT 20h (termine programma e ritorno il controllo al dos)
3) copia tutto il contenuto del file COM subito dopo il PSP.
4) carica l'indirizzo del segmento associato all'area di memoria prescelta in tutti e 4 i registri di segmento. I 4 segmenti sono dunque fisicamente sovrapposti.
5) carica il registro SP con il valore FFFEH, in modo da puntare al penultimo byte del segmento.
6) carica negli ultimi 2 bytes del segmento il valore 0000H; si tratta di una contorta azione di sicurezza: infatti il puntatore di stack sta puntando proprio a questi 2 bytes. L'eventuale esecuzione di un'istruzione
RET mentre il programma sta girando, forza l'assegnazione di questo valore 0000H nell' IP (un RETN equivale a un POP IP), obbligandolo ad eseguire l'istruzione all'indirizzo 0:0 ovvero INT 20H che chiude l'esecuzione del programma e restituisce il controllo al Dos.
7) carica il registro IP con il valore 0100h, tipico entry-point dei programmi COM
8) cede il controllo al codice macchina del file COM e il programma comincia a girare in memoria.

CARICAMENTO IN MEMORIA DI UN FILE COM  
C:\trans>debug video.com
-
r
AX=0000 BX=0000 CX=0025 DX=0000 SP=
FFFE BP=0000 SI=0000 DI=0000
DS=17C1 ES=17C1 SS=17C1 CS=17C1
IP=0100 NV UP EI PL NZ NA PO NC
17C1:0100 E81B00 CALL 011E
-
d 0000 L10
17C1:0000
CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 14 12 8A 03 . ........O.....
-
d FFF0 L10
17C1:FFF0 00 00 00 00 00 00 00 00-00 00 00 00 00 00
00 00 ................
-