Intel 64 and IA-32 Architectures Software Developers Manual Volume 1, Basic Architecture

6-22 Vol. 1
PROCEDURE CALLS, INTERRUPTS, AND EXCEPTIONS
Block-structured languages can use the lexical levels defined by ENTER to control
access to the variables of nested procedures. In Figure 6-6, for example, if procedure
A calls procedure B which, in turn, calls procedure C, then procedure C will have
access to the variables of the MAIN procedure and procedure A, but not those of
procedure B because they are at the same lexical level. The following definition
describes the access to variables for the nested procedures in Figure 6-6.
1. MAIN has variables at fixed locations.
2. Procedure A can access only the variables of MAIN.
3. Procedure B can access only the variables of procedure A and MAIN. Procedure B
cannot access the variables of procedure C or procedure D.
4. Procedure C can access only the variables of procedure A and MAIN. Procedure C
cannot access the variables of procedure B or procedure D.
5. Procedure D can access the variables of procedure C, procedure A, and MAIN.
Procedure D cannot access the variables of procedure B.
In Figure 6-7, an ENTER instruction at the beginning of the MAIN procedure creates
three doublewords of dynamic storage for MAIN, but copies no pointers from other
stack frames. The first doubleword in the display holds a copy of the last value in the
EBP register before the ENTER instruction was executed. The second doubleword
holds a copy of the contents of the EBP register following the ENTER instruction. After
the instruction is executed, the EBP register points to the first doubleword pushed on
the stack, and the ESP register points to the last doubleword in the stack frame.
When MAIN calls procedure A, the ENTER instruction creates a new display (see
Figure 6-8). The first doubleword is the last value held in MAIN's EBP register. The
second doubleword is a pointer to MAIN's stack frame which is copied from the
second doubleword in MAIN's display. This happens to be another copy of the last
value held in MAIN’s EBP register. Procedure A can access variables in MAIN because
MAIN is at level 1.
Figure 6-6. Nested Procedures
Main (Lexical Level 1)
Procedure A (Lexical Level 2)
Procedure B (Lexical Level 3)
Procedure C (Lexical Level 3)
Procedure D (Lexical Level 4)