Why pop takes a parameter in assembly?
Solution 1
From http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
pop — Pop stack
The pop instruction removes the 4-byte data element from the top of the hardware-supported stack into the specified operand (i.e. register or memory location). It first moves the 4 bytes located at memory location [SP] into the specified register or memory location, and then increments SP by 4.
Syntax
pop <reg32>
pop <mem>Examples
pop edi — pop the top element of the stack into EDI.
pop [ebx] — pop the top element of the stack into memory at the four bytes starting at location EBX.
Another good reference is http://en.wikibooks.org/wiki/X86_Assembly and it is available in PDF form.
Solution 2
this parameter sets destination.
Solution 3
To expand on Andrey's answer, in addition to incrementing the stack pointer over the popped element, the popped element is also copied to a destination address or register.
The instruction you gave is more or less equivalent to the two instructions (Intel syntax)
add esp, 4 # increment the stack pointer
mov ebp, [esp - 4] # load what ESP was pointing to
which I think is this in att (gas) syntax
add $4, %esp
mov -4(%esp), %ebp
Of course pop
doesn't modify FLAGS (so imagine doing the add
with LEA), and it's not interruptible between the load and add.
For the special case of pop esp
, doing the load 2nd in the pseudocode replicates the actual documented behaviour of incrementing before data from the old top-of-stack location is written to ESP. And of doing the increment before address calculation for a memory-destination pop using %esp
as part of the addressing mode, like popl 12(%esp, %edx, 4)
Mask
Updated on July 10, 2022Comments
-
Mask almost 2 years
popl %ebp
It seems the
%ebp
is unnecessary because thepop
operation of stack doesn't need a parameter.Why does it make sense?