2012-03-20 14 views
7

EAXは32ビットプラットフォームで関数の戻り値を格納するために使用されていますが、関数の戻り値のサイズが4バイトより大きいかどうか疑問に思っています。この場合、OSはスタックに戻り値を保存し、スタックのアドレスをEAXに格納できますが、EAXに格納されている値が戻り値のアドレスか、実際には戻り値かどうかをOSがどのように伝えることができますか?eaxは4バイトより大きい値の戻り値をどのように格納できますか?

+0

この質問に対する回答を見る:http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

答えて

12

呼び出し元と呼び出し先は、レジスタとスタックの内容に同意する必要があります。これはcalling conventionと呼ばれ、application binary interface (ABI)という大きな概念の一部です。呼び出し先は、呼び出す方法を定義します(、つまり引数がスタックやレジスタなどにある必要があるかどうか)、コンパイラは生成するコードが呼び出し規約に準拠していることを確認します。

具体的な質問は、ABIに依存します。場合によっては、戻り値が4バイトより大きく8バイトより大きくない場合、EAXとEDXに分割することができます。しかし、ほとんどの場合、呼び出し側の関数はメモリ(通常はスタック)を割り当て、この領域へのポインタを呼び出された関数に渡します。

OSの役割は、あなたが考えるように重要ではないことにも注意してください。異なる呼び出し規約を持つバイナリは同じシステム上に共存でき、バイナリは内部的に異なる呼び出し規約を使用することさえできます。 OSのABIは、バイナリがシステムライブラリを呼び出すときにのみ重要です。

関連する問題