| La disponibilità di un solo segmento obbliga il Sistema Operativo a prendere provvedimenti, al fine di assicurare tutte le strutture di solito necessarie nella normale esecuzione del codice macchina; in particolare:
| assicura la presenza di uno stack,
riservando ad esso la parte finale dell'unico segmento e inizializzando a
queste locazioni il puntatore SS:SP. Sebbene, in generale, la presenza
di un meccanismo che tende a scrivere la
memoria indietro non provochi particolari disagi,
l'uso di questa struttura deve stimolare una
grande attenzione .. |
| assicura la presenza del prefisso di
segmento di programma (PSP)
riservando ad esso le prime 256 locazioni del segmento; per questo è
necessario scrivere la pseudoOperazionne
ORG
0100H all'inizio del
nostro sorgente (0100H = 256) |
| la conseguenza logica è che il codice
eseguibile di un programma COM inizia sempre all'offset
0100H, dentro il
segmento che lo ospita: per questo il Sistema Operativo provvede a caricare questo valore nel puntatore di programma
(IP). |
| gli eventuali dati del programma non
potendo disporre di un proprio segmento, devono essere inclusi nel
segmento di codice; di solito la tecnica utilizzata è quella di
inserire la zona delle variabili tra un'istruzione di salto
al Main Program (espressa nel programma sorgente
come prima istruzione) e le
istruzioni del Main Program stesso:
_prog
SEGMENT BYTE PUBLIC 'CODE'
ASSUME
CS:_prog,DS:_prog
ORG 0100H
INIZIO: JMP Main
ATTRIB
DB 0FH ;zona dei dati
dato Dw 1278H ;
|
Main: MOV
AL,CS:[ATTRIB]
MOV
AH,,4CH
INT
21H
_prog
ENDS
END INIZIO
|
|
|
| La struttura dei COM
è certamente molto semplice: questo è un vantaggio perchè si presenta in
modo compatto e veloce da caricare in memoria, ma per altri versi evidenzia
le sue limitazioni; in ogni caso se nella cartella sono presenti 2 files
con lo stesso nome, rispettivamente con estensione COM
e EXE, viene sempre
eseguito il primo! Il confronto delle dimensioni dei nostri programmi
pilota, prima e dopo la cura di Exe2Bin, la dice lunga:
PROVA.EXE
|
782 |
15/08/01 |
18.57 |
|
PROVA1.EXE
|
793 |
16/08/01 |
12.37 |
PROVA.COM |
14 |
15/08/01 |
18.58 |
|
PROVA1.COM |
25 |
16/08/01 |
12.37 |
|
| Per levarci la curiosità di vedere il valore
dei 14
bytes di Prova.COM e dei 25
bytes di Prova1.COM non è necessario
usare DiskEdit (come per gli
EXE);
basta Debug:
C:\ARCH-LAB\LAVORO>
debug prova.com |
-d
100
0100 B4 00 B0 03 CD 10 B4 00 CD 16 B4 4C CD 21 |
-u 100
0100 B400 MOV AH,00
0102 B003 MOV AL,03
0104 CD10 INT 10
0106 B400 MOV AH,00
0108 CD16 INT 16
010A B44C MOV AH,4C
010C CD21 INT 21 |
C:\ARCH-LAB\LAVORO>
debug prova1.com |
-d
100
0100 EB 0D 90 B4 00 CD 16 C3 B4 00 B0 03 CD 10 C3 E8
0110 F6 FF E8 EE FF B4 4C CD 21 |
-u 100
0100 EB0D JMP 010F
0102 90 NOP
0103 B400 MOV AH,00
0105 CD16 INT 16
0107 C3 RET
0108 B400 MOV AH,00
010A B003 MOV AL,03
010C CD10 INT 10
010E C3 RET
010F E8F6FF CALL 0108
0112 E8EEFF CALL 0103
0115 B44C MOV AH,4C
0117 CD21 INT 21 |
|