zoukankan      html  css  js  c++  java
  • 汇编系列19--堆栈平衡

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

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

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

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

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

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

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

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

     ret 8

  • 相关阅读:
    『笔记』数学数论(八)
    『笔记』BSGS
    『笔记』组合数学(六)
    01 分数规划
    高斯消元
    拉格朗日插值法
    洛谷网课数论
    [IOI2013]robots 机器人
    P3530 [POI2012]FES-Festival
    NOIP 2015 day1
  • 原文地址:https://www.cnblogs.com/RevelationTruth/p/13922534.html
Copyright © 2011-2022 走看看