- アセンブリでは、C標準ライブラリ関数を呼び出す前にレジスタをバックアップする必要がありますか?
- 標準ライブラリは、そのすべての関数が呼び出し元のレジスタをバックアップし、最終的にそれらを回復することを保証しますか?
- この問題に関する公式情報はどこにありますか?
3 に答える
ここでは、呼び出し規約だけが適用されると思います。http://en.wikipedia.org/wiki/X86_calling_conventions
C標準ライブラリは、呼び出し元の関数バックアップレジスタを保証するものではありません。これは、呼び出し規約と、コンパイラーによる処理方法によって異なります。
C関数はレジスタについて何も知らないと仮定します。
関数が使用している呼び出し規約を見つけて、関数の宣言/署名を作成します。デフォルトはcdeclである必要があります。
これはプラットフォーム固有であり、通常、呼び出しサイトでレジスタを特別に保存および復元する必要はありません。通常、呼び出し先がそれを行います。特定のプラットフォームのリンケージ規則に従う必要があります。Cライブラリはステートレスではありません。通常、main()を含む一般的なcプログラムオブジェクトで行われるため、ライブラリを初期化せずに一部の関数を呼び出すことはお勧めできません。
これは、ハードウェア固有の質問ではなく、プラットフォーム固有の質問です。C標準ライブラリは、Cプログラムから呼び出されるように設計されており、呼び出し規約は(通常)コンパイル時に処理され、適切なレジスタとスタックの操作が自動的に行われます。
外部にリンクされた関数を呼び出す方法を決定するには、プラットフォームのプラットフォーム固有のABIガイドを参照してください。