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

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

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

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

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

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

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

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

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

     ret 8

  • 相关阅读:
    es6 学习笔记3
    flex 子元素和父元素的高度相同问题
    vue 笔记2
    vue 子父组件之间的通信
    vue+webpack 错误笔记
    vue 学习新笔记
    mongoDB 使用学习笔记
    express 学习笔记
    多态
    static修饰符与final修饰符
  • 原文地址:https://www.cnblogs.com/RevelationTruth/p/13922534.html
Copyright © 2011-2022 走看看