堆栈平衡

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

堆栈平衡:

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

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

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

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

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

原文地址:https://www.cnblogs.com/codexlx/p/13257621.html