JavascriptProva

martedì 29 maggio 2012

Dissezione del file oggetto: record SEGDEF (98H), campo ATTRIBUTI, sottocampo ALLINEAMENTO

Il record SEGDEF (98H) è sicuramente quello che al primo studio di questa roba mi ha dato più grattacapi nel cercare di capirci qualcosa.

SEGDEF:98 07-00 60 1B 00 02 01 01 E2
Il macello sta nel fatto che c'è un campo formato da una serie di lunghezza variabile di bytes che esprimono gli attributi del segmento.
Nella fattispecie abbiamo un byte che vale 60.
Lo scrivo in binario:
01100000
Andiamo per ordine:
Il primo sottocampo è di tre bytes, e vale 011, ossia 3.
Questo è il campo dell'ALIGNMENT del segmento, che può avere i seguenti valori:
  • 0: segmento assoluto (non ricordo più cosa significa)
  • 1: segmento allineato al byte
  • 2: segmento allineato alla word
  • 3: segmento allineato al paragrafo
  • 4: segmento allineato alla pagina
  • 5: segmento allineato alla doubleword
Bene.
Acquisito questo, adesso mi metto a giocare creando segmenti variamente allineati e vedere come varia questo byte.
Anzi parto dall'intenzione di volere un certo valore di questo byte e vediamo se ci riesco variando il sorgente.


Adesso il sottocampo dovrà essere 1, quindi il byte sarà 20.
dati segment byte
dato1 dw 1234h
dato2 dw 5678h
dati ends

text segment
assume cs:text,ds:dati
inizio:
        mov     ah,00h
        mov     al,03h
        int     10h
        
        mov     ah,00h
        int     16h
        
        mov     ah,4ch
        int     21h
       
text ends
end inizio
 80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
 00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 20
Bene!
Adesso il sottocampo dovrà essere 2, quindi il byte sarà 40.
dati segment word
dato1 dw 1234h
dato2 dw 5678h
dati ends

text segment
assume cs:text,ds:dati
inizio:
        mov     ah,00h
        mov     al,03h
        int     10h
        
        mov     ah,00h
        int     16h
        
        mov     ah,4ch
        int     21h
       
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 40
Ottimo.
Adesso specifichiamo l'allineamento al paragrafo così da trasformare il byte in 60.
Ho capito che l'allineamento di default dei segmenti è al paragrafo.
dati segment para
dato1 dw 1234h
dato2 dw 5678h
dati ends

text segment
assume cs:text,ds:dati
inizio:
        mov     ah,00h
        mov     al,03h
        int     10h
        
        mov     ah,00h
        int     16h
        
        mov     ah,4ch
        int     21h
       
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 60
Perfetto!
Adesso il sottocampo sarà 4, quindi il byte sarà 80.
dati segment page
dato1 dw 1234h
dato2 dw 5678h
dati ends

text segment
assume cs:text,ds:dati
inizio:
        mov     ah,00h
        mov     al,03h
        int     10h
        
        mov     ah,00h
        int     16h
        
        mov     ah,4ch
        int     21h
       
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 80
Benissimo!
Adesso il sottocampo sarà 5, quindi il byte sarà A0.
dati segment dword
dato1 dw 1234h
dato2 dw 5678h
dati ends

text segment
assume cs:text,ds:dati
inizio:
        mov     ah,00h
        mov     al,03h
        int     10h
        
        mov     ah,00h
        int     16h
        
        mov     ah,4ch
        int     21h
       
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 A0
Perfetto!!!

Nessun commento:

Posta un commento