JavascriptProva

venerdì 25 maggio 2012

initialCS nell'header del file .EXE

Ora una domandina che mi sono posta e risolta un'infinità di volte...

Che cosa fa sì che il registro CS contenga l'indirizzo "alto" del segmento principale del programma?

Per il momento non voglio reimpicciarmi la testa, e parto da un presupposto fondamentale:
Quando il programma viene caricato in memoria, nel registro CS della CPU viene "automaticamente", in qualche modo, scritto il numero corrispondente al segmento principale. Punto!

Rivediamo ancora il famoso header dei files .exe...

Ecco il procedimento . che ricordo piuttosto bene...che ricordo piuttosto bene.
C:\Arch-Lab\old>copy mio.exe mio.xxx
        1 file copiati.

C:\Arch-Lab\old>dir mio.*
 Il volume nell'unità C è Acer
 Numero di serie del volume: F4A2-EF6D

 Directory di C:\Arch-Lab\old

25/05/2012  12:46               406 mio.asm
25/05/2012  12:47               556 MIO.EXE
25/05/2012  12:47               126 MIO.OBJ
25/05/2012  12:47               556 mio.xxx
               4 File          1.644 byte
               0 Directory   7.817.498.624 byte disponibili

C:\Arch-Lab\old>
ho ottenuto un file con estensione fasulla.
Ora lo debuggo e ottengo l'header, riconoscibile per la firna di Mark Zbikowski:
C:\Arch-Lab\old>debug mio.xxx
-d
13A3:0100  4D 5A 2C 00 02 00 00 00-20 00 00 00 FF FF 00 00   MZ,..... .......
13A3:0110  00 00 0B F3 00 00 01 00-1E 00 00 00 01 00 00 00   ................
13A3:0120  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13A3:0130  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13A3:0140  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13A3:0150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13A3:0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13A3:0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-
E' solo una parre dell'header, dovrebbe essere solo un quarto, ma è sufficiente.
Ora rivediamo sulla Bibbia le nozioni relative all'header dei files .exe...

Ecco. Per il momento non voglio fare tutto un ripasso mnemonico sull'header, ma solo rivedere quello che mi interessa a proposito del valore iniziale del registro CS.
 4D 5A 2C 00 02 00 00 00-20 00 00 00 FF FF 00 00
 00 00 0B F3 00 00 01 00-1E 00 00 00 01 00 00 00
quelli marcati in rosso sarebbero i valori initialIP e initialCS.
Il valore initialCS è impostato a 1 probabilmente perchè il segmento codice è il secondo.
Per verificare l'ipotesi scrivo un programmino in cui il segmento codice è il primo, e poi magari uno in cui è il terzo...
text SEGMENT
assume CS:text,DS:dati
inizio: JMP     Procedura

Var     DW 0FAFAH

Procedura PROC   
 MOV AH,00H
 MOV AL,03H
 INT 10H

        MOV     AX, Var
        MOV     BX,Dato1
        
        
        
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS


dati SEGMENT
Dato1 DW 0BABAH
Dato2 DW 0CACAH

dati ENDS
END inizio
...ed ecco l'header ottenuto con il procedimento di prima:
13A3:0100  4D 5A 24 00 02 00 00 00-20 00 00 00 FF FF 00 00   MZ$..... .......
13A3:0110  00 00 00 30 00 00 00 00-1E 00 00 00 01 00 00 00   ...0............
come volevasi dimostrare, initialCS è ora 0000.

Un'ulteriore prova:
dati SEGMENT
Dato1 DW 0BABAH
Dato2 DW 0CACAH

dati ENDS

altro SEGMENT

altrodato1 DW 0E0E0H
altrodato2 DW 0ABCDH

altro ENDS



text SEGMENT
assume CS:text,DS:dati
inizio: JMP     Procedura

Var     DW 0FAFAH

Procedura PROC   
        MOV AH,00H
        MOV AL,03H

        INT 10H

        MOV     AX, Var
        MOV     BX,Dato1
        
        
        
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
13A3:0100  4D 5A 3B 00 02 00 00 00-20 00 00 00 FF FF 00 00   MZ;..... .......
13A3:0110  00 00 3A A3 00 00 02 00-1E 00 00 00 01 00 00 00   ..:.............
Ancora una volta, come volevasi dimostrare!

Nessun commento:

Posta un commento