内存栈:从esp.



我在这个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相对寻址模式,其偏移量为负.

在您的示例中,EBPESP之间有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

EAXEDX是相等的

最新更新