AngoLinux

80386 Programmer's Reference Manual -- Opcode ENTER


ENTER -- Make Stack Frame for Procedure Parameters

OpcodeInstructionClocks DescriptionExample
C8 iw 00enterw imm16,010 Make procedure stack frameenterw $0x7fff,$0
C8 iw 01enterw imm16,112 Make stack frame for procedure parametersenterw $0x7fff,$1
C8 iw ibenterw imm16,imm815+4(n-1) Make stack frame for procedure parametersenterw $0x7fff,$0x7f

Operation




level := level MOD 32
IF OperandSize = 16 THEN Push(BP) ELSE Push (EBP) FI;
   (* Save stack pointer *)
frame-ptr := eSP
IF level > 0
THEN (* level is rightmost parameter *)
   FOR i := 1 TO level - 1
   DO
      IF OperandSize = 16
      THEN
         BP := BP - 2;
         Push[BP]
      ELSE (* OperandSize = 32 *)
         EBP := EBP - 4;
         Push[EBP];
      FI;
   OD;
   Push(frame-ptr)
FI;
IF OperandSize = 16 THEN BP := frame-ptr ELSE EBP := frame-ptr; FI;
IF StackAddrSize = 16
THEN SP := SP - First operand;
ELSE ESP := ESP - ZeroExtend(First operand);
FI;

Description

ENTER creates the stack frame required by most block-structured high-level languages. The first operand specifies the number of bytes of dynamic storage allocated on the stack for the routine being entered. The second operand gives the lexical nesting level (0 to 31) of the routine within the high-level language source code. It determines the number of stack frame pointers copied into the new stack frame from the preceding frame. BP (or EBP, if the operand-size attribute is 32 bits) is the current stack frame pointer.

If the operand-size attribute is 16 bits, the processor uses BP as the frame pointer and SP as the stack pointer. If the operand-size attribute is 32 bits, the processor uses EBP for the frame pointer and ESP for the stack pointer.

If the second operand is 0, ENTER pushes the frame pointer (BP or EBP) onto the stack; ENTER then subtracts the first operand from the stack pointer and sets the frame pointer to the current stack-pointer value.

For example, a procedure with 12 bytes of local variables would have an ENTER 12,0 instruction at its entry point and a LEAVE instruction before every RET. The 12 local bytes would be addressed as negative offsets from the frame pointer.

Flags Affected

None

Protected Mode Exceptions

#SS(0) if SP or ESP would exceed the stack limit at any point during instruction execution; #PF(fault-code) for a page fault

Real Address Mode Exceptions

None

Virtual 8086 Mode Exceptions

None


[Home Page dell'ITIS "Fermi"] [80386 Programmer's Reference Manual Index] [Previous] [Next]