栈内行为分析

栈内行为分析

一、源码分析
我们以以下简单的 C 程序为例,通过 GDB 动态调试分析函数调用过程中的栈内布局变化:

#include <stdio.h>
int add(){int a = 10;int b = 20;return (a + b);
}int main() {add();return 0;
}

编译为 32 位程序:

gcc -m32 test.c -o test
gdb ./test

动态调试

依次在对应位置打上断点

(gdb) b *main
Breakpoint 1 at 0x11d9
(gdb) b *add
Breakpoint 2 at 0x11ad
(gdb) b *add+42
Breakpoint 3 at 0x11d7
(gdb) r
Starting program: /root/test 
Breakpoint 1, 0x565561d9 in main ()
(gdb) layout regs

补充: esp 永远指向栈顶,ebp永远指向栈底 先记住这句话
然后我们继续运行c进入add函数在下面这个图我们还没进入add函数,eip指向的地址就是add函数的入口地址
程序进入 main() 函数后,还未调用 add() 函数之前,EIP 指向的是 add() 函数的入口地址。此时:

  • ESP 指向当前栈顶
  • EBP 尚未参与本次函数调用帧的构造
    重点部分解释
push %ebp	;这就是我们经常说的压栈	将调用者(main)的 ebp 存入当前栈顶,用于函数返回后恢复上下文
mov %esp, %ebp	;设置新的栈基址,构造当前函数的栈帧
sub $0x10, %esp	;压栈	留出栈空间(0x10 字节)用于局部变量(如 a、b)

在这里插入图片描述

当我们进入add函数到这一步我们会发现 此时的esp=ebp 可以观察到:
程序刚刚进入函数,ESP == EBP,栈帧尚未展开。
类似于“空水桶”,当前的栈顶和栈底都指向相同位置。
这一步体现了函数调用刚发生、栈帧尚未初始化的状态。

在这里插入图片描述
但是接下来,我们继续si几步我们会发现esp在不停变化代码比较简单 但是能看出esp是不断变化的
ESP 向低地址移动(因为栈向下生长)
为局部变量 a b 分配空间
函数内部指令执行期间不断使用和调整 ESP
这一过程中,ESP 表示当前操作的顶部位置,而 EBP 固定在该栈帧的底部,作为局部变量的偏移基准。
在这里插入图片描述
直到走到我们第三个断点 add+42 我们继续si espebp又继续相等了,同时我们回到了main函数当中
ESPEBP 再次恢复为相同值,意味着当前栈帧已被销毁
程序执行流程回到 main() 函数,继续往下执行
汇编解释

leave	; 出栈	实际上等价于:mov %ebp, %esp(还原 esp)→ pop %ebp(恢复上层 ebp)
ret	; 跳转	弹出栈顶的返回地址(调用者 call 指令之后的地址),跳转回主函数
-------------------分割线---------------
leave 是一个复合指令,相当于做了这两件事:
mov %ebp, %esp   ; 清理当前栈帧(还原栈顶)
pop %ebp         ; 恢复调用者的 ebp
-------------------分割线---------------
ret 的作用
ret 会做这件事:
pop %eip  ; 从栈顶取出返回地址并跳转执行

在这里插入图片描述

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

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

相关文章

老旧设备数据采集破局 AI图像解析如何让质检LIMS系统焕发新生

在实验室数字化进程中&#xff0c;大量服役超过 10 年的老旧设备成为数据采集的 “拦路虎”&#xff1a;指针式仪表盘需人工读取、纸质原始记录靠手工录入、非标准接口设备数据无法自动获取…… 某化工实验室因 15 台老旧设备数据采集耗时占比达 40%&#xff0c;检测效率长期滞…

【征求意见】四川省大数据发展研究会关于对《数据资源建设费用测算标准》团体标准征求意见的通知

四川省大数据发展研究会 关于对《数据资源建设费用测算标准》团体标准征求意见的通知 各有关单位&#xff1a; 由四川省大数据发展研究会归口、成都东契奇科技有限公司牵头编制的《数据资源建设费用测算标准》团体标准已形成征求意见稿&#xff0c;现公开征求意见。请于2025年…

element上传文件多选 实现文件排序

上传文件多选排序 只上代码 不多逼逼 这是el-elment 的文件上传 <el-uploadaction"#"list-type"picture-card"ref"upload":accept"accept":on-change"onUploadChange":file-list"fileList":http-request&quo…

.NET 查找 DLL 的路径顺序

在 C# 中&#xff0c;[DllImport("SgCamWrapper.dll")] 这行代码表明它会在运行时从当前可执行文件的搜索路径中查找 SgCamWrapper.dll。具体搜索顺序如下&#xff08;按优先级&#xff09;&#xff1a; ✅ .NET 查找 DLL 的路径顺序&#xff1a; 应用程序启动目录&a…

低代码——表单生成器以form-generator为例

主要执行流程说明&#xff1a; 初始化阶段 &#xff1a; 接收表单配置对象formConf深拷贝配置&#xff0c;初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置&#xff08;如文件上传&#xff09; 渲染阶段 &#xff1a; 通过render函数创建el-form根组件递归渲染表…

自定义载板RK3588HDMI输入配置完整解决方案

Orange Pi 5 Plus HDMI输入配置完整解决方案 &#x1f4cb; 项目概述 本文档记录了Orange Pi 5 Plus HDMI1接口配置问题的完整分析和解决过程。从初始的"disconnected"状态问题&#xff0c;到最终实现HDMI输入功能的全过程技术分析。 &#x1f3af; 问题描述 初始…

SAAS架构设计2-流程图-用户与租户之间对应关系图

在SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;结构中&#xff0c;用户与租户之间的关系可以通过一对一和多对多两种方式来定义。这两种关系模式各自有着不同的应用场景和特点。 用户和租户的关系&#xff08;一对一&#xff09; 一对一关系 在这…

Spring Boot微服务架构(八):开发之初就引入APM工具监控

使用 APM&#xff08;Application Performance Management&#xff09;工具监控 Spring Boot 应用&#xff0c;可以帮助开发者实时追踪性能瓶颈、分析调用链路、监控资源使用情况&#xff0c;并快速定位故障。以下是详细的步骤和常用工具的选择指南&#xff1a; ​​一、常用 A…

Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析

Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析 自动驾驶技术从来都不是“单兵作战”。如果你细看一辆自动驾驶汽车,它其实是一个传感器的集合体:摄像头、激光雷达(LiDAR)、毫米波雷达、超声波传感器、GPS……这些传感器各自发挥作…

《软件工程》第 12 章 - 软件测试

软件测试是确保软件质量的关键环节&#xff0c;它通过执行程序来发现错误&#xff0c;验证软件是否满足需求。本章将依据目录&#xff0c;结合 Java 代码示例、可视化图表&#xff0c;深入讲解软件测试的概念、过程、方法及实践。 12.1 软件测试的概念 12.1.1 软件测试的任务 …

面试题 08.08. 有重复字符串的排列组合【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 面试题 08.08. 有重复字符串的排列组合 一、题目描述 有重复字符串的排列组合。编写一种方法&#xff0c;计算某字符串的所有排列组合。 二、测试用例 示例 1&#xff1a; 输入&#…

【Linux】关于权限的理解

目录 一、Linux用户的分类 1.Linux下的两种用户 2.两种用户提示符的区别 3.用户的切换方法 二、Linux的权限管理 1.文件访问者分类 2.常见文件类型 3.文件访问权限 4.权限检查逻辑 5.文件权限的表示方式 三、与文件访问权限相关的设置方法 1.前提&#xff1a; 2.如…

前端antd,后端fastapi,解决文件上传

一、技术架构概述 前端框架&#xff1a;React Ant Design 5.x 使用antd的Upload组件&#xff08;支持拖拽/多文件/分片&#xff09; 后端框架&#xff1a;Python FastAPI 利用UploadFile类处理文件流 传输协议&#xff1a;HTTP FormData&#xff08;兼容性强&#xff09; 二…

⭐️⭐️⭐️ 模拟题及答案 ⭐️⭐️⭐️ 大模型Clouder认证:RAG应用构建及优化

考试注意事项: 一、单选题(21题) 检索增强生成(RAG)的核心技术结合了什么? A. 图像识别与自然语言处理 B. 信息检索与文本生成 C. 语音识别与知识图谱 D. 数据挖掘与机器学习 RAG技术中,“建立索引”步骤不包括以下哪项操作? A. 将文档解析为纯文本 B. 文本片段分割(…

为什么建立 TCP 连接时,初始序列号不固定?

主要原因有两个方面&#xff1a; 很大程度上避免历史报文被下一个相同四元组的 TCP 连接接收问题&#xff08;主要方面&#xff09;防止黑客伪造相同序列号的 TCP 报文被接收 接下来&#xff0c;详细说说第一点 假设每次建立 TCP 连接时&#xff0c;客户端和服务端的初始序列…

VScode-使用技巧-持续更新

一、Visual Studio Code - MACOS版本 复制当前行 shiftoption方向键⬇️ 同时复制多行 shiftoption 批量替换换行 在查找和替换面板中&#xff0c;你会看到一个 .∗ 图标&#xff08;表示启用正则表达式&#xff09;。确保这个选项被选中&#xff0c;因为我们需要使用正则…

【瑶池数据库训练营及解决方案本周精选(探索PolarDB,参与RDS迁移、连接训练营)】

一、训练营 数据库迁移训练营 自建数据库运维难&#xff1f;本次训练营教您迁移至云数据库 RDS&#xff0c;高可用架构跨区容灾&#xff0c;降本增效&#xff01;模拟教程 实战演练&#xff0c;零基础也能上手。 &#xff08;一&#xff09;开营时间 2025年4月8日-6月2日16…

Xamarin劝退之踩坑笔记

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

使用ray扩展python应用之流式处理应用

流式处理就是数据一来&#xff0c;咱们就得赶紧处理&#xff0c;不能攒批再算。这里的实时不是指瞬间完成&#xff0c;而是要在数据产生的那一刻&#xff0c;或者非常接近那个时间点&#xff0c;就做出响应。这种处理方式&#xff0c;我们称之为流式处理。 流式处理的应用场景…

火狐安装自动录制表单教程——仙盟自动化运营大衍灵机——仙盟创梦IDE

打开火狐插件页面 安装完成 使用 功能 录制浏览器操作 录入地址 开始操作 录制完成 在当今快速发展的软件开发生态中&#xff0c;自动化测试已从一种新兴技术手段&#xff0c;转变为保障软件质量与开发效率不可或缺的关键环节。其重要性体现在多个维度&#xff0c;同时&#x…