EAXは32ビットプラットフォームで関数の戻り値を格納するために使用されていますが、関数の戻り値のサイズが4バイトより大きいかどうか疑問に思っています。この場合、OSはスタックに戻り値を保存し、スタックのアドレスをEAXに格納できますが、EAXに格納されている値が戻り値のアドレスか、実際には戻り値かどうかをOSがどのように伝えることができますか?eaxは4バイトより大きい値の戻り値をどのように格納できますか?
7
A
答えて
12
呼び出し元と呼び出し先は、レジスタとスタックの内容に同意する必要があります。これはcalling conventionと呼ばれ、application binary interface (ABI)という大きな概念の一部です。呼び出し先は、呼び出す方法を定義します(、つまり引数がスタックやレジスタなどにある必要があるかどうか)、コンパイラは生成するコードが呼び出し規約に準拠していることを確認します。
具体的な質問は、ABIに依存します。場合によっては、戻り値が4バイトより大きく8バイトより大きくない場合、EAXとEDXに分割することができます。しかし、ほとんどの場合、呼び出し側の関数はメモリ(通常はスタック)を割り当て、この領域へのポインタを呼び出された関数に渡します。
OSの役割は、あなたが考えるように重要ではないことにも注意してください。異なる呼び出し規約を持つバイナリは同じシステム上に共存でき、バイナリは内部的に異なる呼び出し規約を使用することさえできます。 OSのABIは、バイナリがシステムライブラリを呼び出すときにのみ重要です。
関連する問題
- 1. gdbは$ eaxに格納されている関数の戻り値に影響するようですか?
- 2. INT_MAXより大きい数値をintに格納する
- 3. ArrayListに格納されている値が数値より大きいかどうかを確認する
- 4. 戻り値はどのように出力できますか?
- 5. 0より大きい場合、UPDATE値はどのようにですか?
- 6. map.keyで文字列値をどのように格納できますか?
- 7. SQLより大きいSQL文がより小さい値とより大きい値を返します
- 8. int main()の戻り値はどこに格納されていますか?
- 9. JavaScript関数の戻り値にローカルスコープ変数がどのように格納されているのですか?
- 10. 配列の値より大きい数値を別の配列に格納する
- 11. 厳格な値の比較(より小さい/大きい)
- 12. geolocation.getCurrentPositionはどのように戻り値を返しますか?
- 13. RXSwiftどのように戻り値
- 14. 最大10進値より大きい数値での作業
- 15. 戻り値がlongより大きい場合にメソッドからlongを返す方法はありますか?
- 16. IFより大きい値のセル
- 17. pandas groupbyの値よりも大きいアイテムを数えよう
- 18. ASP.NET CommandName値とCommandArgument値はどのように格納されますか?
- 19. 最大値より大きい数値を表す方法
- 20. CSS:どのように大きな(より制限の少ない)値
- 21. リストに値を格納できるようにするにはどうしたらいいですか?
- 22. JavaでBigIntegerより大きい大きな数値を扱う方法は?
- 23. 複数の戻り値を格納する方法は?
- 24. 大きい.txtファイルの値を配列に格納する
- 25. Chromeビュー値関数の戻り値(変数には格納されません)
- 26. forloop.counterでDjangoテンプレートタグをより大きい値で使用するにはどうすればよいですか?
- 27. テーブルに複数の戻り値を格納する方法
- 28. SUMIFより大きい値とWorkdayカラム
- 29. DataTrigger数値より大きい場合
- 30. 整数より大きい値
この質問に対する回答を見る:http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –