The Intel 80386, part 9: Stack frame instructions
There are a pair of specialized instructions for creating and tearing down stack frames.
ENTER i16, 0 ; push ebp ; mov ebp, esp ; sub esp, (uint16_t)i16
ENTER instruction sets up a stack frame for a new subroutine. It combines three instructions into one, so that what used to be encoded in eight bytes (1 + 2 + 5) is now encoded in four. However, even on the 80386, the combination instruction executes more slowly than the three component instructions, so this was always a size optimization, not a speed optimization.
LEAVE ; mov esp, ebp ; pop ebp
LEAVE instruction tears down the stack frame by reversing the effects of the
ENTER instruction. This is a one-byte instruction that replaces two instructions that together require three bytes (2 + 1), so it is a size optimization. But it also executes faster than the two instructions it replaces, so it is also a speed optimization.
Modern compilers avoid the
ENTER instruction but keep the
Bonus chatter: What’s with the second operand of the
In C code, the second operand is always zero because C doesn’t support lexically-nested procedures with inherited stack frames. So in practice, you will always see zero as the second parameter.
The second parameter can go up to 15, and it represents the number of additional values pushed onto the stack after pushing ebp.
ENTER i16, n ; push ebp ;n times ; ⎰ ; mov ebp, esp ; sub esp, (uint16_t)i16⎱
This means that the
ENTER instruction can read as many as fifteen 32-bit values from memory and can write as many as sixteen 32-bit values to memory. That’s a lot of memory access for a single instruction.
Next time, we’ll look at atomic operations and memory alignment.