C インライン ASM でのベース ポインター レジスタの使用
質問:
しようとしていますインライン アセンブリ内でベース ポインター レジスタ (%rbp) を使用します。ただし、インライン asm の後に変数にアクセスすると、プログラム セグメントでエラーが発生します。以下のコード スニペットは問題を示しています:
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
問題診断:
RSP の下の「レッド ゾーン」に格納されている値を上書きするため、コード セグメントに障害が発生します。 、GCC はこれを使用して、 value.
解決策:
この問題を回避するには、「=m」出力オペランドを使用してインライン ASM にスクラッチ領域を割り当てるか、次を使用してレッド ゾーンを明示的にスキップします。サブ $-128、%rsp 命令。あるいは、最初からスクラッチ領域の使用を避け、コンパイラにレジスタの割り当てと保存を行わせます。
インライン ASM のベスト プラクティス:
追加のヒント:
以上がベース ポインター レジスタ (%rbp) を使用するインライン アセンブリによって C でセグメント フォルトが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。