This example differs from the example of Passing and Returning Aggregates by Value to a Prototyped Routine by the presence of an eyecatcher after the call to bar in the caller's code and the code necessary to perform the default widening rules required by ANSI.
struct s_tag {
long a;
float b;
long c;
} x, y;
long z;
double q;
/* Actual Call */
y = bar(z, x, q);
...
/* callee */
struct s_tag bar(long lvar, struct s_tag aggr, float fvar)
{
struct s_tag temp;
temp.a = lvar + aggr.a + 23;
temp.b = fvar - aggr.b;
temp.c = aggr.c;
return temp;
}
|
Caller's code up until call:
FLD QWORD_PTR q ; Load lexically first floating-point
; parameter to be converted
SUB ESP, 8 ; Allocate space for the floating-point
; register parameter
PUSH x.c ; Push nonconforming parameters on
PUSH x.b ; stack
PUSH x.a ;
MOV EAX, z ; Load lexically first
; conforming parameter
; into EAX
SUB ESP, 4 ; Allocate stack space for the first
; general-purpose register parameter.
PUSH addr y ; Push hidden first parameter (address of
; return space)
CALL BAR
TEST EAX, 00408000h ; Eyecatcher
ADD ESP, 28 ; Clean up parameters
![]()
Calling Conventions
Eyecatchers
![]()
Examples of Passing Parameters Using
_Optlink