JavascriptProva

mercoledì 30 maggio 2012

Dissezione del file oggetto: il record SEGDEF

Mi sono arenato.
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 F6 
Ecco, 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-01
che 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-01
che 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!

Nessun commento:

Posta un commento