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)
その後、このルーチンは、スタック・フレーム内のローカル変数に戻りポインタを保存します。