目录
前言介绍
我们学习语法学习编程逻辑都是基于封装好的知识上来进行学习,知其然而不知其所以然,如果想要更好的掌握理解所学知识,我们对知识应该有一个更深层次理解,了解过基本语法的伙伴应该都有过下面这些疑问,这些问题怎么去理解,这里就需要我们去了解函数栈帧的创建与销毁;
1.局部变量是怎么创建的?
2.为什么局部变量不初始化的值是随机值?
3.函数是怎么传参的?传参的顺序是怎么样的?
4.形参和实参是什么关系?
5.函数调用是怎么做的?
6.函数调用结束后怎么返回的?
如果上面问题你都能了解,在此让我叫你一声大佬,不了解的也没关系,下面我会为大家详细的来讲解整个函数栈帧的创建与销毁;
注意:这里我使用vs2019和大家展示,每个编译器上的展示可能略有差异,但是大体逻辑是一样的,版本越低的编译器越好观察,编译器越高级越不容易观看整个创建与销毁的过程,因为它的封装过程会复杂一些;
1.寄存器
理解整个过程我们还需要知道一个知识点----寄存器
寄存器有很多种,例如:eax ebx ecx edx ebp esp.....................
和现在内容有关的主要就是ebp esp,这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的;
2.汇编指令介绍
- push----PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4(将对象进行压栈);
- mov----MOV 指令将源操作数复制到目的操作数;
- sub----两个操作数的相减,即从A中减去B,其结果放在A中;
- lea----LEA指令将存储器操作数mem的4位16进制偏移地址送到指定的寄存器;