ホームページ >バックエンド開発 >C++ >ベース ポインター レジスタを使用した C インライン アセンブリで関数呼び出しのオーバーヘッドを回避するにはどうすればよいですか?

ベース ポインター レジスタを使用した C インライン アセンブリで関数呼び出しのオーバーヘッドを回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-26 15:02:10517ブラウズ

How Can C   Inline Assembly with the Base Pointer Register Avoid Function Call Overhead?

C インライン アセンブリのベース ポインター レジスタによる関数呼び出しのオーバーヘッドを回避する

C インライン アセンブリ内でベース ポインター レジスタ (%rbp) を利用するには、この修正されたコードに従ってくださいスニペット:

void Foo(int &x) {
    int tmp;
    long tmplong;
    asm volatile(
        "lea -16 + %[mem1], %%rbp\n\t"
        "imul , %%rbp, %q[reg1]\n\t"  // Register allocated to tmplong
        "add %k[reg1], %k[reg1]\n\t"    // Register allocated to tmp
        "movl , %[mem1]\n\t" // Store value in memory pointed to by tmp
        : [mem1] "=&m"(tmp), [reg1] "=r"(tmplong)
        :
        : "%rbp"
    );
    x = 5;
}

説明:

  • %RSP より下のレッド ゾーンを変更する代わりに、ローカル変数 tmp をインライン ASM のバッファとして使用します。 .
  • スクラッチ メモリはレッド ゾーンで提供され、%[mem1] および参照を通じてアクセスされます。 %rbp (ベース ポインタ レジスタ) を使用して正しいアドレスを計算します。
  • 「=m」制約 (メモリ オペランド) により、コンパイラは %[mem1] が指すメモリに tmp を保存します。
  • レジスタはコンパイラによって %[reg1] に割り当てられます。
  • 「: %rbp」クロバーlist は、%rbp がインライン アセンブリ内で変更され、その復元が可能になることをコンパイラに通知します。

追加メモ:

  • インライン アセンブリは単純にしてください。主にコンパイラが発行できない命令用です。明示的な mov 命令の代わりに制約を使用します。
  • 関数のプロローグとエピローグにはインライン アセンブリを使用するよりも、関数全体をアセンブリで記述することをお勧めします。
  • インライン アセンブリ タグ Wiki などの他のインライン アセンブリ リソースの使用を検討してください。および GNU C マニュアル。

以上がベース ポインター レジスタを使用した C インライン アセンブリで関数呼び出しのオーバーヘッドを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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