news 2026/9/8 15:28:28

程序的内存布局和函数的调用过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
程序的内存布局和函数的调用过程

这是学习国资社畜的视频之后的整理

这是程序的源代码,接下来编译,保护全关。编译之后第一步,运行程序看一眼

当运行程序的时候,程序需要先把程序放进内存,程序在内存中的布局是什么样的呢,在gdb中输入vmmap查看

从低地址到高地址排列,上面从0x40000到0x405000是我们写的程序本身,0x405000这个蓝色的是堆,从0x7fff7c00000到0x7ffff7ffd000是外部的文件,0x7ffffffde000是栈。目前从上到下分成程序本身,堆,外部文件,栈四个部分。

然后拖进ida里看看

这个dofunc函数,这里介绍几个指令的意思,等下会用到,需要再回来看

重要的寄存器:rip(当前执行的指令),rbp(栈底),rsp(栈顶)

push rbp:rsp-8,把rbp放入rsp指的地方

pop rbp:把rsp指的地方赋值给rbp,rsp+8

mov rbp,rsp:赋值,rbp=rsp

jump:jump()就是mov rip,()

call dofunc:push rip;jump dofunc,这里的rip是call dofunc的下一条指令

leave:mov rsp,rbp;pop rbp

retn:pop rip

接下来通过动态调试看函数调用的过程

接下来即将执行call dofunc,会push 0x4011e8,现在rbp和rsp都是0x7fffffffdea0,下一步rsp会减8,最后两位变成98,并且指的地方变成push 0x4011e8,接下来si步入验证一下。

rsp确实减了8,指的地方变成了0x4011e8,并且可以看到rip变成了0x401199,成功跳转到了dofunc函数,不管这个endbr64,接下来要运行push rbp,也就是rsp要再减8,然后指的地方变成rbp。

确实如此,rsp最后两位变成了90,和刚刚比又减了8,然后rsp指的地方变成了a0,也就是rbp,接下来mov rbp,rsp,进行赋值。

现在rbp和rsp就都是90了,接下来sub rsp,0x10,这个的意思就是把rsp=rsp-0x10,进行一个赋值

rsp变成了80,和刚刚比减了4,此时rbp指的地方是曾经rbp的地址,rbp+0x8的地方是之前main函数call dofunc的下一条指令,这个dofunc函数的操作都在现在的rsp和rbp之间,不会影响rbp下面的东西,接下来我们看函数要结束时,leave和ret的操作

下一步是leave,也就是mov rsp,rbp,然后pop rbp。所以先是rsp等于rbp,都是90,之后让rbp等于rsp指的地方,也就是a0,然后rsp+8,从90变成了98

现在rsp变成98了,rbp是a0了,和我们预想一样,接下来执行ret,此时rsp指的地方是0x4011e8,那么接下来rip变成0x4011e8,rsp加8

可以看到rip和rsp都和我们预想的一样,调用结束,这就是函数调用的全过程了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 15:27:28

2026年AI编程工具实测对比:5款主流工具选型指南

1. AI编程工具的2026年新格局:为什么现在必须重新选型2026年AI编程工具已经不再是"会不会用"的问题,而是"用哪套组合能少加班"的问题。我过去三年几乎所有生产级项目,从前端React到后端Java服务,都跑在AI辅助…

作者头像 李华
网站建设 2026/9/8 15:25:28

高增益高带宽高PSRR:高性能LDO线性稳压器架构设计实战

做射频系统供电的人,大概都有过这种经历:整机电源链路里明明放了一颗LDO,频谱仪上却还是能看到来自前级开关电源的开关频率泄漏——不是开关电源没滤干净,而是LDO自己没扛住。我去年做一个多通道接收机前端,用一颗3.3V…

作者头像 李华
网站建设 2026/9/8 15:22:20

Agent记忆协议化:告别私房记忆,实现跨工具无缝迁移

上个月我干了一件特别没有意义的事:把A平台里攒了三个月的一万多条Agent对话记录和记忆缓存导出来,准备迁到我自己基于另一套框架搭的Agent环境里。结果你们猜怎么着?导出来的文件里有JSON、有SQLite、还有一堆裸的向量bin文件,时…

作者头像 李华
网站建设 2026/9/8 15:21:50

经典二分求解分巧克力

看题目就知道这是一道很经典的二分算法的题,给定 N 块长方形巧克力,要切出 K 个大小相同的整数边长正方形,求正方形最大边长。 知道这个我们就可以猜测边长了,每块 HiWiH_i \times W_iHi​Wi​ 的巧克力,能切出的正方形…

作者头像 李华