|
 |
Gli strumenti di Lavoro |
ASSEMBLATORE 7/17
[26 di 87] |
 |
|
Cosa contiene il file OBJ? |
|
 | Abbiamo più volte avuto occasione di parlare
del codice oggetto (.OBJ)
prodotto dall'assemblatore MASM;
sappiamo che si tratta di un file contenente bytes, nel senso che assomiglia
molto al codice macchina effettivo (.COM)
che il processore sarà chiamato ad eseguire, dopo essere stato trasferito
in memoria. |
 | Il problema sta nel fatto che, una rapida
occhiata sulle dimensioni dimostra che il primo è quasi 5 volte più
grande del secondo...
|
 | Ne consegue che l'80 per cento di questo file non
è codice eseguibile, ma contiene informazioni necessarie al
linker (nella fase successiva) per mantenere
per esso la caratteristica della rilocabilità
e per renderlo effettivamente eseguibile. |
 | Ma questa è una storia già ampiamente
discussa. In questa sede cercheremo solo di capire cosa c'è dentro questo
file. |
 | La documentazione sull'argomento è
introvabile e, per altro poco significativa; l'organizzazione interna dei
bytes a favore del
linker
LINK.EXE
è un problema che riguarda solo questo applicativo: a noi interessa solo
che faccia bene il suo lavoro, cioè la trasformi l'OBJ in
EXE. |
 | Tuttavia, sorretto da una innata curiosità ho
provato ad analizzare i 2 files OBJ
disponibili con l'aiuto del prezioso
Debug; il risultato è raccolto nelle 2
tabelle:
C:\ARCH-LAB\LAVORO> debug
---[prova.OBJ - 78-byte]----------------------------------------
80 0B 00
09 50 52 4F 56 41 2E 41 53 4D D5
96 0D PROVA.ASM
00 00 04
43 4F 44 45 05
5F 50 52 4F 47 A2 98 07
CODE _PROG
00 28 0E 01 03 02 01 24
88 04 00 00 A2 00 D2 A0
12 00 01 00 01 B4 00 B0 03 CD 10 B4 00 CD 16 B4
4C CD 21 83 8A 07 00 C1 00 01 01 00 01 AB
---[prova.COM - 14 bytes]----------------------------------------
B4 00 B0 03 CD 10 B4 00 CD 16 B4
4C CD 21 |
C:\ARCH-LAB\LAVORO> debug
---[prova1.OBJ - 108 bytes]-------------------------------------
80
0C 00
0A 70 72 6F 76 61 31 2E 41 53 4D 02
96 prova1.ASM
0D 00 00 04
43 4F 44 45 05
5F 50 52 4F 47 A2 98
CODE _PROG
07 00 28 19 01 03 02 01 19
88 04 00 00 A2 00 D2
A0 1D 00 01 00 01 EB 0D 90 B4 00 CD 16 C3 B4 00
B0 03 CD 10 C3 E8 00 00 E8
00 00 B4 4C CD 21
9A
9C 0F 00 84 10 00 01 01 08 01 84 13 00 01 01 03
01 19 8A 07 00 C1 00 01 01 00 01 AB
---[prova1.COM - 25 bytes]---------------------------------------
EB 0D 90 B4 00 CD 16 C3 B4 00 B0 03 CD 10 C3 E8
F6 FF E8
EE FF B4 4C CD 21
|
|
 | Osservando i risultati possiamo localizzare
delle aree funzionalmente riconoscibili e altre comunque
presenti in entrambe le tabelle:
 | Le zone
verdi sono le stringhe ascii
con il nome del file sorgente e quello da noi scelto per il segmento di
codice; da notare la tecnica (molto diffusa a livello di sistema) di
anteporre alla stringa il numero dei suoi caratteri, a beneficio della
procedura che provvederà ad interpretarla. |
 | le
zone gialle sono il codice macchina effettivo;
il confronto con quello definitivo (estratto dal file
COM e aggiunto in
basso) mette in evidenza le differenze; in particolare nel secondo
programma, che implementa la tecnica della chiamata di procedure, si
notano chiaramente (aree gialle) i 2 bytes 00H, sostituiti alla fine
(dal linker) con l'effettivo valore. |
 | le zone
grigie sono
sequenze di bytes non documentate presenti in entrambi gli
OBJ. |
 | i rimanenti bytes sono invece sequenze di bytes non documentate che assumono valori diversi nei 2
OBJ. |
|
 | Per finire può essere interessante un esame
comparato del contenuto dei 2 files OBJ; da notare la zona del codice
macchina effettivo, ora integrata con la traduzione mnemonica (assembly)
dei codici esadecimali: |
---[prova.OBJ
- 78-byte]------
80
0B 00
09 50 52 4F 56 41 2E 41 53 4D
D5 96 0D
04 43 4F 44 45
05 5F 50 52 4F 47
A2 98 07 00 28
0E
01 03 02 01
24
88 04 00 00 A2 00 D2 A0
12
00 01 00 01
B4 00 INIZIO: MOV AH,00H
CD 16 INT 16H
B4 00 MOV AH,00H
B0 03
MOV AL,03H
CD 10
INT 10H
B4 4C
MOV AH,4CH
CD 21
INT 21H
83
8A 07 00 C1 00 01 01 00
01 AB
---[prova.COM - 14 bytes]-----
B4 00
CD 16
B4 00
B0 03
CD 10
B4
4C
CD 21 |
---[prova1.OBJ
- 108 bytes]-----
80 0C 00
0A 70 72 6F 76 61 31 2E 41 53 4D
02 96 0D 00 00
04 43 4F 44 45
05 5F 50 52 4F 47
A2 98 07 00 28
19
01 03 02 01
19
88 04 00 00 A2 00 D2 A0
1D
00 01 00 01
EB 0D 90 INIZIO: JMP Main
B4 00 KeyWait:MOV AH,00H
CD 16
INT 16H
C3
RET
B4 00 BiosCls:MOV AH,00H
B0 03
MOV AL,03H
CD 10
INT 10H
C3
RET
E8 00 00 Main:
CALL BiosCls
E8
00 00 CALL KeyWait
B4 4C MOV AH,4CH
CD 21
INT 21H
9A 9C 0F 00 84 10 00 01 01 08 01
84 13 00 01 01 03 01 19
8A 07 00 C1 00 01 01 00 01 AB
---[prova1.COM - 25 bytes]------
EB 0D 90
B4 00
CD 16
C3
B4 00
B0 03
CD 10
C3
E8 F6 FF
E8
EE FF
B4 4C
CD 21
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|