-324- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
块之间的组合主要依靠几个新的伪操作。再讨论新的伪指令之前,我们先将以前讲过的"SEGMENT"伪指令更深入地挖掘一下。 "SEGMENT"伪指令的标准用法应该如下所示: 段名 SEGMENT 定位类型 组合类型 类别名称 (1)定位类型 有些参考书称定位类型指得是段的起始位置,实际上定位类型可以理解为"对两个相临段的段地址给予的一些规定"。定位类型可以有以下几种: PARA:指定所定义的段开始于小段边界,实际是规定这个段的起始地址与前面一个段的起始地址之差必须是16字节的整数倍。这意味着相临两个段的段地址之差最小也得是1。给出的示例程序就是采用了PARA定位类型。 PAGE:指定定义的段开始于页边界,实际是规定这个段的起始地址与前面一个段的起始地址之差必须是256字节的整数倍。 BYTE:所定义的段开始于字节边界,实际上是指这个段可以从任何地址开始。 WORD:所定义的段开始于字边界,实际是指这个段只能从偶数地址开始。 如果源程序中指定了段的定位类型为PARA或PAGE,那么获得的可执行文件中相临段的段地址就有差异。但是如果源程序中指定了段的定位类型是BYTE或WORD,那么在可执行文件中相临段的段地址就有可能相同。为了说明这个问题,我们下面给出了一个程序例: |
|||||||||||||||||||||
DEMO.ASM data msg data code main |
segment assume db ends segment assume proc push xor |
para public 'data' ds:data 'DEMO',0dh,0ah,24h para public 'code' cs:code far ds ax,ax |
main code |
push mov mov mov mov int ret endp ends end |
ax ax,data ds,ax dx,offset msg ah,9 21h main |
||||||||||||||||
这个程序编译之后数据段地址为0F9CH,代码段地址为0F9DH,两者相差1。这恰好说明了数据段首与代码段首相差了16个字节。 C:\ASM\>debug demo.exe[Enter] -u0 10[Enter] |
|||||||||||||||||||||
0F9D:0000 0F9D:0001 0F9D:0003 0F9D:0004 0F9D:0007 0F9D:0009 0F9D:000C 0F9D:000E 0F9D:0010 |
1E 33C0 50 B89C0F 8ED8 BA0000 B409 CD21 CB |
PUSH XOR PUSH MOV MOV MOV MOV INT RETF |
DS AX,AX AX AX,0F9C DS,AX DX,0000 AH,09 21 |
||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |