1

C++Builder で EIP の値を取得するために、このインライン アセンブリ トリックを実装しようとしています。次のコードはリリース モードで機能します。

unsigned long get_eip()
{
    asm { mov eax, [esp] }
}

ただし、デバッグ モードでは機能しません。デバッグ モードでは、コードを次のように変更する必要があります。

unsigned long get_eip()
{
    asm { mov eax, [esp+4] }
}

生成されたアセンブリを検査する。違いは、デバッグ モードでは、get_eip()関数用に生成されたコード (最初のバージョン) が次のようになることです。

push ebp
mov ebp,esp
mov eax,[esp]
pop ebp
ret

ただし、リリース モードのコードは次のとおりです。

mov eax,[esp]
ret

もちろん#ifdef NDEBUG、問題を回避するために使用できます。ただし、関数全体がアセンブリーにあり、コンパイラーがそれらを挿入してはならないことを指定するために使用できる構文はありますpush ebpか? (または、この問題を解決します)。

4

1 に答える 1

3

__declspec(naked)を試しましたか?

__declspec(naked) unsigned long get_eip()
{
    asm { mov eax, [esp] }
}
于 2014-11-12T02:46:43.163 に答える