Borland Turbo C++ をインライン アセンブラー コードで使用しているため、おそらく Turbo Assembler (TASM) スタイルのアセンブリ コードです。私は次のことをしたい:
void foo::bar( void )
{
__asm
{
mov eax, SomeLabel
// ...
}
// ...
SomeLabel:
// ...
}
そのため、SomeLabel のアドレスが EAX に配置されます。これは機能せず、コンパイラは次のように文句を言います: 未定義のシンボル 'SomeLabel'。
Microsoft Assembler (MASM) では、ドル記号 ($) が現在の場所のカウンターとして機能します。これは、私の目的に役立ちます。しかし、これも Borlands Assember では機能しないようです (式の構文エラー)。
更新: もう少し具体的に言うと、実行時ではなく、コンパイル/リンク中に定数として eax に移動するアドレスをコンパイラが生成する必要があるため、「mov eax, 0x00401234」のようにコンパイルされます。
誰でもこれを機能させる方法を提案できますか?
更新: Pax の質問 (コメントを参照) に応答するには、実行時に Windows ローダーによってベース アドレスが変更された場合でも、DLL/EXE PE イメージは Windows ローダーによって再配置され、ラベル アドレスは実行時に次のようにパッチされます。ローダーは再ベースのアドレスを使用するため、ラベル アドレスにコンパイル/リンク時の値を使用しても問題ありません。
よろしくお願いします。