2011-09-17 19 views
5

Cがどのように値を渡すかについて私が知っている唯一のことは、レジスタまたはスタックのどちらかを使って行われることです。Cで関数引数はどのように渡されますか?

登録またはスタック?まったく?

+2

技術的にはこれは実装の詳細なので、各Cコンパイラは関数の引数を渡すことができます。 – jwodder

答えて

5

両方。また、規約はプラットフォームによって異なります。

x86では、値は通常スタックによって渡されます。 x64では、レジスタを渡すことが推奨されます。

パラメータが多すぎる場合は、スタックによって渡す必要があります。

は、彼らがスタックに渡され、通常の関数呼び出しのために(指摘したように、いくつかのコンパイラは違っそれを行います)一般的にx86 calling conventions

+2

指定されたアーキテクチャでも呼び出し規約に違いがあることにも注意してください。 'cdecl'(Linuxでは?)と' stdcall'(WinAPI?)を比較してください。 –

+1

合意。そのウィキペディアページの一番下には、異なるOSの、そして同じOS内のさまざまな表記法を示すチャートがあります。 – Mysticial

+0

@Mystical良いリンクですが、私はいくつかの追加情報を答えの中に入れなければならないと思います。 –

3

を参照してください。それは通常、データをスタックに入れる一連のプッシュ命令です。

システムコールのように、アセンブリ命令とレジスタを介してパラメータが渡される特別なケースがあります。ハードウェアの場合、レジスタまたは特定の割り込み信号を介して渡され、結果的にレジスタに書き込まれます。

多数のレジスタを持つアーキテクチャでは、通常、いくつかのRISCや64ビットアーキテクチャなどのレジスタを経由して渡されます。

関連する問題