4

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

今私は、より一般的な C/C++ コンパイラ (Visual C++、GCC、Intel...) とプロセッサ (Intel、ARM、...) のリファレンスがあるかどうか疑問に思っていました。 1。アイデア?

4

5 に答える 5

11

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

于 2008-11-01T23:43:41.117 に答える
1

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

  • 10.4.1 レジスタベースの呼び出し規約を使用して引数を渡す
  • 10.4.6 スタックベースの呼び出し規約の使用
  • 10.5 80x87 ベースのアプリケーションの呼び出し規約
于 2008-11-03T10:05:44.447 に答える
0

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

于 2008-11-01T23:47:08.003 に答える
0

私は、GCCがその機能のほとんどにItanium ABIを使用していると信じていますが、決して確信はありません。それとそれが使用する ABI との間の非互換性は文書化されています。

于 2008-11-02T00:11:51.260 に答える