The following example shows the code sequences and a picture of the stack for a call to the function foo:
long foo(char p1, short p2, long p3, long p4);
short x;
long y;
y = foo('A', x, y+x, y);
Caller's code surrounding call:
PUSH y ; Push p4 onto the run-time stack
SUB ESP, 12 ; Allocate stack space for
; register parameters
MOV AL, 'A' ; Put p1 into AL
MOV DX, x ; Put p2 into DX
MOVSX ECX, DX ; Sign-extend x to long
ADD ECX, y ; Calculate p3 and put it into ECX
CALL FOO ; Make call
Callee's prolog code:
PUSH EBP ; Save caller's EBP MOV EBP, ESP ; Set up callee's EBP SUB ESP, callee's local size ; Allocate callee's Local PUSH EBX ; Save preserved registers - PUSH EDI ; will optimize to save PUSH ESI ; only registers callee uses
Note: The term undefined in registers EBX, EDI, and ESI refers to the fact that they can be safely overwritten by the code in foo.
Callee's epilog code:
MOV EAX, RetVal ; Put return value in EAX POP ESI ; Restore preserved registers POP EDI POP EBX MOV ESP, EBP ; Deallocate callee's local POP EBP ; Restore caller's EBP RET ; Return to caller
Caller's code just after call:
ADD ESP, 16 ; Remove parameters from stack MOV y, EAX ; Use return value.
![]()
Examples of Passing Parameters Using
_Optlink