从汇编看函数调用传参过程

news/2024/11/19 20:24:03/文章来源:https://www.cnblogs.com/jye159X/p/18516636

1 示例代码

#include <stdio.h>int func(int param1 ,int param2,int param3)
{int var1 = param1;int var2 = param2;int var3 = param3;printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);return var1;
}int main(int argc, char* argv[])
{int result = func(1,2,3);return 0; 
}

2 解析

首先说明,在堆栈中变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称为栈指针。

2.1 调用过程

  1. 函数main执行,main的各个参数从右往左压入栈中(这样访问参数出栈的时候是从左到右的),参数param3-param1依次压栈,如图
    1
  2. 压入返回地址
    2
  3. 程序执行从main跳转到被调用函数中,EBP入栈,将ESP(当前栈顶)赋值给EBP。

当一个新的函数调用的时候,首先将旧的EBP入栈,这样是为了保存当前调用者的栈帧,然后从当前栈顶开始建立新的栈帧(将当前栈顶ESP的值作为新的栈底EBP)

push ebp
mov ebp esp

此时栈顶(ESP)和栈底(EBP)指向同一位置
3

2.2 函数执行过程

int var1 = param1;对应汇编如下:

mov 0x8(%ebp), %eax
mov %eax, -0x4(%ebp)

先将EBP+0x8地址里面的内容赋值给eax,看图中EBP+0x8刚好是param1,再把eax寄存器的内容存到ebp-0x4的位置。这个相当于开了一个新变量int,然后赋值给这个变量。其余同理。
4

2.3 函数的返回

函数返回值一般存在eax寄存器中。

mov -0x4(%ebp), %eax

之后参数依次出栈,EBP恢复原值,返回到记录的返回地址,参数param1, param2,param3依次出栈,函数调用结束。

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

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

相关文章

IDEA如何导入外部依赖的jar包

前言 大家好,我是小徐啊。今天小徐要给大家介绍下,在使用IDEA开发java应用时,如何导入第三方的jar包,注意不是通过maven的方式导入。这种情况就是这个jar包比较特殊,可能并不存在于仓库中,需要手动引入。 如何导入jar包 首先,我们需要在资源目录下新建一个文件夹,我一般…

Cut the Sequence

Cut the Sequence P10977 Cut the Sequence 前言 单调队列优化 dp 的好题,思维难度大细节多。因为觉得自己看不懂其他题解,在看完 y 总的讲解后豁然开朗,所以写这篇题解来巩固一下。包括完整的细节分析和思考过程,或许很多大佬都不需要 qwq。叠甲完毕,下面开始正文。 分析…

20222408 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1实验要求 (1)选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式、该域名对应IP地址、IP地址注册人及联系方式、IP地址所在国家、城市和具体地理位置。 (2)尝试获取QQ中某一好友的IP地址,并查询获取该好友所在的具体地理位置。 (3)使用nmap开源…

[考试记录] 2024.11.19 noip模拟赛17

T1 选取字符串warning❗:本题解 前缀 含量过高。挺典的 kmp。考虑到题目中的串都是一个串的前缀,那么所选出来的串,他们的前缀一定是最短的那个串。不妨直接枚举每一个前缀,也就是枚举每一个串,看他们是否可以作为前缀出现,hash即可,复杂度 \(\mathcal{O}(N^2)\)。换个…

【淘汰9成NLP工程师的常识题】多头注意力相对于多头注意力有什么优势?

【淘汰9成NLP工程师的常识题】多头注意力相对于多头注意力有什么优势? 重要性:★★★ 💯 这是我【淘汰9成NLP工程师的常识题】多头注意力相对于多头注意力有什么优势? 重要性:★★★ 💯这是我常用的一个面试题。看似简单的基础常识题,但在面试中能准确回答的不足10% …

多校A层冲刺NOIP2024模拟赛24

多校A层冲刺NOIP2024模拟赛24\(T1\) A. 选取字符串 \(100pts\)考虑建出失配树,然后等价于询问 \(\sum\limits_{S \sube \{ 0,1,2, \dots ,n \},|S|=k}dep_{\operatorname{LCA}\{ S \}}^{2}\) 。不妨从 \(\operatorname{LCA}\) 的角度考虑,统计 \(x\) 能作为多少个 \(|S|\) 的…

在微信中使用AI聊天机器人

微信是中国最流行的社交通讯软件,具有庞大的用户基础。ChatGPT是由 OpenAI 开发的、当前最先进的AI聊天机器人,ChatGPT 尤其是在理解和生成自然对话方面表现出色,能够进行流畅且连贯的交流。对中国人而言,将 ChatGPT 集成到微信中,可以在一个熟悉的环境中体验到最新的人工…

protodep踩坑

在使用微服务框架go-zero时,服务拆分比较多,每更新一个服务的proto文件,都要手动复制pb文件到调用的服务里面,新系统开发的时候决定用protodep解决这个问题。 protodep 是一款专为Protocol Buffers接口描述语言文件设计的依赖管理工具。它解决了在使用gRPC时,如何有效控制…

虚幻4 蓝图无法保存 解决方法

蓝图类只能存放在 Blueprints文件夹内,创建在其他文件夹的蓝图类无法保存。 可以看到无法将蓝图拖动到其他文件夹内。这是一个存放在其他文件夹下的蓝图类:当尝试按Ctrl+shift+A保存时,将出现如下错误:解决方法是,将当前蓝图删除(注意,如果该蓝图从某个C++类继承而来,那…

理解进程调度时机跟踪分析进程调度与进程切换的过程

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000 实验八——理解进程调度时机跟踪分析进程调度与进程切换的过程 一、理解Linux系统中进程调度的时机 在 Linux 内核中,schedule() 函数是核心的进程调度机制。它的主要作…

李继刚Lisp提示词灵感之源:压缩推动进步

探秘李继刚Lisp提示词压缩表达的灵感来源:德国计算机科学家尤尔根施密德胡伯提出,智能系统通过学习新技能来更高效地预测或压缩信息,这种内在动力推动了好奇心和创造力的发展,适用于从婴儿探索世界到科学家发现新规律的各种场景。前面在文章《 访谈李继刚:从哲学层面与大模…

java:找不到符号 符号:变量:log

原文链接:https://blog.csdn.net/zhanghaoninhao/article/details/129180810问题:java:找不到符号 符号:变量:log环境:springboot idea解决方法:在idea中,点击file-Settings,打开配置页面,如图红框位置,输入: -Djps.track.ap.dependencies=false