我已经
inherited
一个相当古老、复杂的代码库,用于最初针对MSDOS的程序。事实证明,该程序的某些部分是用一种鲜为人知的x86汇编语言编写的,称为“phar lap assembler”,它是在生产汇编程序的公司和产品之后编写的。我做了一个相当深入的谷歌搜索,我找不到原始汇编程序,或任何有关它的信息或文档。(尽管我在专家交流中发现了一些令人沮丧的页面,这些页面上的人都在问类似的问题)。
因此,基本上,在我找到一个pharlap汇编程序(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,但我无法克服这个小问题。也许如果我能找到一种方法让这两个声明完全匹配,我对法老的信息需求就会减少。
此外,如果有人能为这个杂乱无章的问题想出一个更好的标题,我会接受各种想法。
编辑:好吧,原来我略读了一些重要的信息。这是一个最初为phar-lap汇编程序编写的文件(我没有),我正试图使用watcom assember(WASM)进行汇编。事实证明,这个特定错误的问题在于,PharLap似乎区分大小写,而Watcom则不区分大小写。因此,它认为Bhashctl与Bhashctl相同。在我姐夫的帮助下解决了这个问题。我从来没有想到不敏感的情况是造成这种情况的原因。