Quick start manual
13-18
Delphi Language Guide
Assembly procedures and functions
You can write complete procedures and functions using inline assembly language
code, without including a begin...end statement. For example,
function LongMul(X, Y: Integer): Longint;
asm
MOV EAX,X
IMUL Y
end;
The compiler performs several optimizations on these routines:
• No code is generated to copy value parameters into local variables. This affects all
string-type value parameters and other value parameters whose size isn’t 1, 2, or 4
bytes. Within the routine, such parameters must be treated as if they were var
parameters.
• Unless a function returns a string, variant, or interface reference, the compiler
doesn’t allocate a function result variable; a reference to the @Result symbol is an
error. For strings, variants, and interfaces, the caller always allocates an @Result
pointer.
• The compiler only generates stack frames for nested routines, for routines that
have local parameters, or for routines that have parameters on the stack.
• The automatically generated entry and exit code for the routine looks like this:
PUSH EBP ;Present if Locals <> 0 or Params <> 0
MOV EBP,ESP ;Present if Locals <> 0 or Params <> 0
SUB ESP,Locals ;Present if Locals <> 0
ƒ
MOV ESP,EBP ;Present if Locals <> 0
POP EBP ;Present if Locals <> 0 or Params <> 0
RET Params ;Always present
If locals include variants, long strings, or interfaces, they are initialized to zero but
not finalized.
• Locals is the size of the local variables and Params is the size of the parameters. If
both Locals and Params are zero, there is no entry code, and the exit code consists
simply of a RET instruction.
OR Bitwise OR. Both expressions must be absolute immediate values, and the result is an
absolute immediate value.
XOR Bitwise exclusive OR. Both expressions must be absolute immediate values, and the
result is an absolute immediate value.
Table 13.7 Definitions of built-in assembler expression operators (continued)
Operator Description