| Le prime 92
locazioni del PSP (da
0000H a 005BH)
sono a disposizione nostra e del programma per cui sono state create; sono
state scritte dal DOS nel momento in cui l'eseguibile è stato allocato in
memoria e non devono in alcun modo essere modificate. Vediamo la prima parte
di esse:
Offset |
N°
bytes°
|
Descrizione
|
0000
|
2
|
|
Contiene i 2 bytes
CDH,
20H, corrispondenti al codice
operativo dell'istruzione INT 20H
che, nella normale programmazione in ambiente 80x86, consente ai
programmi eseguibili di restituire il
controllo al DOS. |
|
La presenza di questi 2 bytes è un retaggio
del vetusto CP/M, un glorioso sistema operativo in
voga quando i personal computer dovevano ancora nascere; in quel
tempo per porre fine all'esecuzione di un programma e restituire il
controllo al sistema operativo era sufficiente eseguire l'istruzione
RET. |
|
Se si forza l'esecuzione di una RET
dall'interno dei nostri eseguibili scritti per 80x86 il processore
preleva coerentemente dallo stack l'indirizzo a cui tornare, dando
per scontato che qualcuno abbia provveduto a memorizzarlo in esso prima di eseguire la
RET; è facile prevedere cosa
succede se nessuno ha predisposto questo indirizzo: il processore
cede il controllo chissà a chi! e il computer probabilmente si
blocca. |
|
Invece no!
Proprio per venire incontro agli sprovveduti neofiti il progettista DOS ha mantenuto la possibilità di
tornare al prompt anche eseguendo RET, montando un meccanismo tanto
semplice quanto diabolico: |
|
-
il loader, subito dopo aver creato il PSP (proprio ciò di cui ci
occupiamo in queste pagine), scrive i valori 00H
nelle ultime locazioni del segmento riservato al programma, cioè
quelle puntate da FFFEH, e
obbliga il registro SP a puntarle. |
|
- è chiaro, dunque, che
l'eventuale esecuzione di una RET (illogica nella norma) obbliga il
processore a prelevare il contenuto corrente dello stack, appunto
l'indirizzo 0000H, e a saltarci;
poiché l'indirizzo 0000H è
proprio l'inizio del PSP , se in quelle locazioni sono presenti i
bytes CDH,
20H, il processore eseguirà una
INT 20H restituendo il controllo al DOS. |
|
MAGIA:
con un RET ho comunque eseguiti
l'istruzione
INT 20H e sono comunque tornato
al DOS. |
|
0002
|
2
|
|
Contiene l'indirizzo in paragrafi del primo
paragrafo libero nella ram del computer (per esempio 9FFFH), cioè
l'indirizzo di segmento della memoria aldilà dei blocchi allocati
per il programma; l'esempio suggerito (per altro letto dal prefisso
di un eseguibile, dopo la sua allocazione) indica che il Dos ha
destinato al programma tutta la ram disponibile. |
|
L'indirizzo fisico della prima
locazione libera si ottiene moltiplicando questo numero per 16; nel
nostro esempio vale 9FFF0H,
proprio a ridosso della Ram Video Grafica, il che ribadisce che
tutta la memoria è stata assegnata al programma. |
|
Non dimenticare che, comunque, taluni programmi usano anche locazioni alte
di memoria, il ché‚ rende inattendibile questo valore; se
desideri avere maggiori certezze conviene riferirsi alle
funzioni DOS 48H (Allocate Memory),
49H (Free Allocated Memory)
e 4AH (Modify Memory Allocation). |
|
0004 |
1 |
|
Byte riservato al DOS, di norma a 00H.
|
|
0005
|
1 |
|
Contiene il codice
operativo dell'istruzione CALL FAR
(cioè 9AH) il ché fa presumere
che i successivi 4 bytes siano pronti ad ospitare i 4 bytes di
un indirizzo logico completo, segment:offset,
naturalmente scritti con la logica Lo-Hi, cioè in sequenza parte
passa e parte alta dell'offset,
parte bassa e parte alta del segment,
per esempio 9A F0FE 1DF0 per
CALL F01D:FEF0). |
|
Si tratta di un'altra paranoia intesa a facilitare la chiamata di una procedura lontana con una struttura preconfezionata; la letteratura parla di
struttura per implementare la chiamata di una funzione DOS
(INT 21H) intendendo che l'operando sia quello della procedura di servizio delle funzioni DOS. |
|
0006 |
2 |
|
Se riferita alla definizione data
all'offset 0005 si tratta
dell'indirizzo di offset dell'operando dell'istruzione CALL
FAR. |
|
Il valore di default indica
però anche la quantità di memoria (in bytes)
ancora utilizzabile nel segmento dal programma fino a
FFF0H (sedici bytes prima del termine del
segmento), per esempio FEF0H. |
|
0008 |
2
|
|
Se riferita alla definizione data
all'offset 0005 si tratta
dell'indirizzo di segment dell'operando dell'istruzione CALL
FAR. |
|
Altrimenti i 2 bytes sono da
ritenersi riservati. |
|
|