C语言之函数栈帧的创建与销毁讲解(1)(一)

简介: C语言之函数栈帧的创建与销毁讲解(1)

在前期的学习中我们可能有很多困惑

例如:局部变量是怎么创建的

           为什么局部变量的值是随机值

           函数是怎么样传参的   传参的顺序是什么

           形参和实参的关系是什么

           函数调用是怎么做的

           函数掉调用结束后怎么返回的

这篇博客我们来修炼自己的内功,掌握好这篇博客的大部分知识就已经很不错了

我们用到VS2013这个编译器,目的是为了看到更详细的函数封装内容

现在我们开始我们的正题

要想了解函数栈帧,首先我们要了解一下寄存器,寄存器有我们熟悉的eax  ebx  ecx  edx

今天我们重点理解并掌握ebp  esp这两个寄存器,这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的

注意:先提醒一下大家,

每一个函数调用都要在栈区创建一个空间

现在我们写一个代码来观察一下

正在调用哪个函数我这个ebp  esp就在维护哪个函数的函数栈帧,比如我F10调试起来进入main函数,这时我的esp ebp就在维护main函数的函数栈帧

其实在我们的VS2013中,main函数也是被其他函数调用的,那么是谁呢???

下面给大家画个图

下面我们接着走

push:压栈

move:移,放值

pop:出栈

sub:减

先看最开始的几个步骤

push:先在栈顶压一个ebp

move:把esp的值给了ebp(将地址传给ebp)

sub:给esp减去一个0E4h(八进制位数)这个值,减去一个0E4h的值后值变小了(地址变小了),那么此时ebp就指向了栈顶低地址

lea:load effective address(加载有效地址),ebp-0E4h就是再main函数的栈顶,为什么呢,这是因为我们前几个步骤在算的时候,esp在减去了一个0E4h之后就已经到达了栈顶,前面又把esp的值(地址)赋值给了ebp,所以理所当然的到达了栈顶,希望大家能够理解

再将ebx   esi  edi分别压栈压在栈顶



相关文章
|
6月前
|
存储 安全 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
|
6月前
|
存储 编译器 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
|
6月前
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
|
3月前
|
存储 C语言
【C语言】——函数栈帧的创建与销毁
【C语言】——函数栈帧的创建与销毁
|
6月前
|
存储 编译器 C语言
C语言:底层剖析——函数栈帧的创建和销毁
C语言:底层剖析——函数栈帧的创建和销毁
|
6月前
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(二)
C语言之反汇编查看函数栈帧的创建与销毁(二)
|
11月前
|
编译器 C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(下)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
10天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
27 6
|
30天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
35 10