堆栈平衡

Posted codexlx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈平衡相关的知识,希望对你有一定的参考价值。

堆栈不平衡将导致程序非常容易出错

堆栈平衡:

(1)如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证子啊RET这条指令之前,ESP指向的时我们压入栈中的地址。

  即:一个用CALL调用的函数在RET之前要把堆栈恢复成调用函数之前的样子。 (函数进来的时候堆栈什么样,出去的时候堆栈还是什么样子)

(2)如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化;

  即:当我们定义一个加法函数,使用的是堆栈传参,首先需要向堆栈中PUSH若干个参数,然后再使用CALL调用函数。当函数执行完毕时,堆栈指针指向的是PUSH最后一个参数时的地址,而已经被使用的PUSH的参数占的内存却无法被使用了,造成了浪费。

  解决方法:① CALL执行结束以后,手动将ESP的值增加;②直接再函数执行过程中将ESP增加对应的值。

 

以上是关于堆栈平衡的主要内容,如果未能解决你的问题,请参考以下文章

如何确定表达式是不是在堆栈中具有平衡括号? [复制]

p/invoke 不平衡堆栈错误

堆栈平衡

“对 PInvoke 函数的调用使堆栈不平衡”

编组 LPSTR 和浮动时的不平衡堆栈

手脱UPX(堆栈平衡原理)