目录 上一页 下一页 附录A

第11章 更高级的技术 -325-

  如果把数据段与代码段的定位类型改成"BYTE",那么编译之后的程序就是下面这样了:
C:\ASM\>debug demo.exe[Enter]
-u7 17[Enter]
0F9C:0007
0F9C:0008
0F9C:000A
0F9C:000B
0F9C:000E
0F9C:0010
0F9C:0013
0F9C:0015
0F9C:0017
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

  可以看到代码与数据都在0F9CH段里了。这种情况有些象COM文件,不过这个程序不能转换成COM文件,因为代码的起始地址不是偏移0100H。
  那么将源程序中的"PARA"改成"BYTE"后程序的起始地址为什么是0007H呢?这只要算清数据段内究竟有几个字节数据就可以搞清楚了。
  这样一来就可以推断出如果再把"BYTE"改成"WORD",那么代码的偏移地址就应该是0008H,大家可以自行修改源程序进行验证。
  (2)组合类型
  组合类型与模块化程序设计技术有关。前面已经说过,每个模块都是一个独立的源程序,都有自己的段定义。设置一定的组合类型就可以通知LINK程序把一些分散在不同模块内的同类型段组织在一个段内,这样可以使最终形成的可执行文件结构比较清晰。组合类型共有5种:
  PUBLIC: 凡是组合类型为PUBLIC的同名段在连接时都会被组织到一起,段的顺序按OBJ文件的先后顺序安排。
  COMMON: 这种类型的段在连接时会被其它模块中的同名段覆盖掉,连接后段的长度以所有同名段中最长者为准。通常情况下这种类型的段可应用于在不同的模块之间共享数据,对于定义一般的数据定义而言不使用这种类型的段。
  AT 表达式:编译程序把表达式的值当作该段的段地址,采用这种组合类型可以很方便地从内存中取得数据。比如采用下面定义的这个段就可以很方便地从BIOS数据区内取得系统时钟计数:
BIOSDATA

TIMER
BIOSDATA
CODE

START:

SEGMENT
ORG
DD
ENDS
SEGMENT
ASSUME
MOV
MOV
AT 0040H
6CH
?


CS:CODE
AX,BIOSDATA
ES,AX

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 附录A