函数调用过程简单分析

C/C++函数调用过程分析

这里以一个简单的C语言代码为例,来分析函数调用过程

代码:

复制代码
 1 #include <stdio.h>
 2 
 3 int func(int param1 ,int param2,int param3)
 4 {
 5         int var1 = param1;
 6         int var2 = param2;
 7         int var3 = param3;
 8  
 9         printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);
10         return var1;
11 }
12  
13 int main(int argc, char* argv[])
14 {
15         int result = func(1,2,3);
16  
17         return 0; 
18 }
复制代码

 


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

 

下面来逐步分析函数的调用过程

1.函数main执行,main各个参数从右向左逐步压入栈中,最后压入返回地址

2.执行第15行,3个参数以从左向右的顺序压入堆栈,及从param3到param1,栈内分布如下图:

 3.然后是返回地址入栈:此时的栈内分布如下:

4.第3行函数调用时,通过跳转指令进入函数后,函数地址入栈后,EBP入栈,然后把当前ESP的值给EBP,对应的汇编指令

push ebp
mov ebp esp

   此时栈顶和栈底指向同一位置,栈内分布如下:

 

5.第5行开始执行, int var1 = param1; int var2 = param2; int var3 = param3;按申明顺序依次存储。对应的汇编:

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

  其中将[EBP+0x8]地址里的内容赋给EAX,即把param的值赋给EAX,然后把EAX的中的值放到[EBP-4]这个地址里,即把EAX值赋给var1,完成C代码 int var1 = param1,其他变量雷同。

6.第9行,输出结果,第10行执行 对应的汇编代码:

mov  -0x4(%ebp),%eax

 最后通过eax寄存器保存函数的返回值

 

 

7.调用执行函数完毕,局部变量var3,var2,var1一次出栈,EBP恢复原值,返回地址出栈,找到原执行地址,param1,param2,param3依次出栈,函数调用执行完毕。图略

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

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

相关文章

HUE Schedule 定时调度 - 启动时间设置问题(执行次数过多,时区问题)

在启动Schedule 时需要设置开始时间&#xff0c;结束时间不用讨论&#xff0c;开始时间设置时尽量为当前时间 因为开始时间设置如果小于今天&#xff0c;比如设置为2019-01-01&#xff0c;定时器是每天1:29分启动&#xff0c;则会将日期之前的次数执行了&#xff0c;即执行开始…

Kafka(六)Kafka基本客户端命令操作

转载自&#xff1a;https://blog.51cto.com/littledevil/2147950 主题管理 创建主题 如果配置了auto.create.topics.enabletrue&#xff08;这也是默认值&#xff09;这样当生产者向一个没有创建的主题发送消息就会自动创建&#xff0c;其分区数量和副本数量也是有默认配置来…

linux平台C++开发基本知识

最近工作中&#xff0c;需要在linux上开发C程序。有了下面的问题。 1&#xff0c;linux平台C开发和win32 C开发有什么区别呢&#xff1f; 2&#xff0c;除了C语言&#xff0c;数据结构等必须的知识外&#xff0c;还需要些了解什么呢&#xff1f; 3&#xff0c;如何在linux平台开…

Impala 调用Hbase 报错 LeaseException

impala调用Hbase表数据操作时&#xff0c;提示 LeaseException 异常&#xff0c;主要原因是hbase数据过大&#xff0c;调用期间没有汇报心跳导致 WARNINGS: LeaseException: org.apache.hadoop.hbase.regionserver.LeaseException: lease -8355984789923245890 does not exist…

mitmproxy 中间人代理工具,抓包工具,linux抓包工具 mitmproxy 使用

mitmproxy是一个支持HTTP和HTTPS的抓包程序&#xff0c;类似Fiddler、Charles的功能&#xff0c;可以在linux以命令行形式的展示抓包信息 mitmdump&#xff1a;它是mitmproxy的命令行接口&#xff0c;利用它我们可以对接Python脚本&#xff0c;用Python实现监听后的处理。 mitm…

Ajax学习总结+案例

一、AJAX简介 1、Asynchronous JavaScript And XML指异步 JavaScript 及 XML 2、老技术新用法。是基于JavaScript、XML、HTML、CSS新用法 二、同步和异步&#xff08;理解&#xff09; 三、第一个异步请求案例&#xff08;熟悉编码步骤&#xff09; 四、XmlHttpRequest&…

Spark 运行内存不足Not enough space to cache rdd in memory,Container killed by YARN for exceeding memory

日志报错&#xff08;WARN类型最后执行成功可以忽略&#xff09;&#xff1a; 19/04/15 12:35:37 INFO memory.MemoryStore: Will not store rdd_2_5119/04/15 12:35:37 WARN memory.MemoryStore: Not enough space to cache rdd_2_51 in memory! (computed 1109.7 MB so far)…

Spark 某两个节点数据分析速度慢 - hbase数据删除(分裂) 元信息未删除导致 There is an overlap in the region chain.

基于Hbase2.0&#xff0c;Spark2.2 问题描述 执行Spark处理Hbase数据时&#xff0c;遇到某两个Excutor处理速度特别慢&#xff0c;如图 正常速度10多分钟 左右处理完成&#xff0c; 一个多小时有另外一个处理完成&#xff0c;还有一个在处理中。 分析原因 1.查看hbase数据分…

在MFC程序中增加控制台窗口

MFC程序中&#xff0c;如果想要输出调试信息&#xff0c;我们一般都是TRACE或者使用LOG文件&#xff0c;都不是很方便&#xff0c;第一个需要我们在调试状态下&#xff0c;第二个也要配置麻烦而且不直观。而使用Console来显示调试信息应该是更好的选择。下面介绍几种在MFC程序中…

mysql配置

MySQL5.6.11安装步骤&#xff08;Windows7 64位&#xff09; http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html1. 下载MySQL Community Server 5.6.21&#xff0c;注意选择系统类型&#xff08;32位/64位&#xff09; 2. 解压MySQL压缩包 将以下载的MySQL压缩包…

大数据技术讲解

HDFS的体系架构 整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持&#xff0c;并通过MR来实现对分布式并行任务处理的程序支持。 HDFS采用主从&#xff08;Master/Slave&#xff09;结构模型&#xff0c;一个HDFS集群是由一个NameNode和若干个DataNode组…

Hbase快照Snapshot 数据备份、恢复与迁移

场景 hbase数据迁移时我们需要统计迁移时的数据量&#xff0c;以确保迁移后的数据的完成&#xff0c;但是如果hbase表数据持续增加的话&#xff0c;迁移时无法统计出准确的数据量&#xff0c;此时我们使用快照的方式进行数据迁移&#xff0c;以确保迁移的数量可以和某一时间节点…

HUE 打开 WorkFlow异常 Operation category READ is not supported in state standby

异常&#xff1a;在hue上配置的一些定时任务突然停止执行。 1.打开页面HUE->WorkFlow 发现页面异常&#xff0c;无法进入WorkFlow&#xff0c;如下图 2.查看HUE日志 查看到WebHdfsException异常&#xff0c;访问HDFS文件浏览器报错&#xff0c; [26/Jun/2019 09:29:55 080…

Hbase Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

新启动测试环境Hbase报错&#xff0c;报错日志如下 # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 31715688448 bytes for committing reserved memory. # An error report file with mo…

CDH Yarn资源动态分配 - 指定资源限制 公平调度具体设置

日常工作中会涉及到各种资源分配等问题&#xff0c;跨部门&#xff0c;跨业务等等&#xff0c;这里介绍基于CDH版本的Yarn 公平调度&#xff08;实际使用DRF调度&#xff09; 不同时间配置不同资源参考&#xff08;计划模式&#xff09;&#xff1a;https://datamining.blog.cs…

CDH 配置YARN动态资源池的计划模式,根据时间划分资源,不同时间不同队列使用不同资源

公平调度配置可参考&#xff1a;http://datamining.blog.csdn.net/article/details/94554469 目录 计划模式设置 队列资源抢占分配 计划模式设置 1.创建计划规则 2.设置白天配置&#xff0c;可以根据业务选择具体配置计划&#xff0c;调整资源&#xff0c;选择每天&#xff…

java集合类总结

Collection&#xff1a;单列集合类的跟接口&#xff0c;用于存储一系列符合某种规则的元素&#xff0c;它有两个重要的子接口&#xff0c;分别时List和Set还有Queue。其中List的特点时元素有序&#xff0c;元素可重复&#xff0c;Set的特点时元素无序且不可重复&#xff0c;Que…

TCP为什么是四次挥手

TCP 3次握手 客户端向服务器发送一个SYN&#xff08;包含了SYN&#xff0c;SEQ&#xff09;。 当服务器接收到客户端发过来的SYN时&#xff0c;会向客户端发送一个SYNACK的数据包&#xff0c;其实ACK的ack等于上一次发送SYN数据包的&#xff08;SYNSEQ&#xff09;。 当客户…

TCP的三次握手和四次挥手详解

为什么需要“三次握手” 在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端&#xff0c;因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。…

zabbix server is not running the information displayed may not be current

页面报错如下 查看日志提示 30037:20190710:193016.878 cannot start alert manager service: Cannot bind socket to "/var/run/zabbix/zabbix_server_alerter.sock": [13] Permission denied.30039:20190710:193016.879 server #30 started [preprocessing manage…