Friday, March 28, 2008

重定位表的作用

 

游戏的主程序文件z.dat实际上是一个线性可执行文件(LE),真实的扩展名应是exe。

重定位表用于标识可执行文件中与引用地址相关的语句。

在编译时,变量会被编译成地址,可以反汇编查看。但是代码段的地址位置通常只是形式上的,因为程序被载入内存时,究竟会被载入何处并不是确定的,所以代码段所写的地址通常跟真实的地址会差很远。在程序一开始,会依据重定位表,对代码段进行处理。

游戏主程序中的重定位表中的一项一般是这样的:

07 10 YY YY 02 XX XX XX XX

07 10 和 02 都是标志位,不同的标志位有不同的含义,游戏中只用了这一种。

重定位表一般是分段的,代码段中每 1000H 为一段,比如 20000H~20FFFH 的代码在重定位表中有单独一部分,而 21000H~21FFFH 又有另一部分。每一部分的开始位置写在重定位表的最前面,相当于索引。

在程序被载入时,一般可以这样理解:[段基址+YYYYH+程序实际载入的首地址]开始的4个字节会被替换成[XXXXXXXXH+程序实际载入的首地址]。

由于段基址是以 1000H 为一段的,所以 YYYYH 的最高位一般是0。

全部重定位项可以用一个应用程序 DUMPLX.EXE 导出。

我的描述仅仅是一个形象的说法,真正权威的解释和严格的格式定义可以从 LX 和 LE 格式的说明文档中找到。

No comments: