2012-04-02 8 views
0

私はこの時点でC呼び出し規約に慣れています(Nasm - C calling conventionで説明)。この同じソースには、パスカルスタイルの呼び出し規約も記載されています。Cの呼び出し規約に代わるものはありますか?良い資源?利点/欠点?

私はさまざまな関数呼び出し規約(説明または情報源)を理解しようとしていますか?また、あるものを使用することの利点や欠点は何ですか?

注:ほとんどの場合、x86プラットフォームに関心がありますが、他のものを記述することは大歓迎です。 C呼び出し規約に

+0

興味のあるタグを追加してください。おそらくはパスカルかもしれません。 – Mahesh

+2

@Mahesh:これは、呼び出し規約について言えば、言語を暗示するタグを追加しません。 – sbi

+0

@Mahesh:わかりません。私の提案は、Cタグを削除し、アセンブリー/言語に依存しないものを追加することです。 –

答えて

2

大きな利点がある:可変引数の

  1. 取り扱い。 Cの呼び出し規約では、呼び出し側がスタックをプッシュして離します。呼び出し側は、渡しを行っているので、渡された引数の数を知っています。さもなければ、被呼者は何とかそれを把握しなければならない。彼らはとにかく、もし彼らがを使用したいのであれば、それは間違っている場合、なぜそれらにスタックを粉砕する機会を与えるか、varargs、を使用しますか?したがって、呼び出し先がクリーンアップされている言語は、varargsをサポートしない傾向があります。
  2. あなたのコードはC(とほとんどのC++)とリンク互換です。あなたはglibpascalについて多くのことを聞いていないのですか?そうは思わなかった。

レジスタベースの呼び出しも便利です。多くのCコンパイラが、整数/ポインタをスタックにプッシュするのではなく、最適化するためにこれを行うと思いますが、もちろんライブラリでは外部から見える関数ではありません。

慣例についての全体的なポイントは、それらが従来のであることです。大会に従うことは、大会に従う他の人々が何を期待するかを知っているので、大会に従うことは理にかなっています。だから、本当にそれを考えすぎないでください。これは、群衆の後に目に見えるメリットが生じる場合です。

+0

呼び出し元スタックのクリーンアップ対呼び出し先スタックのクリーンアップの議論もあります。後者では、コードが短くなることがあります。 –

+0

「ret」ではなく「ret 12」を実行してから「esp、12を追加」することができますか?はい、私は実際にオペコードを保存したかったのは覚えていません。あなたはできる? (真に興味がある - おそらく、人々がまだこれらのことを気にしている場合があります) –

+1

引数は、呼び出し先のスタックをクリーンアップすると、関数を呼び出すときにクリーンアップコードを複製する必要はない。もちろん、これは大きな問題ではなく、 'cdecl'は別のアプローチになりますが、これは違いの1つです。組み込みシステムでは、これが考慮すべき要素になります。 –

関連する問題