c语言活动记录-图解(一)
来源:
1、《代码揭秘》第六章函数与函数调用
2、http://blog.csdn.net/zhuliting/article/details/6839233
引入话题:
局部变量是动态分配的-》降低了运行效率-》为了使得动态分配的代价最小化,编译器试着每次为一大组局部变量分配空间,而不是每次为单独的一个变量分配空间
-》对于函数来说,被分配给每次函数调用的那一大块内存叫作“活动记录” (”活动记录“在函数调用时被创建,当函数返回时被销毁)
”活动记录“存放在栈中,栈指针和帧指针界定了活动记录的范围。其中栈指针始终指向栈顶,帧指针为一个活动记录的开始地址。
在汇编语言中,帧指针存放在EBP寄存器中,栈指针存放在ESP寄存器中。
参考:http://www.cnblogs.com/shitouer/archive/2010/04/05/1704554.html
#include <stdio.h> int sum(int a,int b,int m,int n)
{
return a+b;
} int main()
{
int result = sum(1,2,3,4);
}
使用反汇编技术分析上述代码见上述参考博客。下面主要是根据反汇编结果给出的栈图
一般进入函数后,要完成3步:
1、旧的帧指针入栈
2、EBP = ESP;
3、栈指针减小
阴影部分为main函数开始时的ESP和EBP。进入main函数后,首先,旧的帧指针入栈(旧的EBP为0x0012FF88),因为指针占4个字节,所以ESP由原来的
0x0012FF4c变为0x0012FF48.
接着push ebx push esi push edi
以及lea edi, [ebp-44h]
接着程序运行到 int result = sum(1,2,3,4);
即:进入函数sum(....)中,此时”活动记录“变为函数sum的活动记录。
4个参数入栈,栈中情况变为如下图所示。
接着,保存返回地址(在我做的实验中,返回地址为0x00401085)
接着将旧的EBP入栈,保存起来,这个旧的帧指针是main函数活动记录的帧指针:0x0012FF48
然后将EBP=ESP
接着sum函数的活动记录的ESP减小
int sum(int a,int b,int m,int n)
{
return a+b;
}
在sum函数中,如何找到a+b,即1+2;
由上图可见,EBP+8所在的位置为1,EBP+12所在的位置为2.
下篇图解函数函数返回时的问题。
c语言活动记录-图解(一)的更多相关文章
- C语言过程活动记录
C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等.解决这个问题的经典机制是堆栈中的活动记录. 当每个函数被调用时,都会产生一个过程记 ...
- .NET应用架构设计—适当使用活动记录模式代替领域模型模式
阅读目录: 1.背景介绍 2.简单介绍领域模型模式.活动记录模式 3.活动记录模式的简单示例及要点 4.总结 1.背景介绍 对软件开发方法论有兴趣的博友应该发现最近“领域驱动设计”慢慢的被人发现被人实 ...
- 函数调用堆栈及活动记录 堆栈溢出 stack overflow
小结: 1.当被调函数返回主调函数时,被调函数的 活动记录-activation record / 堆栈帧-stack frame 被 弹出-popping 程序执行栈-program executi ...
- 架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)
一:表数据入口(Table Data Gateway) 表数据入口提供了用于访问单个表或者视图(也包含了联表查询)的所有SQL,通常一个表一个类.其它代码通过它来实现对数据库的交互.基于这个特点,表数 ...
- yii学习笔记(6),连接数据库,创建活动记录类
创建数据库用于测试 配置数据库连接 打开yii的配置文件目录下的数据库配置文件config/db.php <?php return [ 'class' => 'yii\db\Connect ...
- SpringBoot与MybatisPlus整合之活动记录(十五)
活动记录和正常的CRUD效果是一样的,此处只当一个拓展,了解即可 pom.xml <dependencies> <dependency> <groupId>org. ...
- C语言(记录)——内存相关_2:内存的编址与管理
本文是基于嵌入式的C语言 --------------------------------------------------------------------------------------- ...
- C语言学习记录_2019.02.10
sizeof:给出某个类型或某个变量在内存中占据的字节数:(1个字节8位,即8比特) 格式符 (1)%ld表示数据按十进制有符号长型整数输入或输出. (2)%d表示数据按十进制有符号整型数输入或输出. ...
- 在Go语言中记录log:seelog包
前两周调bug调的吐血,虽然解决了但是还是挺浪费时间的.跟同事聊了聊,觉得我们现在项目中的日志记录太少了,导致出了问题不知道怎么下手,还得自己改代码记录日志,然后排查问题.这样如果将来还有bug的话还 ...
随机推荐
- ubuntu16.04 添加中文ibus输入法
ubuntu版本 16.04 在terminal 输入命令 sudo apt-get install ibus-pinyin sudo apt-get ibus-setup 设置 选择拼音,添加选择 ...
- WPF 自定义依赖属性
原博客地址:http://www.cnblogs.com/DebugLZQ/archive/2012/11/30/2796021.html DependencyObject和Dependen ...
- sizeof结构体
规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...
- wget 官方jdk
每次下载jdk都是一件头疼的事,特别是在服务器上下载. 之前想的是下载到本地,然后通过ftp工具传上去.汗.. 后来想到用wget 直接下载到服务器上. 在网上找了几个例子,wget 加参数,如:wg ...
- 18-THREE.JS 基本材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- L127
Biggest Studies on Aspirin Show Risks Outweigh Benefits for Many People Doctors have long recommende ...
- objective-c和java下解析对象类型和数组类型JSON字符串
首先讲objective-c如何实现: 这里需要用到2个插件,一个是JSONKit,另一个是Jastor,一共包含6个文件,3个.h头文件和3个.m实现文件.在ARC的工程中如何导入不支持ARC的第三 ...
- vbs 字符串替换
http://blog.csdn.net/flm2003/article/details/7212448 function返回值 http://www.cnblogs.com/wakey/p/5758 ...
- Android 自定义组件之如何实现自定义组件
参考链接:http://blog.csdn.net/jjwwmlp456/article/details/41076699 简介 Android提供了用于构建UI的强大的组件模型.两个基类:View和 ...
- ip分包研究-以UDP为例
原文 http://www.jianshu.com/p/741cb12ab0c9 测试环境: 利用iOS的NE从TUN抓取IP packets,如下代码分析ip包: uint16_t iphid = ...