![]() | 第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 |