2013-11-26 87 views
0

关于这个问题有很多话题,但我找不到我在所找到的所有主题中找到的答案。堆栈框架破坏

我实际的问题是:

当我们进入一个过程,我们才能继续使用,无需任何泄漏正常运行的程序使用功能序言和跋(进入和离开的指令)。

假设你想在程序中使用2个局部变量。您可以将ESP减少8,以将对齐默认为4个字节(DWORD)。在程序结束时,您希望DESTROY/RELEASE这些变量,因此您必须将ESP设置为EBP。

我的问题是,如何改变ESP地址等于EBP地址销毁/释放局部变量?我们调用RET之后会发生什么?堆栈框架如何被销毁?

+1

到底是什么“破坏”与“放”在你心目中意味着什么呢?你是否想象着小小的管理员走进你的内存,拾取小的旧变量并将它们释放回野外? –

回答

2

第一个问题:ESP是一个指向堆栈顶部的指针,因此如果在过程结束时将8添加到ESP,那么您将减少堆栈。存储在本地字段中的内存不再位于堆栈中,因此可以根据需要进行更改。第二个问题:RET命令执行两件事:它将控制权返回给主程序,但以更技术性的方式 - 从堆栈顶部读取数字并将其写入指令指针EIP寄存器。 还值得明知CALL指令做两件事情 - 它推下一个订单的地址到堆栈,然后跳转到程序 - 这意味着RET知道在哪里可以跳回

2

的收场白功能如下:

mov %esp, %ebp 
pop %ebp 
ret 

或(在x86上,在那里休假做同样的事情与上面第一个2行)

leave 
ret 

回答你的问题:

-in指令休假的第一部分,我们设定德%EBP等于%ESP

-as我们称之为“退役”,PC(程序计数器)的值设置为地址通过弹出堆栈顶部的“调用”指令旁边的指令。

-the堆栈帧“破坏”为我们设定的新值%ESP(ESP%+ 4)