ENTER constructs a stack frame for a high-level language
procedure call. The first operand (the iw in the opcode
definition above refers to the first operand) gives the amount of
stack space to allocate for local variables; the second (the ib
above) gives the nesting level of the procedure (for languages like
Pascal, with nested procedures).
The function of ENTER, with a nesting level of zero, is
equivalent to
PUSH EBP ; or PUSH BP in 16 bits
MOV EBP,ESP ; or MOV BP,SP in 16 bits
SUB ESP,operand1 ; or SUB SP,operand1 in 16 bits
This creates a stack frame with the procedure parameters accessible
upwards from EBP, and local variables accessible downwards from
EBP.
With a nesting level of one, the stack frame created is 4 (or 2)
bytes bigger, and the value of the final frame pointer EBP is
accessible in memory at [EBP-4].
This allows ENTER, when called with a nesting level of two, to
look at the stack frame described by the previous value of
EBP, find the frame pointer at offset -4 from that, and push it
along with its new frame pointer, so that when a level-two procedure
is called from within a level-one procedure, [EBP-4] holds the
frame pointer of the most recent level-one procedure call and
[EBP-8] holds that of the most recent level-two call. And so on,
for nesting levels up to 31.
Stack frames created by ENTER can be destroyed by the LEAVE
instruction: see LEAVE.