【发布时间】:2015-06-17 09:56:40
【问题描述】:
所以像subl $4, %esp 这样的命令会在堆栈上打开一个字的局部变量空间。然后%esp 将指向这个值。但是,在函数调用之后,当您通过movl %ebp, %esp 恢复%esp 时,这将使%esp 指向您之前打开的局部变量空间之上。那么堆栈上是否不再存在这个空间,因为%esp 必须始终指向堆栈的底部,并且移动%esp 的值然后从堆栈中删除较低的东西?此外,在函数调用之后,我看到了代码addl $8, %esp。这是否只是删除了局部变量数据和堆栈的其余数据,直到返回地址,其中$8是从堆栈底部到返回地址的长度?
请原谅我的问题措辞奇怪。我想我可能理解这些概念,但我不确定,所以我只是试着写下我的想法,然后等待更正。
【问题讨论】:
-
是的,从逻辑上讲,它会从堆栈中删除东西,但在物理上它们仍然存在于内存中,直到被覆盖。
-
这正是堆栈服务的目的。当你
push一个值到堆栈上,然后pop值离开堆栈时,你正在做同样的事情。堆栈越来越低,因此以您当前的堆栈指针为 100 为例,您推送一个int,您的堆栈指针为 96,您弹出int并且您的堆栈指针再次为 100,但直到您覆盖您的 int,它仍然存在于 96 岁。 -
所以基本上,增加堆栈指针也会以比 pop 不那么正式的方式从堆栈中删除东西?