1

我为最初针对 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 相同。在我姐夫的帮助下解决了这个问题。我永远不会想到不区分大小写是导致该问题的原因。

4

2 回答 2

1

一些 Phar Lap 手册(包括 386|ASM 手册)的 ZIP 位于:

http://www.dinigroup.com/pharlap.php

于 2009-04-19T02:47:05.550 回答
0

这可能不是您需要的答案,但无论如何我都会尝试:将您的程序集部分移植到 C 中有多难?我知道有些东西是 C 不能做的,但也许你可以使用内联汇编来完成它。

于 2009-04-19T02:24:55.977 回答