汇编系列19--堆栈平衡

 当执行函数调用call指令的时候,会把call指令下一条指令的内存地址压入堆栈(ESP值减4)。

在call指令里面,我们可以随意使用,比如push压入堆栈,使用堆栈传参等。

但是要保证,在函数调用结束的时候---即执行ret指令之前,要把esp-栈顶寄存器的值修改为执行call指令压入堆栈的那个值。  这样才能保证程序能回到正确的位置,这个叫堆栈平衡。

总结:函数调用,要保证在函数进来与结束时,堆栈是一致的(栈顶寄存器esp的值一致)。

上图,在函数调用中,没有使用堆栈,故此函数内,堆栈是平衡的。

但是,由于在函数调用前,使用了堆栈传参,导致了堆栈有变化,不在平衡。压入的参数成为堆栈里的垃圾,没有清理。

可以在函数调用结束后,调整esp的值,来平衡由于使用堆栈传参带来的不平衡。这个叫外平栈--(平衡参数,写在了函数的外部)。

内平栈:平衡参数写在了函数的里面。

 ret 8

原文地址:https://www.cnblogs.com/RevelationTruth/p/13922534.html