When a function or procedure is called, then the following is done by the compiler:
- If there are any parameters to be passed to the procedure, they are stored in well-known
registers, and if there are more parameters than free registers, they are pushed from
left to right on the stack.
- If a function is called that returns a variable of type String, Set, Record, Object or
Array, then an address to store the function result in, is also passed to the procedure.
- If the called procedure or function is an object method, then the pointer to self is
passed to the procedure.
- If the procedure or function is nested in another function or procedure, then the frame
pointer of the parent procedure is passed to the stack.
- The return address is pushed on the stack (This is done automatically by the instruction
which calls the subroutine).
The resulting stack frame upon entering looks as in table (6.5).
| Table 6.5: | Stack frame when calling a procedure (32-bit model) |
|
|
| | Offset | What is stored | Optional? |
|
|
| | +x | extra parameters | Yes |
| +12 | function result | Yes |
| +8 | self | Yes |
| +4 | Return address | No |
| +0 | Frame pointer of parent procedure | Yes |
|
|
| | |
|