我已经为一个最初针对MSDOS的程序使用了inherited,这是一个相当古老、庞大而复杂的代码库。事实证明,这个程序的某些部分是用x86汇编器的一种晦涩难懂的方言编写的,叫做"Phar Lap assembler",以生产汇编程序的公司和产品命名。我已经在谷歌上进行了相当深入的搜索,但我既找不到原始的汇编程序,也找不到任何关于它的信息或文档。(虽然我在专家交流会上发现了一些令人沮丧的页面,问了类似的问题)。
所以基本上,除非我找到一份MASM汇编程序(386asm.exe)的副本,或者找到足够的关于方言的信息,以便将其翻译成更“标准”的PharLap方言,否则我无法编译这件事。要么这样,要么试着通过阅读来弄清楚。
或者,如果所有这些都不可能,那么我只需要一些帮助来解决这个问题,并且我至少应该能够编译程序的一部分。
在.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 assembler):
Error! E518: External definition different from previous one
所以基本上,我认为这意味着这个结构的汇编版本与C语言版本的结构不匹配。我在汇编程序中尝试了许多不同的WORD和DWORD组合来代替dd,但是我就是不能通过这个小东西。也许如果我能找到一种方法让这两个声明完美匹配,我对pharlap信息的需求就会减少。
此外,如果有人能想出一个更好的标题来解决这个杂乱无章的问题,我对此持开放态度。
编辑:好的,我浏览了一些重要的信息。这是一个最初为Phar Lap汇编程序(我没有)编写的文件,我正尝试使用watcom assember (wasm)来汇编它。这个特殊错误的问题是,Phar Lap似乎区分大小写,而watcom不区分大小写,所以它将BhashCtl视为与bhashctl相同。在我小叔子的帮助下解决了这个问题。我从来没有想过大小写不敏感是导致这种情况的原因。
发布于 2009-04-19 02:47:06
部分Phar Lap手册(包括386|ASM手册)的压缩文件位于:
http://www.dinigroup.com/pharlap.php
发布于 2009-04-19 02:24:56
这可能不是您需要的答案,但我会尝试:将汇编部分移植到C中有多难?我知道有一些C不能做的事情,但也许你可以使用内联汇编来完成它。
https://stackoverflow.com/questions/764623
复制相似问题