我为最初针对 MSDOS 的程序继承了一个相当古老的大而复杂的代码库。事实证明,该程序的某些部分是用 x86 汇编程序的一种晦涩方言编写的,称为“Phar Lap assembler”,以生产该汇编程序的公司和产品命名。我已经进行了相当深入的谷歌搜索,但我找不到原始的汇编程序或任何有关它的信息或文档。(尽管我在专家交流中发现了一些相当令人沮丧的页面,人们提出了类似的问题)。
所以基本上,在我找到 PharLap Assembler (386asm.exe) 的副本,或者找到足够的有关方言的信息将其翻译成更“标准”的 MASM 之前,我将无法编译这个东西。 . 要么,要么尝试通过阅读来弄清楚它。
或者,如果这都不可能,那么我只需要一些帮助来解决这个问题,我至少应该能够编译程序的一部分。
.c 文件中有一个结构声明,如下所示:
//static struct bhash *bhash;
typedef struct bhash_control {
void *cachedata;
Rgb3 *ctab;
int rederr;
int grnerr;
int bluerr;
ULONG drgb; // temp var used by dithering, blackbox to us here
#ifdef SHOW_STATS
int calls, hits1, hits2, fhits, misses;
#endif
} BhashCtl;
BhashCtl bhashctl; // global so assembler code can see it.
然后有一些看起来像这样的汇编器,它可能试图做出相同的类型声明,以便一些汇编器代码可以使用相同的类型:
BhashCtl struct
cachedata dd ? ; pointer to alloc'd cache data area
ctab dd ? ; contains vb.pencel->cmap->ctab
rederr dd ? ; error diffusion dithering variables...
grnerr dd ?
bluerr dd ?
drgb dd ? ; rgb value with dithering rolled in
;calls dd ? ; cache stats...
;hits1 dd ? ; to use these, you also need to
;hits2 dd ? ; uncomment a few lines below.
;fhits dd ? ; search for 'bhashctl.' to find them.
;misses dd ?
BhashCtl ends
extern bhashctl:BhashCtl ; the one-and-only lives in bhash.c
这在最后一行编译时出现错误,如下所示(watcom 汇编器):
Error! E518: External definition different from previous one
所以基本上,我认为这是说这个结构的汇编版本与这个结构的 C 版本不匹配。我已经在汇编器中尝试了多种 WORD 和 DWORD 的不同组合来代替 dd,但我无法克服这个小问题。也许如果我能找到一种方法让这两个声明完美匹配,我对 pharlap 信息的需求就会减少。
另外,如果有人能为这个庞大的问题想出一个更好的标题,我愿意接受。
编辑:好吧,事实证明我浏览了一些重要信息。这是一个最初为 Phar Lap 汇编器(我没有)编写的文件,我正在尝试使用 watcom 汇编器(wasm)进行汇编。事实证明,该特定错误的问题在于 Phar Lap 似乎区分大小写,而 watcom 不区分大小写。所以它认为 bhashctl 与 BhashCtl 相同。在我姐夫的帮助下解决了这个问题。我永远不会想到不区分大小写是导致该问题的原因。