Non ricordo più i concetti di classe e combine di un segmento.
Scrivo un sorgentino con le classi.
text SEGMENT "CODE" inizio: JMP Procedura Var DW 0FAFAH Procedura PROC MOV AH,00H MOV AL,03H INT 10H MOV AX,[Var] MOV BX,Var MOV AH,00H INT 16H MOV AH,4CH INT 21H Procedura ENDP text ENDS END inizioEcco il record LNAMES del file oggetto:
96 0C 00 00 04 54 45 58 54 04 43 4F 44 45 F6Ecco, ho ottenuto in sequenza il nome del segmento e il nome della classe, TEXT e CODE.
Avendo retrodatato il computer riesco a far funzionare anche il programma dispObj:
LNAMES: Type 96, Offset 000C 1: Name 2: Name TEXT 3: Name CODE 0000:96 0C 00 00 04 54 45 58-54 04 43 4F 44 45 .....TEXT.CODEQuindi vado a SEGDEF:
SEGDEF: Type 98, Offset 001B Reloc para-aligned, combine type none, length 001B Segment name TEXT, class CODE 0000:98 07 00 60 1B 00 02 03-01 ...`.....Dove l'allineamento al paragrafo è specificato dal primo sottocampo di tre bytes pari a 3, la combine "none" dal secondo sottocampo di tre bytes pari a zero.
Vengono quindi:
-la lunghezza del segmento pari a 001B (27) bytes;
-l'indice del nome del segmento pari a 02 (ossia TEXT)
-l'indice del nome della classe pari a 03 (ossia CODE).
Adesso mi sbizzarrisco a creare un sorgente con più segmenti:
data SEGMENT "DATI" uno dw 1234h due dw 3456h data ENDS text SEGMENT "CODE" inizio: JMP Procedura Var DW 0FAFAH Procedura PROC MOV AH,00H MOV AL,03H INT 10H MOV AX,[Var] MOV BX,Var MOV AH,00H INT 16H MOV AH,4CH INT 21H Procedura ENDP text ENDS END inizioVediamo dispObj:
LNAMES: Type 96, Offset 000C 1: Name 2: Name DATA 3: Name TEXT 4: Name CODE 5: Name DATI 0000:96 16 00 00 04 44 41 54-41 04 54 45 58 54 04 43 .....DATA.TEXT.C 0010:4F 44 45 04 44 41 54 49- ODE.DATI SEGDEF: Type 98, Offset 0025 Reloc para-aligned, combine type none, length 0004 Segment name DATA, class DATI 0000:98 07 00 60 04 00 02 05-01 ...`..... SEGDEF: Type 98, Offset 002F Reloc para-aligned, combine type none, length 001B Segment name TEXT, class CODE 0000:98 07 00 60 1B 00 03 04-01 ...`.....Ecco: vengono elencati in LNAMES tutti i nomi dei segmenti e delle classo, ed essendoci due segmenti, vengono creati due records SEGDEF.
Il primo è questo:
98 07 00 60 04 00 02 05-01che si legge:
- allineamento al paragrafo perchè il primo sottocampo di tre bytes è pari a 3
- combine=none perchè il secondo sottocampo di tre bytes è pari a zero
- lunghezza del segmento di 0004 bytes
- indice del nome del segmento 02, corrispondente a DATA
- indice della classe del segmento 05 corrispondente a DATI
Il secondo è questo:
98 07 00 60 1B 00 03 04-01che si legge:
- allineamento al paragrafo perchè il primo sottocampo di tre bytes è pari a 3
- combine=none perchè il secondo sottocampo di tre bytes è pari a zero
- lunghezza del segmento di 001B (27) bytes
- indice del nome del segmento 03, corrispondente a TEXT
- indice della classe del segmento 04, corrispondente a CODE.
Quindi, dopo un record LNAMES, che elenca i nomi e le classi dei segmenti, i records SEGDEF specificano per ogni segmento gli attributi (allineamento, combine), la lunghezza di ogni segmento e la corrispondenza con i nomi e le classi specificati in LNAMES.
In pratica, dopo essersi reso conto di tutti i nomi, l'assemblatore elenca i segmenti con nome, classe, lunghezza, allineamento e combine.
Faticosetto, l'argomento!