主要なC / C ++コンパイラーによって生成されたコードに割り当て規則を登録する
-
05-07-2019 - |
質問
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)で戻り値やパラメーターの転送を前提とする関数をインラインアセンブリで記述する場合、関数がコンパイラーによってインライン化されると、関数が中断します。
まあ、今日、最適化がオンになっている場合、何もありません。ただし、GCCでは、アセンブリ命令がレジスタにあるかどうかに関係なく特定の変数を使用する必要があることを宣言したり、GCC tuを命令で使用可能なレジスタに強制的に入れたりすることさえできます。インラインアセンブリブロックの予約を登録するものを宣言することもできます(したがって、コンパイラは、必要に応じて、インラインピースの周りに適切な保存/復元コードを生成する必要があります)
私は信じていますが、GCCが Itanium ABI のほとんどの機能。それとそれが使用するABIの非互換性は文書化。