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. 厳格な値の比較(より小さい/大きい)
- 2. 最大10進値より大きい数値での作業
- 3. RXSwiftどのように戻り値
- 4. 最大値より大きい数値を表す方法
- 5. ASP.NET CommandName値とCommandArgument値はどのように格納されますか?
- 6. CSS:どのように大きな(より制限の少ない)値
- 7. forloop.counterでDjangoテンプレートタグをより大きい値で使用するにはどうすればよいですか?
- 8. javascript変数の数値よりも大きい数値は何ですか?
- 9. 分解値のカウントが0より大きいかどうかをチェック
- 10. bash配列にコマンド戻り値を格納する方法
- 11. C++での戻り値型でオーバーロードできないようにする方法
- 12. どのようにSOAの操作の戻り値を処理する大きなリストを処理する
- 13. datetime値はどのようにmysqlに格納されますか?
- 14. jsはどのようにUIWebViewのメソッドを呼び出して戻り値を取得できますか?
- 15. xより大きい場合に配列の値を置き換えます
- 16. どのようにsqlDataReaderから値を格納できますか?と比較する?
- 17. getHeight()とgetWidth()の戻り値が大きすぎます。
- 18. フォークされた10個の子プロセス、親プロセスはどのように戻り値を収集できますか?
- 19. UInt64(C#)より大きい数値を扱う方法
- 20. Entity Framework CFは「オブジェクト型」の値を格納できますか?
- 21. PIC16F882のTimer0の値が最大値より大きい場合PRESCALER
- 22. 大きなデータセットの平均値に基づいて合格/不合格の値を割り当てます
- 23. xslに値の合計を格納できますか?
- 24. 大きな値のデータ型を別のテーブルに格納する必要がありますか?
- 25. どのように私はアンドロイドデバイスにデータベースを格納できますか?
- 26. ExtJS 4 celleditorコンボボックス戻り値
- 27. BrowserManager戻り値null - Flex 4
- 28. System.Void型は、値を返さないメソッドの戻り値型をどのように指定しますか?
- 29. 深さの値が1より大きいか?
- 30. jqueryの戻り値from.postはブール値が、どのように条件
この質問に対する回答を見る:http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –