目录 上一页 下一页 附录A

-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

目录 上一页 下一页 附录A