它花费的时间比应有的要长,因为虽然IDA很棒,但我不知道如何让它与GW-Basic奇怪的段使用一起工作。问题是,基本数据段被附加到代码的末尾,在初始化期间,CS等于DS,变量在该段中具有很高的偏移量。但是在初始化之后,CS不再等于数据开始处的DS和DS点,这意味着变量在DS内处于较低的偏移量。我未能说服IDA通过代码中不同位置的完全不同的偏移量来访问相同的数据。经过多次尝试和失败,我仍然不确定是我做错了什么,还是这真的是IDA不能充分处理的情况。
无论如何,我最终得到了GW-Basic OEM模块的4000多行,这些模块都是从Compaq的BASICA.EXE版本1.13中亲切地借用来的。
最初的版本很可能将OEM代码拆分成几个模块,这从代码中的小间隙可以看出。这将由分段的段落对齐引起。
使用前面公开的信息,源模块全部用MASM 1.06组装(没有错误),并用日期为4-01-83的可执行链接V2.01(大)链接。模块的顺序肯定很重要,至少在某种程度上是这样。链接器警告没有堆栈段(TRUE;原始的Compaq可执行文件也没有堆栈段),并在数学模块中显示一个关于偏移宽度超过字段的错误。虽然该错误也是合法的,但代码就是这样写的。尽管存在这些问题,链接器仍然会生成一个正常运行的可执行文件。这是地图文件,以防有人好奇。
事实证明,链接器错误有些严重。MATH1.ASM中有问题的代码如下:
链接器正确地抱怨它不能将16位$FAC偏移量推入8位寄存器。作者的实际意图可能是这样的:
现在,真正有趣的是,在所检查的四个GW-Basic 1.x可执行文件(Compaq BASICA.EXE 1.13和1.14、Eagle GWBASIC 1.10、Corona GWBASIC 1.12.03)中,有三个实际上使用了后者的代码修正版本。只有康柏(Compaq)的Basic 1.13,显然是最古老的,使用了与微软发布的源代码相匹配的有缺陷的代码序列。
如前所述,这四个二进制文件中没有一个与发布的源代码完全匹配。康柏的1.13版是最接近的,但并不完全相同。在这一点上,任何人都在猜测是否有任何OEM发布过GW-Basic版本,该版本是根据微软最近发布的完全相同的源代码构建的。
注意:OEM模块的形状还不适合发布,所以不要问。