堆栈不平衡将导致程序非常容易出错
堆栈平衡:
(1)如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证子啊RET这条指令之前,ESP指向的时我们压入栈中的地址。
即:一个用CALL调用的函数在RET之前要把堆栈恢复成调用函数之前的样子。 (函数进来的时候堆栈什么样,出去的时候堆栈还是什么样子)
(2)如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化;
即:当我们定义一个加法函数,使用的是堆栈传参,首先需要向堆栈中PUSH若干个参数,然后再使用CALL调用函数。当函数执行完毕时,堆栈指针指向的是PUSH最后一个参数时的地址,而已经被使用的PUSH的参数占的内存却无法被使用了,造成了浪费。
解决方法:① CALL执行结束以后,手动将ESP的值增加;②直接再函数执行过程中将ESP增加对应的值。
原文地址:https://www.cnblogs.com/codexlx/p/13257621.html