2017-04-02 3 views
0

私はrsprbpのレジスタを使って、VS 2015 C++のx64インラインアセンブリーでのメモリー索引付けに使用します。保存せずに復元することが可能ですpush rsp, push rbp、...ポップrbp、ポップrsp?インテルx64のインラインアセンブリー対2015

デバッグモードでは、mov rbp, rsiの後にメモリのベースアドレスが変更されます。これは問題ありませんか?

+2

このコードがvs2015でどのようにコンパイルされているのかわかりません。これは64ビットコードです(レジスタ名は「r」で始まるため)。vs2015ではインラインasmの使用がサポートされていません。おそらくあなたは 'esi'、' esp'などを意味したでしょうか? –

答えて

0

インラインアセンブリを記述する際には、使用できるレジスタのコンパイラの規則に準拠する必要があります。 VS2015's rules are documented hereと私はキービットを引用します:

C/C++の機能でアセンブリ言語を記述するために__asmを使用している場合、あなたはEAX、EBX、ECX、EDX、ESI、またはEDIレジスタを保存する必要はありません。 .. __asmブロックの範囲に使用する他のレジスタ(DS、SS、SP、BP、フラグレジスタなど)は保持する必要があります。

"should"を "must"と読みます。あなたの質問に対する狭い答えは、「いいえ、ESPとEBPを保存して復元する必要があります。

私はあなたが実際に望むものは、アセンブリ言語で関数全体を書くことです。 Visual Studioでは、これを別の.ASMファイルに格納します。 calling conventionに準拠する必要がありますが、コンパイラの__asmブロックのより厳しい規則は適用されません。呼び出し規約では、ESPとEBP(EAX、ECX、EDXを除くすべてのレジスタ)を保存して復元する必要があります。

実際にx64/Windowsをコーディングする場合は、このドキュメントを正しく読んでいるとにはを使用できません。__asmを使用してください。別の.ASMファイルを使用する必要があります。呼び出し規約は異なる。

関連する問題