1

私は、もともと 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 と同じものとして認識されます。義理の兄の助けを借りてこれを理解しました。大文字と小文字を区別しないことがその原因であるとは思いもしませんでした。

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 に答える