详解驻留exe文件
2008-12-27 09:35:59 来源:WEB开发网(8) 重定位因子调度覆盖模块
功能4b03,铺展exe装入模块.前部略去PSP的装入模块,称覆盖模块.
调用覆盖模块cs:ip入口的常驻者(如ovlayer.exe),要做:
(8.1) 将覆盖模块所在exe装入头中的程序cs:ip,读到entry
(8.2) 调用功能4a,释放其尾后内存
(8.3) 填写4b03的装入段值/重定位因子两参数
(8.4) 调用功能4b03,它在空闲内存MCB之高1节,铺展覆盖模块
(8.5) 用call entry语句,调用覆盖模块cs:ip入口
覆盖模块(如ovlayee.exe)工作完时,用retf,返回控制到常驻者.
覆盖模块被功能403铺展时,与(6)同样处理,作为mov ax,work操作数的段值work,与重
定位因子相加,这使ovlayee.exe,被ovlayer.exe调度,显示某区/某串值,例如,先显
o1区串s1值'os1',再显o2区串s2值'os2'.
(8.6) ovlayee文
要点: 只含1个逻辑段work,故work的机器码暂定,相对装入模块首,必为0,与重
定位因子的相加结果,恰=重定位因子.
要点: 不需写"END @"伪指令,让cs/ip为0,而ss/sp,借用ovlayer.exe栈区.
work segment
assume cs:work
push ds
mov ax,work
mov ds,ax
mov ah,9 ;显串
int 21h ;dx被ovlayer指定
pop ds
retf ;远返回
work ends
END
(8.7) ovlayer文
要点: 引入PARA对齐的tail空段,使长度可变的ovlayer.exe,从PSP首到tail,作为新占用内存,tail之上,是空闲内存MCB.
要点: mov bx,tail语句之后,勿写标号,否则masm5报错.
o1 segment
s1 db 'os1$'
o1 ends
o2 segment
s2 db 'os2$'
o2 ends
arg segment
loadseg dw 2 ;装入段值
factor dw 2 ;重定位因子
entry dd 4
filenam db 'ovlayee.exe',0
header db 1ch dup(1)
arg ends
stk segment STACK
dw 16 dup(9)
stk ends
root segment
assume cs:root,ds:NOTHING
@: mov ax,arg
mov ds,ax
mov ax,3d00h ;读打开
mov dx,offset arg:filenam
int 21h
jnc @F ;@F,@B,向前/后找最近的@@标号
mov ah,4ch
int 21h
@@: mov bx,ax ;句柄送bx
mov ah,3fh ;读装入头到header
mov cx,1ch
mov dx,offset arg:header
int 21h
mov ah,3eh ;关闭
int 21h
mov bx,tail ;tail指向映像尾节
mov di,es
sub bx,di ;bx是此程序新占用内存的节数
mov ah,4ah ;新占用内存,始于es所指PSP节,长bx节
int 21h
add bx,di
inc bx
mov ds:loadseg,bx ;装入段值=MCB之高1节
mov ax,seg s1 ;重定位因子=s1所在段
mov ds:factor,ax
mov ax,word ptr ds:[header+14h] ;取覆盖模块ip
mov word ptr ds:[entry],ax
add bx,word ptr ds:[header+16h] ;覆盖模块的cs,加上MCB之高1节
mov word ptr ds:[entry+2],bx
mov ax,ds
mov es,ax
mov ax,4b03h
mov bx,offset arg:loadseg ;es:bx指参数块
mov dx,offset arg:filenam ;ds:dx指程序名
int 21h
mov dx,offset o1:s1 ;dx是s1相对o1的偏置
call ds:entry
mov ax,seg s2
mov ds:factor,ax ;重定位因子=s2所在段
mov ax,4b03h
mov bx,offset arg:loadseg ;es:bx指参数块
mov dx,offset arg:filenam ;ds:dx指程序名
int 21h
mov dx,offset o2:s2 ;dx是s2相对o2的偏置
call ds:entry
mov ah,4ch
int 21h
root ends
tail segment ;空段
tail ends
END @
更多精彩
赞助商链接