2

私は32ビットの呼び出し規約の違いについて読んでいます。fastcallstdcall試練です。

私が読んだところによると、2つの規則には大きな混乱があり、この混乱を避けるために64ビットが標準化されました。

私は尋ねなければなりません、なぜfastcall選ばれたのですか?

また、fastcallstdcallはwin32用語であるため、引数を渡すためにレジスタを使用する、または使用しない関数呼び出しのUNIX用語は何ですか?

4

1 に答える 1

3

x86 Calling Conventions - ウィキペディア (フリー百科事典)にリストがあります。

x86-32 での一般的な呼び出し規約はcdecl. __attribute__((regparm(n)))GCC は、引数がレジスターによって渡されることを示す関数属性を提供しますnが、これは と同じではありませんfastcall。どちらの方法でも、引数は呼び出し先で破壊可能なレジスタに渡されるため、cdecl(for regparm) およびstdcall(for ) に関連する関数呼び出しに追加のコストはかかりません (また、引数用のスタック領域を追加してからクリーンアップする労力を節約できますfastcall)。

混乱を避けるために、Windows と Linux の x86-64 呼び出し規則は、x86-32 の呼び出し規則とは異なり、互いに異なります。どちらも ではありませんが、どちらもfastcallかなりの数のレジスタを使用して引数を渡します。

于 2012-07-10T23:29:03.153 に答える