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