以下の例は、わかりやすく例示するためにのみ記載されたものです。これらの例では、ユーザーがアセンブラーのプログラミングに習熟していることが前提になっています。これらの例では、スタックはページの下方へ伸びていきます。また、ESP は常に、スタックの上部を指します。
次の呼び出しでは、a, b, および c は 32 ビットの整数であり、func は 2 つのローカル変数 x および y (両方とも 32 ビットの整数) を持ちます。
m = func(a,b,c)
FUNC に対する呼び出しのスタックは次のようになります。
スタック
*------------------------* 上位メモリー
| c |
*------------------------*
| b |
*------------------------*
| a |
*------------------------*
| 呼び出し側の EIP |
*------------------------*
| 呼び出し側の EBP |
EBP ----> *------------------------*
| x |
*------------------------*
| y |
*------------------------* <--
| 保管 EDI | |
*------------------------* | これらは、この
| 保管 ESI | | 関数で使用される
*------------------------* | 場合のみプッシュ
| 保管 EBX | | されます。
ESP ----> *-----------------------* <--
下位メモリー
スタック上にこの活動化レコードを作成するのに使用される命令は、呼び出し側では次のようになります。
PUSH c
PUSH b
PUSH a
CALL _func@12
.
.
MOV m, EAX
.
.
呼び出し先では、コードは次のようになります。
_func@12 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 0CH
_func@12 ENDP
保管レジスター・セットは EBX、ESI、および EDI です。
構造体はスタック上には戻されません。呼び出し側は、戻される構造体が置かれるアドレスを、最初の隠しパラメーター字句としてプッシュします。 構造体を戻す関数は、すべてのパラメーターが、構造体が戻されない場合のパラメーターよりも、EBP から 4 バイト遠くに 離れるように注意する必要があります。戻される構造体のアドレスは、EAX に戻されます。