Linux 函数调用过程解析

news2025/1/11 16:59:08

一、Linux 函数调用过程解析

在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等。一切的函数调用都要将不同的数据、地址压入或者弹出栈。因此,为了更好地理解函数的调用,需要先来看看栈是怎么工作的。

1、什么是栈帧?

栈帧,也就是stack frame,其本质就是一种栈,只是这种栈专门用于保存函数调用过程中的各种信息(参数,返回地址,本地变量等)。栈帧有栈顶和栈底之分,其中栈顶的地址最低,栈底的地址最高,SP(栈指针)就是一直指向栈顶的。在x86-64bit中,用 %rbp 指向栈底,也就是基址指针;用 %rsp 指向栈顶,也就是栈指针。下面是一个栈帧的示意图:

在这里插入图片描述

2、函数调用过程解析

下面是对应的C语言代码:

#include <stdio.h>

 int add(int n1, int n2)                                                                                                                                                       
 {
     int n = n1 + n2;
     return n;
 }

 int test(int a, int b)
 {
     int n1 = 30;
     int n2 = 40;
     return add(n1, n2);
 }

 int main()
 {
     printf("ret=%d\n", test(10, 20));
     return 0;
 }

下面是main与test函数对应的反汇编指令

在这里插入图片描述

main函数调用test函数,所有函数开头的两行指令都是一样的,例如:

在这里插入图片描述

先压入main栈帧的栈基址,然后移动栈基址使它指向和栈指针同样的位置。此时产生了test的栈

在这里插入图片描述

移动test函数的栈顶指针,为test分配24个字节的栈空间,操作之后的栈空间如下:

在这里插入图片描述

test函数执行完返回,函数执行完毕一般会执行下面两条指令

执行完leaveq指令,恢复函数调用者对应的堆栈,下面是执行完leave对应的栈空间,如下:

在这里插入图片描述

执行完leave指令后会执行ret指令,将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序,执行完ret指令后的栈帧如下:

在这里插入图片描述

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

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

相关文章

QT 常见面试题

1、在Qt当中&#xff0c;多线程环境下&#xff0c;信号槽分别是在什么样的线程中执行&#xff1f;如何控制&#xff1f; 参考答案&#xff1a; 通过connect(...)第5个参数控制信号槽执行所在线程 connect(...)它的连接方式&#xff1a;队列连接、自动连接和直接连接 队列连…

EMC-MLCC电容反谐振点引起的RE辐射超标

MLCC电容反谐振点引起的RE辐射超标 对待RE辐射问题&#xff0c;可以按照干扰源&#xff0c;干扰路径&#xff0c;被干扰源&#xff0c;入手较多的是干扰源和干扰路径&#xff0c; 解决干扰源可以从展频&#xff0c;调频&#xff0c;屏蔽干扰源&#xff0c;增加RC snabber吸收…

ChatGPT颠覆者来了,能替代90%的人的工作?

前言 Auto GPT是一个实验性开源应用程序&#xff0c;展示了GPT-4语言模型的功能。该程序由GPT-4驱动&#xff0c;将LLM“思想”链接在一起&#xff0c;以自主实现您设定的任何目标。作为GPT-4完全自主运行的首批例子之一&#xff0c;Auto GPT突破了人工智能的极限。 特征 &a…

明面抵制,暗中布局 对于AI,马斯克的言行为何如此“割裂”?

最近&#xff0c;马斯克创建了一家叫做“X”的空壳公司&#xff0c;目标是将其打造成涵盖各方面的多功能应用集合平台&#xff0c;推特、SpaceX、特斯拉、Neuralink等公司业务都已打包加入其中。如今&#xff0c;“X”公司再添新丁——X.AI&#xff0c;即马斯克新成立的人工智能…

【硬件外设使用】——PWM

【硬件外设使用】——PWMPWM基本概念PWM使用方法pyb.pwm方法属性machine.pwm方法属性PWM可用的传感器PWM基本概念 PWM是脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;的缩写&#xff0c;是一种用数字信号控制模拟电路输出的技术。PWM通常被用来控制电压或电流的…

【 Spring MVC 核心功能(三) - 输出数据】

文章目录引言一、返回静态页面二、返回非静态页面的数据三、返回 JSON 对象四、请求转发(forward)和请求重定向(redirect)五、拓展&#xff1a;IDEA 热部署(热加载)3.1 添加 SpringBoot DevTools 框架3.2 开起 IDEA 的自动编译3.3 开起运行中的热部署3.4 使用 debug 启动项目引…

Docker系列 基于OpenAI API自建ChatGPT

转自我的博客文章https://blognas.hwb0307.com/linux/docker/4201&#xff0c;内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 我用帐号/密码使用chatGPT已经有一段时间。但是&#xff0c;我有几个私交较密的朋友&#xff0c;他们并不具备使用chatGPT的条件&#xff1b…

kafka集群topic重新分配leader

1.案例 当kafka集群的broker节点宕机重启后,此broker节点的partition分区的leader节点会被选举为其它broker节点,此broker节点恢复后就会导致配分不均衡 可以看到所有partition的leader节点都在broker id为1的节点上,原来是平均分配到3个broker节点上,replicas项的首位…

【动手学深度学习】(task123)注意力机制剖析

note 将注意力汇聚的输出计算可以作为值的加权平均&#xff0c;选择不同的注意力评分函数会带来不同的注意力汇聚操作。当查询和键是不同长度的矢量时&#xff0c;可以使用可加性注意力评分函数。当它们的长度相同时&#xff0c;使用缩放的“点&#xff0d;积”注意力评分函数…

文章改写工具-文章改写工具的原理

文章改写工具的原理 文章改写工具是一种利用自然语言处理技术和相关算法&#xff0c;对原始文章进行改写、调整或替换等操作&#xff0c;生成与原始文章类似但又不完全相同的新文章的工具。 实现文章改写的工具通常需要包括以下几个步骤&#xff1a; 文本预处理&#xff1a;对原…

【数据库数据恢复】MongoDB数据库启动失败的数据恢复案例

数据库数据恢复环境&#xff1a; Windows Server操作系统服务器&#xff0c;部署MongoDB数据库。 数据库故障&分析&#xff1a; 在MongoDB数据库服务未关闭的情况下&#xff0c;管理员将MongoDB数据库文件从原分区拷贝到其他分区&#xff0c;然后将MongoDB数据库所在原分区…

网页解析--接上篇--bs4/xpath

网页解析完成的是从下载回来的html文件中提取所需数据的方法&#xff0c;一般会用到的方法有: 正则表达式&#xff1a;将整个网页文档当成一个字符串用模糊匹配的方式来提取出有价值的数据 Beautidul Soup&#xff1a;一个强大的第三方插件 lxml&#xff1a;解析html网页或者xm…

一文详解 PoseiSwap,Nautilus Chain 上的首个 DEX

前不久&#xff0c;首个 Layer3 概念的新链 Nautilus Chain 推出了测试网“Triton” 引发瞩目&#xff0c;据了解过&#xff0c;经过一个月的Triton I测试历程&#xff0c;Nautilus Chain社区成员突破200,000&#xff0c;同时测试网激励活动注册地址数突破180,000&#xff0c;链…

Kotlin中lateinit 和 Lazy 的区别

Kotlin中Lateinit 和 Lazy 的区别 latinit 我们可能不想在定义它们时初始化我们的值&#xff0c;相反我们可能想在以后的任何时间初始化并在我们的应用程序中使用它们。但是在使用我们的值之前&#xff0c;一定要记住&#xff0c;我们的值必须先初始化&#xff0c;然后才能使用…

高斯混合模型 GMM 的详细解释

高斯混合模型&#xff08;后面本文中将使用他的缩写 GMM&#xff09;听起来很复杂&#xff0c;其实他的工作原理和 KMeans 非常相似&#xff0c;你甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。 因为KMeans的限制很多…

【factoryio】虚拟仓储实现(入仓出仓)

实现虚拟工厂场景之一的智能仓储实验 注&#xff1a;本文仅供参考 目录 引 入仓部分 1.上料部分 1.效果 2.实现 2.入仓部分 1.效果 2.实现 3.入仓扩展 1.行列控制和优先级 2.入仓优化和完善 出仓部分 1.出仓 2.后传送带 3.出仓效果 1.效果 2.优先级 3.完…

Linux时间服务器(ntp)

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

高速前行的低代码,其能力边界到底在哪?

最近半年&#xff0c;有好些来自不同岗位、不同立场的人开始问同一个问题&#xff1a;低代码平台的边界是什么&#xff1f;低代码无所不能吗&#xff1f; “全民开发”、“人人都是开发者”这样的口号愈演愈烈&#xff0c;“低代码能力有没有边界”、“边界在哪”&#xff0c;这…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天&#xff1f; 目前看的确如此。近日&#xff0c;国家发改委密集发文&#xff0c;从产权、分配、流通、安全等多个角度解读“数据二十条”&#xff08; 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》&#xff0c;简称“数据二…

算法的时间复杂度和空间复杂度(1)

1.算法效率 2.时间复杂度 3.空间复杂度 1.算法效率 如何衡量一个算法的好坏&#xff1f; 比如对于以下斐波那契数列&#xff1a; long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2)&#xff1b; } 斐波那契数列的递归实现方式非常简洁&#xff0c;但…