首页 > 其他分享 >函数栈帧(下)

函数栈帧(下)

时间:2024-07-04 13:55:22浏览次数:18  
标签:函数 esp ebp 寄存器 main 栈帧

一 函数栈帧的创建

我们首先来一步步解析上一篇文章的汇编代码

00BE1820  push        ebp    //把ebp寄存器中的值进行压栈,此时的ebp中存放的是
invoke_main函数栈帧的ebp,esp-4
00BE1821  mov         ebp,esp  //move指令会把esp的值存放到ebp中,相当于产生了main函数的
ebp,这个值就是invoke_main函数栈帧的esp
00BE1823  sub         esp,0E4h  //sub会让esp中的地址减去一个16进制数字0xe4,产生新的
esp,此时的esp是main函数栈帧的esp,此时结合上一条指令的ebp和当前的esp,ebp和esp之间维护了一 个块栈空间,这块栈空间就是为main函数开辟的,就是main函数的栈帧空间,这一段空间中将存储main函数 中的局部变量,临时数据已经调试信息等。
00BE1829  push        ebx  //将寄存器ebx的值压栈,esp-4
00BE182A  push        esi  //将寄存器esi的值压栈,esp-4
00BE182B  push        edi  //将寄存器edi的值压栈,esp-4
//上面3条指令保存了3个寄存器的值在栈区,这3个寄存器的在函数随后执行中可能会被修改,所以先保存寄 存器原来的值,以便在退出函数时恢复。

 

 

 

 

 

上面的这段代码最后4句,等价于下面的伪代码:

edi = ebp-0x24; ecx = 9; 
eax = 0xCCCCCCCC; 
for(; ecx = 0; --ecx,edi+=4)
 { 
 *(int*)edi = eax;
  }

二 小知识:烫烫烫烫 

#include<stdio.h>
int main()
{
	char arr[20];
	printf("%s", arr);
	return 0;
}

 下面这段代码之所以会发出来烫烫烫烫的原因是因为函数初始化的值为occcccccch
oxcccc的文本就是“烫”

三 函数中临时变量的创建 

四 Add()函数的调用 

 

函数调用过程 

call 指令是要执行函数调用逻辑的,在执行call指令之前先会把call指令的下一条指令的地址进行压栈操作,这个操作是为了解决当函数调用结束后要回到call指令的下一条指令的地方,继续往后执行。

函数栈帧的创建和压栈和main()函数是大差不差的
通过观察x y的值我们可以更加深刻的理解 为什么函数的形参是实参的零食拷贝这句话
当最后计算出z的结果的时候
将z存放到寄存器当中 之后开始销毁add()的栈帧 

五 函数栈帧的销毁

六 回答文章最初的问题 

1 局部变量是如何创建的?
首先函数创建一个栈帧空间 初始化好之后空间之后再为局部变量分配好空间
2 为什么局部变量不初始化内容是随机的?
因为里面的值是我们随机放进去的 初始化后随机值就会被我们覆盖
3 函数调用时参数时如何传递的?传参的顺序是怎样的?
当调用函数之前 从右向左开始压栈
4 函数的形参和实参分别是怎样实例化的?
形参是实参的一份临时拷贝
形参在函数调用之后进行实例化
实参在函数中进行实例化
5 函数的返回值是如何带会的?
通过寄存器带回

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言

标签:函数,esp,ebp,寄存器,main,栈帧
From: https://blog.csdn.net/Zbldx/article/details/140177631

相关文章

  • Go语言--自定义函数
    定义格式函数构成代码执行的逻辑结构。在Go语言中,兩数的基本组成为:关键字func、函数名、参数列表、返回值、所数体和返回语句。函数定义说明:func:函数由关键字func开始声明FuncName:函数名称,根据约定,数名首字母小写即为private,大写即为public.参数列表:函数可以有0......
  • MySQL 函数简介
    MySQL提供了丰富的函数,以下是一些常见的类型和示例:数学函数:**1.ABS(x):返回x的绝对值。示例:selectABS(-89);**2.CEIL(x):返回大于或等于x的最小整数。示例:selectCEIL(-89);**3.FLOOR(x):返回小于或等于x的最大整数。示例:selectFLOOR(-89);**4.RAND......
  • EXCEL中20个数据处理类函数公式应用实例
    在Excel中,数据处理类函数是进行数据分析和报告制作的重要工具。以下列举了另外20个数据处理类函数及其应用实例,这些函数涵盖了一系列高级的数据处理需求,包括统计分析、财务计算、工程计算以及更复杂的文本和日期时间操作。数据统计与分析STDEV.S函数:用于计算样本标准差。例......
  • printf函数与cout函数的优缺点
    printf和cout均是C/C++中常用的两种输出方式一、printf优点:1.灵活的格式化:printf提供了丰富的格式化选项,如宽度、填充字符、对齐等。2.适用于多种数据类型:printf可以输出各种内置数据类型,如整数、浮点数、字符等。3.易于理解:对于有经验的程序员来说,printf的语法和格......
  • Python从入门到放弃——深入研究Print函数
    深入浅出Print函数第一个代码“HelloWorld”在正常配置了PyCharm或者Thonny等编辑器之后,我们开始写第一个代码。正常的情况下学习一门编程语言,一般第一个代码都是输出HelloWorld。那么如何打印HelloWorld呢?print("HelloWorld")然后我们运行程序就可以看到交互窗中......
  • 【Python函数编程实战】:从基础到进阶,打造代码复用利器
    文章目录......
  • 在李航的《统计学习方法》中多项式拟合偏导函数推导存在的疑问
    在阅读李航的《统计学习理论第二版》1.42过拟合与模型选择中遇到的一个问题。​​​这段公式的推导让我费解,于是我开始了自己的验证。前提:用多项式函数对已知数据的拟合。设拟合函数为:f......
  • 函数式编程和命令式编程
    函数式编程(FunctionalProgramming,FP)与命令式编程(ImperativeProgramming,IP)是编程领域中两大截然不同的范式,它们在解决问题的策略和哲学上存在着本质的差异。函数式编程(FunctionalProgramming)函数式编程核心理念在于通过函数来定义、封装及组合计算逻辑。其核心特性之一......
  • 【python基础】print函数的基础使用以及进阶
    一、print函数的基本使用print函数是Python中最基本的输出函数,用于将信息打印到控制台,是学习python、调试代码必不可少的函数我们首先看一下python函数的基本语法结构:>>>help(print)Helponbuilt-infunctionprintinmodulebuiltins:print(...)print(value,...,......
  • 各种特殊损失函数
    死区损失函数点击查看代码importnumpyasnpimportmatplotlib.pyplotasplt#Definetheparametersa=2b=5epsilon=0.1#DefinethelossfunctionL(x)anditsderivativedefL(x,a,b,epsilon):ifx<a:return(x-a)**2/(2*epsi......