ホームページ >バックエンド開発 >C++ >ベース ポインター レジスタ (%rbp) を使用するインライン アセンブリによって C でセグメント フォルトが発生するのはなぜですか?

ベース ポインター レジスタ (%rbp) を使用するインライン アセンブリによって C でセグメント フォルトが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-28 02:17:10593ブラウズ

Why Does My Inline Assembly Using the Base Pointer Register (%rbp) Cause a Seg Fault in C  ?

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 のベスト プラクティス:

  • インラインを維持するASM はできるだけ簡潔にし、コンパイラーが生成できない命令のみを含めるのが理想的です。
  • 使用ASM と C コード間のデータ フローを指定する入出力制約。
  • 大きなコード ブロックにはインライン ASM の使用を避けてください。代わりにアセンブリ関数を作成することを検討してください。

追加のヒント:

  • インライン ASM を使用する場合は、スタックの下の「レッド ゾーン」領域に注意してください。 pointer.
  • 入力制約を使用して入力のレジスタを指定できるため、明示的なレジスタの必要性が減ります。割り当て。
  • コードがフラグを変更する場合は、「cc」 (条件コード) 破壊を宣言します。

以上がベース ポインター レジスタ (%rbp) を使用するインライン アセンブリによって C でセグメント フォルトが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。