11.3 Register call functions
-----------------------------
A register function is defined by default using an identifier which
does not contain lower-case letters, or by clearly indicating that this is
a register function using the keyword fastcall.
As already noted, the parameters (if there are any) for a register
function are transferred via the registers. Register functions can have no
more than 6 parameters. If the parameters are of type 'int' or 'word', the
registers are by default used in the following order: AX, BX, CX, DX, DI,
SI. The first four parameters can also be of type 'char' or 'byte', in
which case registers AL, BL, CL and DL are activated. Any of the six
parameters may be of type 'long', 'dword' or 'float', in which case the
registers used are EAX, EBX, ECX, EDX, EDI or ESI.
In the following example, a register function named TOGETHER returns a
value of type 'word' as a result of multiplying the first parameters of
type 'word' by the second parameter of the same type.
word TOGETHER() /* AX = first parameter, BX = second parameter */
{
return (AX * BX);
}
In the following example a register function named SHOW_NUM, does not
return any value but instead prints to the screen the first parameter (of
type 'int'), a separator ':', and then the second parameter (of type
'byte').
void SHOW_NUM () /* AX = first number, BL = second number */
{
$ PUSH BX
WRITEINT (int AX);
WRITE (':');
$ POP BX
WRITEWORD (BL);
}
If, however, a function contains a declaration of the order and types
of the registers used, any desired use may be made of the registers. You
can read more about this in the chapter on declarations of paramters in
register functions.
For a register function to be used as a macro, it must be declared as a
dynamic function. Dynamic functions are described in the next chapter.