堆栈平衡

news/2025/3/28 23:18:30/文章来源:https://www.cnblogs.com/msjs/p/18784646

参考资料:

https://blog.csdn.net/boildoctor/article/details/121181152

https://www.52pojie.cn/thread-1451831-1-1.html


1.介绍

堆栈平衡指在函数调用过程中,通过调整堆栈指针(ESP)或基址指针(EBP),使函数执行完毕后堆栈恢复到调用前的状态。

函数调用时:会push参数入栈(给函数传参),使ESP减4*n

函数返回时:会清除栈上的参数,使得ESP复原,ESP加4*n

目的:为了防止栈溢出,或者CPU访问错误的地址


2. 方式:

1. 外平栈(Caller Cleanup)

由调用者在函数返回后清理参数空间。

通过add esp xx实现

示例:

asm

push param3    ; 参数入栈
push param2
push param1
call myFunction
add esp, 12    ; 调用者清理12字节参数空间

2.内平栈(Callee Cleanup)

由被调用函数在返回时清理参数空间。

被调用函数通过 ret xx 指令(xx为参数总字节数)同时返回并清理堆栈。

示例:

myFunction:; 函数逻辑ret 12     ; 返回并清理12字节参数空间

3. 平衡堆栈(Self-Balancing)

通过函数内部的pushpop操作抵消堆栈变化,无需显式清理参数。

确保函数内部压入和弹出操作数量一致

示例:

myFunction:push ebp        ; 保存基址mov ebp, esppush esi        ; 局部变量操作pop esipop ebp         ; 恢复基址ret             ; 堆栈已平衡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902348.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年1月Java项目开发指南20:windows下使用Nignx部署应用

命令 启动start nginx重新加载配置文件 nginx -s reload nginx -t修改配置后执行上面两个语句下载地址 https://nginx.org/en/download.html 部署Vue项目 1 打包Vue项目 得到dist文件件 2 启动Nginx,访问localhost 注意:Nginx需要占用80端口。 启动后访问localhost,成功后如…

Z3-solve 求解器(SMT求解器)解方程:

Int(name, ctx=None),创建一个整数变量,name是名字 Ints (names, ctx=None),创建多个整数变量,names是空格分隔名字 IntVal (val, ctx=None),创建一个整数常量,有初始值,没名字。 对于实数类型的API与整数类型一致,向量(BitVec)则稍有区别: Bitvec(name,bv,ctx=None),…

CSS 如何设置父元素的透明度而不影响子元素的透明度

CSS 如何设置父元素的透明度而不影响子元素的透明度CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中,设置父元素的透明度(如通过 opacity 属性)会影响所有子元素的透明度,因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度…

ASE20N40-ASEMI工业电源专用ASE20N40

ASE20N40-ASEMI工业电源专用ASE20N40编辑:LL ASE20N40-ASEMI工业电源专用ASE20N40 型号:ASE20N40 品牌:ASEMI 封装:TO-220 最大漏源电流:20A 漏源击穿电压:400V 批号:最新 RDS(ON)Max:216mΩ 引脚数量:3 沟道类型:N沟道MOS管 封装尺寸:如图 特性:MOS管、N沟道MO…

GreatSQL 为何选择全表扫描而不选索引

GreatSQL 为何选择全表扫描而不选索引 1. 问题背景 在生产环境中,发现某些查询即使有索引,也没有使用索引,反而选择了全表扫描。这种现象的根本原因在于优化器评估索引扫描的成本时,认为使用索引的成本高于全表扫描。 2. 场景复现 2.1 环境信息机器 IP:192.168.137.120 Gr…

Profibus DP转EtherCAT实例展示欧姆龙PLC对接西门子变频器操作

一. 案例背景 在一个小型工厂,现场设备需求是Profibus DP转EtherCAT,两端设备分别是西门子变频器和欧姆龙PLC通讯,。为提高现场的工作效率,采纳捷米特JM-DPM-ECT网关模块来实现数据的互联互通。二.设备介绍 1.欧姆龙PLC 欧姆龙PLC是一种功能完善的紧凑型PLC,能为业界领先的…

bayaim-如何保证Redis中的数据都是热点数据?

——————————————————————————————————————————————————— ---- bayaim,申明:本文摘自:https://mp.weixin.qq.com/s?__biz=MzAwNDUxOTQ5MQ==&mid=2247623691&idx=1&sn=35e1b6e9206458f9fcd99e48bebccc13&…

translator

import streamlit as st import time import base64 from streamlit.components.v1 import html# 自定义CSS样式 def set_custom_style():st.markdown(""" <style>/* 页面背景:浅色渐变,提高可读性 */.main {background: linear-gradient(135deg, #E0F7…

AI+CRM纷享汇湖南株洲站圆满落幕

近日,由株洲工业和信息化局指导,湘数促会株洲联络处主办,华为云、纷享销客共同承办的“智变未来营销破局”暨企业CRM应用与发展趋势纷享汇在湖南株洲成功举办。此次活动吸引了近40位湘企高管参与,共同探讨企业数字化转型与营销破局的新路径。 一、华为云助力企业数字化转型…

postgresql 16版本之后使用yum方式下载

1.登录下载地址https://www.postgresql.org/download/linux/redhat/

bilibili 分段进度跳转

编辑好后重新投稿即可

谷歌浏览器Chrome安装历史版本

连接:https://downzen.com/en/windows/google-chrome/versions/?page=4 首先,打开网址 然后选择所需要的版本进行下载