以下の例は、わかりやすく例示するためにのみ記載されたものです。最適化されているわけではありません。これらの例では、ユーザーがアセンブラーのプログラミングに習熟していることが前提になっています。これらの例では、スタックはページの下方へ伸びていきます。また、ESP は常に、スタックの上部を指します。
次の呼び出しを考えてみます。
m = func(a,b,c);
変数 a, b, および c は 32 ビットの整数であり、FUNC は 2 つのローカル変数 x および y (両方とも 32 ビットの整数) を持ちます。
FUNC に対する呼び出しのスタックは次のようになります。
スタック
*------------------------* 上位メモリー
| c |
*------------------------*
| b |
*------------------------*
| a |
*------------------------*
| 呼び出し側の EIP |
*------------------------*
| 呼び出し側の EBP |
EBP ----> *------------------------*
| x |
*------------------------*
| y |
*------------------------* <--
| 保管 EDI | |
*------------------------* | これらは、この
| 保管 ESI | | 関数で使用される
*------------------------* | 場合のみプッシュ
| 保管 EBX | | されます。
ESP ----> *------------------------* <--
下位メモリー
スタック上にこの活動化レコードを作成するのに使用される命令は、呼び出し側では次のようになります。
PUSH c
PUSH b
PUSH a
CALL _func
.
.
ADD ESP, 12 : cleaning up the parameters
.
.
MOV m, EAX
.
.
呼び出し先では、コードは次のようになります。
_func PROC
PUSH EBP
MOV EBP, ESP ; Allocating 8 bytes of storage
SUB ESP, 08H ; 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
_func ENDP
保管レジスター・セットは EBX、ESI、および EDI です。構造体が値パラメーターとして 受け渡され、構造体のサイズが 5、6、7、または 8 バイトより大きい場合、戻り値を置くアドレスは、隠しパラメーターとして受け渡され、アドレスは EAX に戻されます。