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

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

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

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

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

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

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

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

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

     ret 8

  • 相关阅读:
    Nginx,uWSGI与Django 应用的关系
    闭包学习-Python 篇
    Django学习之REST framework JWT Auth
    Python标准库uuid模块
    Django REST framework学习之JWT失效方式
    Django学习之JWT
    单点登录
    print输出格式总结
    百钱百鸡问题
    流程图符号及其功能
  • 原文地址:https://www.cnblogs.com/RevelationTruth/p/13922534.html
Copyright © 2011-2022 走看看