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 inizio
Ecco 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.CODE
Quindi 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 inizio
Vediamo 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!






