主要なC / C ++コンパイラーによって生成されたコードに割り当て規則を登録する

StackOverflow https://stackoverflow.com/questions/256220

質問

C / C ++コンパイラ(私の場合はBorland / Turboで生成されたアセンブリ出力を分析しなければならない(少なくとも私にとって)非常に頻繁だった昔(32ビット以前のIntelプロセッサ)のルールを覚えていますそのとき)パフォーマンスのボトルネックを見つけ、アセンブリルーチンとC / C ++コードを安全に混在させることができます。 SIレジスタを this ポインタに使用したり、AXを戻り値に使用したり、アセンブリルーチンが戻るときにレジスタを保存する必要があるなど。

今、私はもっと人気のあるC / C ++コンパイラー(Visual C ++、GCC、Intel ...)とプロセッサー(Intel、ARM、...)のリファレンスがあるかどうか、そしてそうでない場合はどこで見つけることができるのか疑問に思っていました1つを作成します。アイデア?

役に立ちましたか?

解決

「アプリケーションバイナリインターフェース」について尋ねています。 (ABI)および呼び出し規約。これらは通常、オペレーティングシステムとライブラリによって設定され、コンパイラとリンカーによって適用されます。 Google for" ABI"または「呼び出し規約」。 Wikipedia および Debian for ARM

他のヒント

Agner Fogの「呼び出し規約」このドキュメントは、とりわけ、WindowsおよびLinux 64および32ビットABIをまとめたものです。 http:// www .agner.org / optimize / calling_conventions.pdf 。レジスタの使用方法の概要については、10ページの表4を参照してください。

個人的な経験からの1つの警告:インラインアセンブリにABIに関する仮定を組み込まないでください。特定のレジスター(例:eax、rdi、rsi)で戻り値やパラメーターの転送を前提とする関数をインラインアセンブリで記述する場合、関数がコンパイラーによってインライン化されると、関数が中断します。

Open Watcom C / C ++コンパイラは、レジスタベース(デフォルト)とスタックベース(他のコンパイラが使用するものに非常に近い)の2つの呼び出し規約をサポートしています。このコンパイラのユーザーズガイドでは、これらの両方について説明し、無料で入手できますオンライン 、コンパイラー self と共に。ユーザーガイドのこれらのトピックは、特に役立つ場合があります。

  • 10.4.1レジスタベースの呼び出し規約を使用して引数を渡す
  • 10.4.6スタックベースの呼び出し規約の使用
  • 10.5 80x87ベースのアプリケーションの呼び出し規約

まあ、今日、最適化がオンになっている場合、何もありません。ただし、GCCでは、アセンブリ命令がレジスタにあるかどうかに関係なく特定の変数を使用する必要があることを宣言したり、GCC tuを命令で使用可能なレジスタに強制的に入れたりすることさえできます。インラインアセンブリブロックの予約を登録するものを宣言することもできます(したがって、コンパイラは、必要に応じて、インラインピースの周りに適切な保存/復元コードを生成する必要があります)

私は信じていますが、GCCが Itanium ABI のほとんどの機能。それとそれが使用するABIの非互換性は文書化

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top