Note: If the operand-size attribute of ENTER is 16 bits, BP and SP are used and n = 2; if 32 bits, EBP and ESP are used and n = 4.
ENTER creates the a stack frame that can be used to implement the rules of block-structured, high-level languages. A LEAVE instruction at the end of the procedure complements ENTER.
ENTER has two parameters. The first specifies the number of bytes of dynamic storage to be allocated on the stack for the routine being entered. The second paramter corresponds to the lexical nesting level (0 to 31) of the routine within the high-level language source code. This level determines how many sets of stack frame pointers the CPU copies into the new stack frame from the preceding stack frame. This list of stack frames is often called the display. Lexical level has no relationship to either the protection levels or to the I/O privilege level.
ENTER creates the new display for a procedure. Then it allocates the dynamic storage space for that procedure by decrementing eSP by the number of bytes specified in the first parameter. This new value of eSP serves as the starting point for all PUSH and POP operations within that procedure.
ENTER can be used either nested or non-nested. If the lexical level is zero, the non-nested form is used (enter n,0). The main procedure operates at the highest logical level, level 1. The first procedure it calls operates at the next deeper level, level 2, etc. A level 2 procedure can access the variables in the main program because a program operating at a higher logical level (calling a program at a lower level) requires that the called procedure have access to the variables of the calling program.
A procedure calling another procedure at the same level implies that they are parallel procedures and should not have access to the variables of the calling program. The new stack frame does not include the pointer for addressing the calling procedure's stack frame. ENTER treats a re-entrant procedure as a procedure calling another procedure at the same level.
Note Some assemblers support ENTER extensions that force the use of SP,BP (ENTERW) or ESP,EBP (ENTERD) regardless of the code segment's size attribute (80386+).