Intel レジスタ保存規則 (32 ビット)

ebx、esi、および edi の内容は、サブルーチン呼び出し間で維持される必要があります。サブルーチンでこれらのレジスタのいずれかが使用されている場合は、サブルーチンは元の値を保存し、呼び出し元に返す前にその値を復元する必要があります。

レジスタ eax、ecx、および edx は、スクラッチ レジスタです。サブルーチンは、以前の値を保存せずに、スクラッチ レジスタの値を変更できます。

Intel 浮動小数点コプロセッサが使用されている場合、サブルーチンへのエントリ前およびサブルーチンの終了時に、浮動小数点スタック レジスタを空にする必要があります。ただし、サブルーチンが浮動小数点値を返す場合、値はレジスタ fp0 のスタックの最上位で返され、残りのスタックは空になります。

呼び出されたプロシージャ用の新しいスタック フレームの設定、および維持されているすべてのレジスタの保存と復元は、そのプロシージャ自身が行います。プロシージャは、次のシーケンスでスタック フレームを設定します。

pushl ebp
movl esp, ebp
subl #framesize, esp
pushl ebx         //only if used within function
pushl esi         //only if used within function
pushl edi         //only if used within function

-opt が指定されている場合は、コード シーケンスが短縮される場合があります。

戻りでは、すべての関数の結果の値を保存し、使用した維持されているレジスタをすべて復元し、スタック フレームをポップして、呼び出し元に返す必要があります。

戻り用一時記憶域を必要とするデータ型のいずれかを返すプロシージャでは、スタック エントリから余分なポインター (1 つまたは複数) を削除する必要があります。このようなルーチンの呼び出し元は、これらの非表示の引数をプッシュするためです。呼び出されたルーチンは、値を返す前に、呼び出し元から渡された戻り領域を指すポインターと一緒に、レジスタ eax をロードする必要があります。このようなルーチンは、フレームを設定する前に、次のコードで開始されます。

popl edx
xchgl edx, 0 (esp)

その後、このルーチンは、スタック フレーム内のローカル変数に戻りポインターを保存します。