更改%esp的值是否从堆栈中删除值?

时间:2015-04-11 20:05:36

标签: assembly stack

因此像subl $4, %esp这样的命令会在堆栈上打开一个局部变量空间的单词。然后%esp会指向此值。但是,在函数调用之后,当您%esp恢复movl %ebp, %esp时,这会使%esp指向您之前打开的局部变量空间。然后堆栈中不再存在此空间,因为%esp必须始终指向堆栈的底部,并移动%esp的值然后从堆栈中删除较低的东西?此外,在函数调用后,我看到了代码addl $8, %esp。这只是删除局部变量数据和其余的堆栈数据,直到返回地址,其中$8是从堆栈底部到返回地址的长度吗?

请原谅我提问的奇怪措辞。我想我可能理解这些概念,但我不确定,因此我只是试着写下我的想法然后等待更正。

2 个答案:

答案 0 :(得分:0)

在函数内部,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

答案 1 :(得分:0)

了解在汇编中我们将高级语言的所有方便抽象都留在我们身后,这一点非常重要。内存只是字节。 "堆栈"只是一块记忆,中间位于%esp。并且CPU并不真正知道堆栈边缘的位置。

因此,当我们更改%esp时,我们不会改变价值观,因为它们并不存在于我们身上。我们也不会改变字节,因为对%esp的更改只影响CPU寄存器而不影响内存。