私はrsp
とrbp
のレジスタを使って、VS 2015 C++のx64インラインアセンブリーでのメモリー索引付けに使用します。保存せずに復元することが可能ですpush rsp, push rbp
、...ポップrbp、ポップrsp?インテルx64のインラインアセンブリー対2015
デバッグモードでは、mov rbp, rsi
の後にメモリのベースアドレスが変更されます。これは問題ありませんか?
私はrsp
とrbp
のレジスタを使って、VS 2015 C++のx64インラインアセンブリーでのメモリー索引付けに使用します。保存せずに復元することが可能ですpush rsp, push rbp
、...ポップrbp、ポップrsp?インテルx64のインラインアセンブリー対2015
デバッグモードでは、mov rbp, rsi
の後にメモリのベースアドレスが変更されます。これは問題ありませんか?
インラインアセンブリを記述する際には、使用できるレジスタのコンパイラの規則に準拠する必要があります。 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
ファイルを使用する必要があります。呼び出し規約は異なる。
このコードがvs2015でどのようにコンパイルされているのかわかりません。これは64ビットコードです(レジスタ名は「r」で始まるため)。vs2015ではインラインasmの使用がサポートされていません。おそらくあなたは 'esi'、' esp'などを意味したでしょうか? –