x86-32アセンブリでは、パラメータはスタックに格納されますが、レジスタに格納されるパラメータはx86-64です。これの理由は何ですか?パラメータがレジスタに格納され、x86-64アセンブリのスタックに格納されないのはなぜですか?
答えて
RAMにアクセスするよりもCPUレジスタにアクセスする方が高速です(多くの場合)。
64ビットCPUには汎用レジスタがたくさんあります(64ビットとはまったく関係がありませんが、それは新しい/より大きなものだからです)。
も参照:https://en.wikipedia.org/wiki/Calling_convention –
誰かがx64をそのウィキペディアの記事に追加する必要があります... – Thilo
リンクされた記事:https://en.wikipedia.org/wiki/X86_calling_conventions –
往復のストア/リロードは、ストア転送のレイテンシが6サイクルに及ぶため、現代の呼び出し規約はより効率的な設計を使用します。呼び出し側はレジスタ内でargを生成し、それをプッシュしないので、命令によっても保存されることがあります。 (そして、復帰後にスタックをポップする必要はありません)。
x86-64は新しいモードなので、後方互換性の要件はありません。したがって、従来の手荷物のない新しいABIを設計することができました。 x86-64 SysV呼び出し規約の設計方法とWindows x86-64呼び出し規約よりも効率的な理由については、this answerを参照してください。 (赤いゾーン、より多くのargを渡すレジスタ)。これは、Windowsの規約よりも複雑です。特に、varargs関数の方がより複雑です。レジスタ内の最初のカップルの引数を渡す
も、32ビットのコードでは、より効率的であるが、新しい呼び出し規則を導入したライブラリとの下位compatの壊れます。
でも、MSは__fastcall
/__vectorcall
でそれを行いました。これは、32ビットモードでもargを渡すために2つのコールクローバ型レジスタ(ecxとedx)を使用しています。これらの呼び出し規約の64ビット版では、x86-64にはより多くのGPレジスタがあるため、より多くのarg-passingレジスタが使用されます。
Unix/Linuxは、32ビットの新しい呼び出し規約を導入しようとはしていませんが、基本的には古くなったレガシーコードとして遅くなってしまいます。 (32ビットのSysV ABIは、スタック上ではなく、16B SSEと32B AVXベクトルをベクトルregsに渡したり返すための規則で拡張されましたが。
呼び出し規約のドキュメントへのリンクはx86のタグwikiを参照し、ストア転送の待ち時間の詳細については、パフォーマンスリンクを参照してください。
- 1. スレッドのスタックには何が格納されていますか?
- 2. 値がNSDictionaryに格納されないのはなぜですか?
- 3. srand()が変数に格納されないのはなぜですか?
- 4. 入力値が配列に格納されないのはなぜですか?
- 5. スコープはスタックに格納されていますか?
- 6. オブジェクトはスタックに格納されていますか?
- 7. レジスタに格納される数値の大きさ
- 8. 入力データがデータベースに格納されていない - なぜですか?
- 9. 依存アセンブリのバージョンが参照アセンブリに格納されていますか?
- 10. 別のフォルダに格納されているアセンブリのクラスのマッピング
- 11. Arm Cortexアーキテクチャのローカル変数は、レジスタまたはスタックに格納されていますか?
- 12. CsvファイルのデータがJavaに格納されていない
- 13. アクセス番号の人は別のレジスタに格納されています
- 14. MIPSのレジスタにアドレスを格納する
- 15. 計算フィールド:DBに格納するか、格納しないか?
- 16. LC3コード、スタックに格納
- 17. ヒープまたはスタックに参照が格納されていますか?
- 18. パラメータに格納ストアドプロシージャ
- 19. GDBでスタックに格納された変数を見る方法
- 20. 1つのレコードがmysql dbに格納されない
- 21. HTMlフォームの値がデータベースに正しく格納されない
- 22. HDFSに格納されているシェルスクリプトにパラメータを渡す
- 23. 検索時にchrome.storage.syncに格納されたオブジェクトのメソッドが関数ではないのはなぜですか?
- 24. なぜ私のconst配列は、テキストセクションの代わりにスタックに格納されますか?
- 25. キーに格納された値が
- 26. データがdbに格納されるエラー
- 27. プロセスのレディキューには何が格納されていますか?
- 28. アセンブリ内のレジスタに格納されているメモリアドレスの内容をロードする方法は?
- 29. スプライトキットiOS7 - SKNode UserDataプロパティに値が格納されていない
- 30. Android-データベースに文字列が格納されていない
IA64は、歴史的な理由からx64ではありません。 – harold
x86パラメータの下では常にスタック上に存在し、決してレジスタ内には存在しないことを一般化することは悪いことです。それはすべて、呼び出し規約、渡されるデータのタイプ、およびパラメータの数に依存します。 –
1)できること2)もっと多くのレジスタ3)速度 –