• 汇编系列19--堆栈平衡


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

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

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

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

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

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

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

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

     ret 8

  • 相关阅读:
    2-7-配置iptables防火墙增加服务器安全
    2-6-搭建无人执守安装服务器
    2-4-搭建FTP服务器实现文件共享
    第一阶段连接
    在mfc中如何显示出系统时间
    关于const
    第三章类图基础
    算法分析的数学基础
    第十二章 派生类
    学好C++该看什么书呢?
  • 原文地址:https://www.cnblogs.com/RevelationTruth/p/13922534.html
Copyright © 2020-2023  润新知