AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

驻留exe文件

51自学网 http://www.51zixue.net

运行重定位exe文件,重定位因子调度覆盖模块,链接器3制静态覆盖块,析栈初始startup

(1) X86汇编语言的组,段,类

伪指令group/segment,定义组/段,这使:

(1.1) 同组的各段,处于同一64k空间

(1.2) 段可声明'对齐,组合,类'可选属性:

(1.2.1) 段首,能对齐到BYTE,WORD,PARA(16字节),PAGE(256字节),缺省对齐到PARA.
(1.2.2) 不同源文的同名同类段,想靠链接,形成空间邻接或重叠的同名组合逻辑
段时,需用PUBLIC,COMMON,指明组合形式:

(1.2.2.1) PUBLIC,指明此段按对齐属性,邻在已包含在此组合逻辑段内的最末字面段之后
(1.2.2.2) COMMON,指明此段与同属此组合逻辑段的其他字面段,从组合逻辑段首铺展

同属组合逻辑段的各参与段的最大对齐属性(例如,WORD比BYTE大),决定组合逻辑段的对齐属性.

不与其它段组合的段,称为单逻辑段.

以下,用"逻辑段",统称组合逻辑段及单逻辑段.

(1.3) 类用'cls'指明,未指明类的各段,属'匿名'类.同类各段,邻接排列.

(2) 解释各逻辑段空间关系的3个源文

a1.asm,声明1个组,4个段,涉及'匿名','dec_'类

(2.1) grp组,含seg1段
(2.2) seg1段
(2.3) ovlap段,用COMMON参与组合,'dec_'类
(2.4) touch段,用PUBLIC参与组合
(2.5) stk1段,用STACK指明栈段及PARA对齐

grp  GROUP seg1

seg1 SEGMENT PAGE
str1 DB "S1$"
seg1 ENDS

ovlap SEGMENT PARA COMMON 'dec_'
str3 DB '11$'
ovlap ENDS

touch SEGMENT PUBLIC
  ASSUME cs:touch,ds:NOTHING

  ORG 11H

@:  mov ah,9

        mov bx,grp    ;取grp段值
        mov ds,bx

        mov dx,OFFSET str1  ;取str1相对seg1偏置
  int 21h

        EXTRN str2:far

        mov dx,OFFSET grp:str2 ;取str2相对grp偏置
        int 21h

  ASSUME ds:ovlap

        mov bx,SEG str3   ;取str3段值
        mov ds,bx
        lea dx,str3    ;取str3相对ds偏置
        int 21h

touch ENDS

stk1    SEGMENT PAGE STACK
  DW 16H DUP (4AH)  ;初值4AH的16H个字
stk1 ENDS

  END @

a2.asm,声明1个组,3个段,涉及'匿名','dec_','_stk'类:

(2.6) ovlap段,用COMMON参与组合,'dec_'类
(2.7) stk2段,用STACK指明栈段及PARA对齐,'_stk'类
(2.8) grp组,含seg3段
(2.9) seg3段,'dec_'类

ovlap SEGMENT COMMON 'dec_'
  DB '2'
ovlap ENDS

stk2 SEGMENT WORD STACK '_stk'
        DW 13H DUP (2BH)  ;初值2BH的13H个字
stk2 ENDS

grp  GROUP seg3

seg3 SEGMENT 'dec_'
  PUBLIC str3
str3 DB '33$'
seg3 ENDS

  END

a3.asm,声明1个组,4个段,涉及'匿名','_stk'类:

(2.10) grp组,含seg2段
(2.11) touch段,用PUBLIC参与组合
(2.12) seg2段
(2.13) stk2段,用STACK指明栈段及PARA对齐,'_stk'类
(2.14) seg1段

grp  GROUP seg2

touch SEGMENT BYTE PUBLIC

        EXTRN str3:far
        ASSUME cs:touch,ds:NOTHING

@1:  mov cx,SEG grp    ;取grp段值
  mov ds,cx

  mov dx,OFFSET grp:str3  ;取str3相对grp偏置
  int 21h

  mov cx,seg1     ;取seg1段值
  mov ds,cx

  mov dx,OFFSET seg1:str4  ;取str4相对seg1偏置
  int 21h

  mov ah,4ch     ;程序终止
  int 21h

touch ENDS

seg2 SEGMENT BYTE
  PUBLIC str2
str2 DB "S2$"
seg2 ENDS

stk2 SEGMENT WORD STACK '_stk'
        DW 31H DUP (0B2H)  ;初值B2H的31H个字
stk2 ENDS

seg1 SEGMENT BYTE
str4 DB "%$"
seg1 ENDS

        END @1

用masm5.exe(版5.10B,囿95 DDK),生成同名obj及lst文件.例如,汇编a1,命令行是:
masm5 a1,,a1;

用含覆盖管理器的link4.exe(版5.01.17,同囿DDK),依序链接obj,生成a.exe程序文件,a.map映像文件,命令行是:link4 a1+a2+a3,a,a,,,

a.exe,显'S1S22133%'

a.map含:

Start  Stop   Length Name                   Class
00000H 00002H 00003H SEG1                  
00010H 00055H 00046H TOUCH                  
00060H 0008BH 0002CH STK1                  
0008CH 0008EH 00003H SEG2                  
0008FH 00090H 00002H SEG1                  
000A0H 000A2H 00003H OVLAP                  DEC_
000B0H 000B2H 00003H SEG3                   DEC_
000C0H 00147H 00088H STK2                   _STK

Origin   Group
0000:0   GRP

entry point at 0001:0011

(3) 逻辑段排列准则:按链接次序,按字面段的源文次序,按类名大写ASCII次序

因此,a.exe含8个逻辑段(段名被大写):

(3.1) '匿名'类的a1的单逻辑段SEG1
(3.2) '匿名'类的a1与a3的组合逻辑段TOUCH,参与的a1及a3中touch字面段,代码相接.
(3.3) '匿名'类的a1的单逻辑段STK1
(3.4) '匿名'类的a3的单逻辑段SEG2
(3.5) '匿名'类的a3的单逻辑段SEG1
(3.6) 'DEC_'类的a1与a2的组合逻辑段OVLAP,参与的a2及a3中ovlap字面段,使str3变为'21$'
(3.7) 'DEC_'类的a2的单逻辑段SEG3
(3.8) '_STK'类的a2与a3的组合逻辑段STK2,参与的a2及a3中stk2字面段,按PUBLIC,两空间邻接

<

 

 

 
上一篇:动态库的执行时间  下一篇:仿FDISK及PQMAGIC列出分区逻辑盘符的prw.asm实现