我inherited是一个相当古老的大而复杂的代码库,适用于最初针对MSDOS的程序。事实证明,该程序的某些部分是用一种名为“Phar Lap汇编程序”的x86汇编程序的模糊方言编写的,后面是生成汇编程序的公司和产品。我做了一个相当深入的谷歌搜索,我无法找到原始的汇编程序,或任何有关它的信息或文档。 (虽然我在专家交流中发现了一些相当令人沮丧的页面,人们会问类似的问题)。
所以基本上,在找到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 assember(wasm)进行汇编。事实证明,这个特定错误的问题似乎是Phar Lap是区分大小写的,而watcom则不是。所以它认为bhashctl和BhashCtl一样。在我的兄弟的帮助下弄清楚这一点。我永远不会想到不区分大小写的原因。
答案 0 :(得分:1)
一些Phar Lap手册的ZIP(包括386 | ASM)手册:
答案 1 :(得分:0)
这可能不是您需要的答案,但无论如何我都会尝试:将装配部分移植到C中有多难?我知道有些东西是C不能做的,但也许你可以使用内联汇编来实现这一点。