学C的第十一天【查看汇编代码一步步了解 函数栈帧(栈区局部变量)的创建和销毁 讲解】-1

简介: 函数栈帧的创建和销毁越高级的编译器,越不容易学习和观察该过程同时在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现

函数栈帧的创建和销毁

  • 越高级的编译器,越不容易学习和观察该过程
  • 同时在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现

1.寄存器:ebpesp(和函数栈帧有关)

esp栈顶指针        ;        ebp栈低指针

寄存器集成在CPU上的

ebp 和 esp 这两个寄存器中存放的是地址

这两个地址是用来维护函数栈帧的

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


2. 正在调用哪个函数,esp 和 ebp 就在维护哪个函数的函数栈帧


3. esp 和 ebp 之间的空间就是系统为这次函数所调用的空间,叫这次函数的函数栈帧


4. 栈区的使用习惯是先使用高地址,再使用低地址


5. 空间消耗时,从高地址向低地址消耗


6. 再开辟新空间时,使用的空间是上面的空间(往上使用)


7. 像栈一样,放数据是在顶上(栈顶)放数据

测试代码:

#include <stdio.h>
int Add(int x, int y)
{
  int z = 0;
  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;
}


a1071435c168482fa2f9fc96ffe83335.png

在VS2013中,main函数也是被其它函数调用的


mainCRTStartup        -->        __tmainCRTStartup        -->        main函数


       (调用)                                           (调用)

1d871d970ea4400fabdb0647623b1aae.png

(所以实际开辟的空间为:)

c438bd90a3ee4c238ef7da8b1eff953b.jpg

(查看汇编代码:)


f0fd54d248074be48988803de8e5ad67.png

(1).push压栈):给栈顶放一个元素

       [补充:pop出栈) -->   从栈顶删除一个元素]

(压栈前:)

464d7749e1f4488294311fa1848b2aa8.png

(压栈后:esp会往上移,移到压的元素上方)

image.png

(2).mov把后面的值赋给前面,把esp的值赋给ebp):


image.png

(3).sub让esp减去一个十六进制数):

image.png

(4).连续push三次:

76386f6b64794a16ad730d6cabf50428.png

(5).leaload effective address -- 加载有效地址,把一个有效地址加载到edi中):

e2278c1b6a60477abb987cea58d682d3.png

(6).两次mov后,rep stos

ef9c141b3ee845788f8970672bc566aa.png

ef9c141b3ee845788f8970672bc566aa.png

之前出现过的“烫烫烫”乱码的原因:

变量未初始化,变量里面的数据是“cc cc cc cc”,这些“cc cc cc cc”在使用后会产生随机值,即"烫烫烫",而初始化就会将这些随机值覆盖

(7).产生局部变量:int a = 10; (mov)


image.png

(8).产生局部变量:int b = 20; (mov)


7c2ab807724746f9b98e1d4cfab1ac4c.png 

相关文章
|
22天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
35 0
|
2月前
|
存储 编译器 C语言
【数据结构】C语言实现链队列(附完整运行代码)
【数据结构】C语言实现链队列(附完整运行代码)
36 0
|
2月前
|
存储 算法 程序员
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
40 0
|
5天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
5天前
|
C语言
数据结构中顺序栈的进栈和出栈用C语言表示
数据结构中顺序栈的进栈和出栈用C语言表示
13 1
|
15天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
19 0
|
27天前
|
存储 缓存 算法
【算法与数据结构】栈的实现详解
【算法与数据结构】栈的实现详解
|
27天前
|
存储 算法 编译器
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
|
2月前
|
存储
【数据结构】什么是栈?
【数据结构】什么是栈?
31 0
【数据结构】什么是栈?
|
2月前
|
存储 设计模式 算法
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
53 0