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分别压栈压在栈顶



相关文章
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
|
存储 安全 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
141 0
|
存储 编译器 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
177 0
|
存储 C语言
【C语言】——函数栈帧的创建与销毁
【C语言】——函数栈帧的创建与销毁
|
存储 编译器 C语言
C语言:底层剖析——函数栈帧的创建和销毁
C语言:底层剖析——函数栈帧的创建和销毁
188 0
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(二)
C语言之反汇编查看函数栈帧的创建与销毁(二)
|
编译器 C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(下)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
119 0
|
2月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
226 15
|
8月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
362 23
|
7月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
161 1
一文彻底搞清楚C语言的函数