我在这个stackoverflow线程中掌握答案有困难。https://stackoverflow.com/a/1395646
在答案中间写着Most function prologs look something like:...
根据我对上述答案中说明的理解——>第一条指令将ebp推入堆栈。然后我们把esp移到ebp。最后,我们从esp中减去20,使esp点20从原来的位置向下移动。
根据上面的说明,我将堆栈可视化如下:
high address
__________________________
| (an address) | <-- ebp
..........................
..........................
| | <-- esp points to an address 20
| | bytes lower
| |
| |
| |
|________________________|
low address
如果这个可视化是正确的,那么当你甚至没有任何关于下一个局部变量可以放在哪里的引用时,你怎么能在堆栈上推送任何东西呢?
'low address'是stackpointerESP
所在的位置。
存储本地变量将使用EBP
相对寻址模式,其偏移量为负.
在您的示例中,EBP
和ESP
之间有20字节的差异。
在没有任何推送的情况下,MOV
指向ESP
点的位置,填充该20字节区域的最低4字节。相反,第一个PUSH
将存储在该20字节区域之下。只有PUSH
指令会提前降低堆栈指针。MOV
使用ESP
。
下面的语句在内存中存储到相同的地址:
mov [ebp-20], eax
mov [esp], eax
现在,如果我们push
一些新的数据到堆栈,那么ESP
改变,但EBP
保持不变,所以下面是正确的:
push ebx <<< The first push
mov eax, [ebp-20] <<< Still at -20
mov edx, [esp+4] <<< Now at +4
EAX
和EDX
是相等的