详解驻留exe文件
2008-12-27 09:35:59 来源:WEB开发网(9) 链接器3制静态覆盖块
link4的obj参数,囿于括号时,生成OVERLAY_DATA,OVERLAY_AREA,OVERLAY_END块,使DOS的exe长达16M.
用4个源文阐述:
(9.1) root文
要点: 入口@需处于装入模块首
要点: extrn的near/far,声明近/远标号
c_root segment
assume cs:c_root
extrn ov_near:near,ov_far:far,ov_far1:far
@: call ov_near ;近调用
call ov_far ;远调用
jmp ov_far1 ;远转移
c_root ends
stk segment STACK
dw 16 dup(1)
stk ends
END @
(9.2) ov_near文
要点: ret是近返回
c_near segment
assume cs:c_near
public ov_near
ov_near:mov ah,2
mov dl,'N'
int 21h
ret ;近返回
c_near ends
END
(9.3) ov_far文
要点: retf是远返回
c_far segment
assume cs:c_far
public ov_far
ov_far: mov ah,2
mov dl,'F'
int 21h
retf ;远返回
c_far ends
END
(9.4) ov_far1文:
c_far1 segment
assume cs:c_far1
public ov_far1
ov_far1:mov ah,2
mov dl,'f'
int 21h
mov ah,4ch
int 21h
c_far1 ends
END
用masm5,生成扩展名为obj的root,ov_near,ov_far,ov_far1
用link4 root (ov_near ov_far) (ov_far1),root3,3,,,
生成root3.exe,3.map
exe文件,未囿于括号的obj的各逻辑段,及不属于'CODE'类的代码,是常驻部分,计为0号覆盖块.括号组,生成1号,2号覆盖块.
root3.exe,显'NFf'
改root3.exe为root3,做debug root3,用U 300,反出代码区:
0300 E82D00 CALL 0330
0303 9A40000000 CALL 0000:0040
0308 EA50000000 JMP 0000:0050
3.map含:
Start Stop Length Name Class
Resident
00000H 0000CH 0000DH C_ROOT
00010H 0002FH 00020H STK
00030H 00036H 00007H C_NEAR
00040H 00046H 00007H C_FAR
00050H 00059H 0000AH C_FAR1
00060H 00082H 00023H OVERLAY_DATA DATA
00090H 00090H 00000H OVERLAY_AREA CODE
00090H 00090H 00000H OVERLAY_END CODE
Overlay 1H
Overlay 2H
Origin Group
0006:0 DGROUP
改root3.exe为root3,做debug root3,用D 100 L2A,显出exe文件头的前2Ah个字节:
0100 4D 5A 83 00 02 00 03 00-20 00 01 00 FF FF 01 00
0110 20 00 79 52 00 00 00 00-1E 00 00 00 01 00 04 00
0120 06 00 06 00 00 00 0B 00-00 00
root3的重定位表,含3项:
第1项,w_o=4,w_p=6,指出OVERLAY_DATA块的字节偏置4,5
第2项,w_o=6,w_p=0,指出CALL 0000:0040中的段值位置.
第3项,w_o=b,w_p=0,指出JMP 0000:0050中的段值位置.
用D 360 L23,显出OVERLAY_DATA块:
0360 01 00 03 00 00 00 00 00-00 00 00 00 00 00 00 00
0370 00 00 00 52 4F 4F 54 33-2E 45 58 45 00 00 00 00
0380 00 00 3F
笔者探出,对OVERLAY_DATA块,字节偏置2,3,是覆盖块数3,偏置4,5,是cs相对装入模块首的节数.
更多精彩
赞助商链接