运行重定位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,两空间邻接
<  
1/2 1 2 下一页 尾页 |