【问题标题】:Does Changing the Valuye of %esp Remove Values from Stack?更改 %esp 的值是否会从堆栈中删除值?
【发布时间】: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 不那么正式的方式从堆栈中删除东西?

标签: assembly x86 stack


【解决方案1】:

在您的函数内部,ESP 恢复只是从堆栈中删除函数的变量。从调用者中,您必须删除赋予该函数的参数。 我不知道 AT 表示法,但你会明白的

...
push %eax ; ESP will be decreased by 4
push %ebx ; ESP will be decreased by 4
call fucntion
addl $8, %esp ; restore ESP removing the parameters from stack

【讨论】:

    【解决方案2】:

    重要的是要理解,在汇编中我们将所有方便的高级语言抽象抛在脑后。内存只是字节。 “堆栈”只是一块内存,%esp 在中间某处。而且 CPU 并不真正知道堆栈的边缘在哪里。

    因此,当我们更改 %esp 时,我们不会更改值,因为它们对我们来说不存在。我们也不会更改字节,因为对 %esp 的更改只会影响 CPU 寄存器而不影响内存。

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2021-08-02
      • 2018-03-01
      • 2012-12-05
      • 2016-09-22
      相关资源
      最近更新 更多