11.12 Transferring parameters to stacked functions via registers

-----------------------------------------------------------------

Transferring parameters via registers most often produces smaller and

faster code. But the contents of the registers can easily be destroyed. If

any of the parameters in a function is used once to initialize some

register at the beginning of the function, then this value can be

transferred to the function immediately via the register, omitting the

stage of push and pop of the contents to the stack.

For example:

int proc (int param1, param2, param3)

{

(E)BX = param3;

(E)BX.TEG_STRUCT.var = proc2 (param1,papra2);

proc3 (param1,param2);

}

In the following example param3 is used only to initialized (E)BX,

therefore it can immediately be transferred via the register:

int proc (int param1, param2, (E)BX)

{

(E)BX.TEG_STRUCT.var = proc2 (param1,papra2);

proc3 (param1,param2);

}

As you can see, the function has been somewhat simplified.

In theory, the order of stack and register parameters is not important.

But note that the contents of registers can easily be destroyed and

therefore it is best to initialize register parameters only after all stack

parameters have been pushed to the stack. For 'pascal' type functions the

register parameters are best located after the stack parameters. For

'cdecl' and 'stdcall' type functions, it is best to first locate the

register parameters.