WEB开发网
开发学院软件开发汇编语言 详解驻留exe文件 阅读

详解驻留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) 重定位因子调度覆盖模块

功能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 @

上一页  1 2 3 4 5 6  下一页

Tags:详解 驻留 exe

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接