私は、もともと MSDOS を対象としていたプログラムの、かなり古くて複雑なコードベースを継承しました。このプログラムのいくつかのセクションは、アセンブラー プログラムを作成した会社と製品にちなんで、「Phar Lap assembler」と呼ばれる x86 アセンブラーのあいまいな方言で書かれていることが判明しました。Google でかなり詳細な検索を行いましたが、元のアセンブラー プログラムも、それに関する情報やドキュメントも見つかりません。(Experts Exchange で、似たような質問をしている人々のかなり苛立たしいページをいくつか見つけましたが)。
つまり、基本的には、PharLap アセンブラー (386asm.exe) のコピーを見つけるか、方言に関する十分な情報を見つけて、より「標準的な」MASM のような方言に変換するまで、これをコンパイルすることはできません。 . それか、それを読んで理解するだけで筋肉をつけようとします。
または、これがどれも不可能な場合は、この問題について何らかの助けが必要であり、少なくともプログラムの 1 つのセクションをコンパイルできるようにする必要があります。
.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 バージョンと一致しないということだと思います。アセンブラで dd の代わりに WORD と DWORD のさまざまな組み合わせを試しましたが、このささいなことを乗り越えることはできません。これら 2 つの宣言を完全に一致させる方法を見つけることができれば、pharlap に関する情報の必要性は減るでしょう。
また、この広大な質問に対してより良いタイトルを考えられる人がいれば、私は自由に考えます。
編集:わかりました、重要な情報をざっと見ただけでした。これはもともと Phar Lap アセンブラ (私は持っていません) 用に書かれたファイルで、watcom アセンバー (wasm) を使用してアセンブルしようとしています。この特定のエラーの問題は、Phar Lap では大文字と小文字が区別されるように見えるが、watcom では区別されないことが判明した。したがって、bhashctl は BhashCtl と同じものとして認識されます。義理の兄の助けを借りてこれを理解しました。大文字と小文字を区別しないことがその原因であるとは思いもしませんでした。