以下の例は、わかりやすく例示するためにのみ記載されたものであり、最適化されていません。この例では、ユーザーがアセンブラーのプログラミングに習熟している ことが前提になっています。この例では、スタックはページの下方へ伸びていきます。また、ESP は常に、スタックの上部を指します。
以下の例は、2 つのローカル変数 x および y (両方とも fixed bin(31)) を持つ 関数 FUNC3 に対する呼び出しのときの、コード・シーケンスおよびスタックの図を示しています。次の呼び出しの場合、
dcl func3 entry( fixed bin(31),
fixed bin(31),
fixed bin(31) )
returns( fixed bin(31) )
options( byvalue nodescriptor linkage(system) );
m = func3(a,b,c);
FUNC3 に対する呼び出しのスタックは次のようになります。
スタック
.------------------------. 上位メモリー
| c |
|------------------------|
| b |
|------------------------|
| a |
|------------------------|
| 呼び出し側の EIP |
|------------------------|
| 呼び出し側の EBP |
EBP ------> |------------------------|
| x |
|------------------------|
| y |
|------------------------| <-.
| 保管 EDI | |
|------------------------| | これらは、この
| 保管 ESI | | 関数で使用される
|------------------------| | 場合のみプッシュ
| 保管 EBX | | されます。
ESP ------> .------------------------. <-.
下位メモリー
スタック上にこの活動化レコードを作成するのに使用される命令は、呼び出し側では次のようになります。
PUSH c
PUSH b
PUSH a
MOV AL, 3H
CALL func3
.
.
ADD ESP, 12 ; Cleaning up the parameters
.
.
MOV m, EAX
.
.
呼び出し先では、コードは次のようになります。
func3 PROC
PUSH EBP
MOV EBP, ESP ; Allocating 8 bytes of storage
SUB ESP, 8 ; for two local variables.
PUSH EDI ; These would only be
PUSH ESI ; pushed if they were used
PUSH EBX ; in this function.
.
.
MOV EAX, [EBP - 8] ; Load y into EAX
MOV EBX, [EBP + 12] ; Load b into EBX
.
.
XOR EAX, EAX ; Zero the return value
POP EBX ; Restore the saved registers
POP ESI
POP EDI
LEAVE ; Equivalent to MOV ESP, EBP
; POP EBP
RET
func3 ENDP
保管レジスター・セットは EBX、ESI、および EDI です。その他のレジスター (EAX、ECX、および EDX) は、呼び出し先ルーチンによって変更された内容を持つことができます。
状況によっては、コンパイラーは、EBP を使用せずに自動値またはパラメーター値に アクセスするため、アプリケーションの効率が向上する場合があります。使用されるかされないかに 関係なく、EBP は呼び出しを超えては変更されません。
値によって集合を受け渡す場合、コンパイラーは、80386 スタック上に集合をコピーするコードを生成します。 集合のサイズが 80386 のページ・サイズ (4K) より大きい場合、コンパイラーは、集合を逆方向にコピーするコードを生成します (つまり、集合の最後のバイトが最初にコピーされます)。
集合はスタック上には戻されません。呼び出し側は、戻される集合が置かれるアドレスを、最初の隠しパラメーター字句としてプッシュします。 集合を戻す関数は、すべてのパラメーターが、集合が戻されない場合のパラメーターよりも、EBP から 4 バイト遠くに 離れるように注意する必要があります。戻される集合のアドレスは、EAX に戻されます。