The following example shows code sequences, run-time stack layouts, and floating-point register stack states for a call to the routine fred. For simplicity, the general-purpose registers are not shown.
double fred(float p1, double p2, long double p3, float p4, double p5); double a, b, c; float d, e; a = b + fred(a, d, (long double)(a + c), e, c);
Caller's code up until call:
PUSH 2ND DWORD OF c ; Push upper 4 bytes of c onto stack
PUSH 1ST DWORD OF c ; Push lower 4 bytes of c onto stack
FLD DWORD_PTR e ; Load e into 80387, promotion
; requires no conversion code
FLD QWORD_PTR a ; Load a to calculate p3
FADD ST(0), QWORD_PTR c ; Calculate p3, result is long double
; from nature of 80387 hardware
FLD DWORD_PTR d ; Load d, no conversion necessary
FLD QWORD_PTR a ; Load a, demotion requires conversion
FSTP DWORD_PTR [EBP - T1] ; Store to a temp (T1) to convert to float
FLD DWORD_PTR [EBP - T1] ; Load converted value from temp (T1)
SUB ESP, 32 ; Allocate the stack space for
; parameter list
CALL FRED ; 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
Callee's epilog code:
FLD RETVAL ; Load return value onto floating-point stack 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, 40 ; Remove parameters from stack FADD QWORD_PTR b ; Use return value FSTP QWORD_PTR a ; Store expression to variable a
![]()
Examples of Passing Parameters Using
_Optlink