手把手带你函数栈帧的创建和销毁(通过内存和图解)

前言

本篇文章是在VS2013环境下调试的

在研究函数栈帧的创建和销毁时,建议不要使用太高级的编译器,越高级的编译器,越不容易观察函数的栈帧创建和销毁的过程。
同时,函数栈帧创建和销毁的过程在不同编译器下是有略微差异的,但大体上是一致的,具体细节取决于编译器的实现。

那么什么是函数栈帧呢?

每一个函数调用,都会在栈上创建一个空间,而这个在栈区上为函数创建的空间就叫做函数栈帧

接下来就开始关于函数栈帧的创建和销毁的学习吧!

寄存器

首先,让我们先了解有哪些寄存器,有eax,ebx,ecx,edx……
我们在这里的重点是ebpesp这两个寄存器

ebpesp这两个寄存器中存放的是地址,这两个地址就是用来维护函数栈帧的。
ebp指向当前栈帧的底部(高地址)
esp指向当前栈帧的顶部(低地址)
在这里插入图片描述

具体代码详解

这里咱用个简单的加法函数来展示

c语言

int Add(int x, int y)
{
   
	int z = x + y;
	return z;
}
int main()
{
   
	int a = 10;
	int b = 20;
	int c = 0;

	c = Add(a, b);

	printf("%d\n", c);
	return 0;
}

反汇编

#include<stdio.h>
int Add(int x, int y)
{
   
003113C0 55                   push        ebp  
003113C1 8B EC                mov         ebp,esp  
003113C3 81 EC CC 00 00 00    sub         esp,0CCh  
003113C9 53                   push        ebx  
003113CA 56                   push        esi  
003113CB 57                   push        edi  
003113CC 8D BD 34 FF FF FF    lea         edi,[ebp+FFFFFF34h]  
003113D2 B9 33 00 00 00       mov         ecx,33h  
003113D7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
003113DC F3 AB                rep stos    dword ptr es:[edi]  
	int z = 0;
003113DE C7 45 F8 00 00 00 00 mov         dword ptr [ebp-8],0  
	z = x + y;
003113E5 8B 45 08             mov         eax,dword ptr [ebp+8]  
003113E8 03 45 0C             add         eax,dword ptr [ebp+0Ch]  
003113EB 89 45 F8             mov         dword ptr [ebp-8],eax  
	return z;
003113EE 8B 45 F8             mov         eax,dword ptr [ebp-8]  
}
003113F1 5F                   pop         edi  
003113F2 5E                   pop         esi  
003113F3 5B                   pop         ebx  
003113F4 8B E5                mov         esp,ebp  
003113F6 5D                   pop         ebp  
003113F
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
学习IEC 104协议和编程实现九号遥控功能是一项复杂的任务。本文将以300字的篇幅简要概述该过程。 首先,IEC 104协议是电力自动化系统中常用的通信协议之一,用于远程监控和控制通信。要学习IEC 104协议,首先需要了解其基本原理和通信过程。可以通过阅读相关技术文档、书籍和在线教程来深入了解IEC 104协议的细节。 接下来,学习IEC 104协议的编程实现需要有一定的编程基础。主要编程语言可以选择C、C++或者其他常用的编程语言。编程实现九号遥控功能需要掌握IEC 104协议的编码和解码过程,了解相应的数据结构和流程控制。 在编程实现九号遥控功能时,首先需要建立与远程终端设备的连接。可以利用TCP/IP协议进行通信,建立socket连接。在连接建立后,必须正确配置IEC 104协议的站地址、传输参数等信息。 然后,需要编写代码实现IEC 104协议的编码和解码过程。首先,将要发送的遥控命令封装成IEC 104规定的格式,即APCI(Application Protocol Control Information)+ASDU(Application Service Data Unit)+ASDU信息组。然后,根据协议规定的解码方式,对接收到的遥控命令进行解码。 最后,根据九号遥控功能的具体需求,编写代码处理相应的逻辑。例如,判断遥控命令的类型,执行相应的操作,并及时响应给远程终端设备。 总结而言,学习IEC 104协议和编程实现九号遥控功能是一项需要专业知识和编程技能的任务。需要深入学习和实践才能掌握。希望以上简要概述可以为您提供一些指导。如需深入了解,请参考相关专业文献和指导资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值