インライン asm 内でベース ポインター レジスタ (%rbp) を使用する
インライン アセンブリ (インライン asm) は、以下を含めることを可能にする手法です。アセンブリ言語命令を C コード内で直接実行できます。インライン asm をベース ポインター レジスタ (%rbp) とともに使用することは、さまざまなタスクを実行するための一般的な要件です。ただし、問題を回避するには、インライン ASM 内で %rbp を正しく使用する方法を理解することが重要です。
提供されたコード例では:
void Foo(int &x) { asm volatile ("pushq %%rbp;" // 'prologue' "movq %%rsp, %%rbp;" // 'prologue' "subq , %%rsp;" // make room "movl , -12(%%rbp);" // some asm instruction "movq %%rbp, %%rsp;" // 'epilogue' "popq %%rbp;" // 'epilogue' : : : ); x = 5; }
目的は、いくつかのアセンブリ命令を実行することです。ベース ポインタ レジスタである %rbp をプッシュおよびポップすることで、現在のスタック フレームを保持します。ただし、インライン asm の後に変数 x にアクセスすると、セグメンテーション違反が発生します。これは、インライン ASM が %rbp の格納値を破損するような方法でスタック フレームを変更するためです。
問題の理解:
エラーが発生するのは、プッシュが行われたためです。インライン ASM の命令は、コンパイラが重要な値を格納していた %rsp の下のレッド ゾーンのスタックに値をプッシュします。レッド ゾーンは、関数呼び出し中にコンパイラとオペレーティング システムが使用するために予約されているメモリ領域です。この領域に値をプッシュすると、インライン ASM が格納された値を上書きし、x にアクセスしようとしたときにセグメンテーション違反が発生します。
解決策:
これを解決するにはこの問題を解決するには、インライン ASM 内のスタック操作にレッド ゾーンを使用しないでください。これを実現するには、いくつかの方法があります。
インライン Asm を使用するための一般的なガイドライン:
以上がインライン アセンブリでベース ポインター レジスタ (%rbp) を使用するときにセグメンテーション フォールトを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。