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 |
|
|
|
| |
|