1.建议使用较老式的IDE来观察(越新的编译器打包越完整,越不易观察)
2.认识了解常见寄存器(寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。):ebp(栈底指针) esp(栈顶指针)(存放地址,地址用来维护函数栈帧)
栈是从高地址到低地址存放数据(从ebp那头开始使用)
还有常见的如eax ebx ecx edx
3.在C语⾔中每⼀次函数调⽤,都要需要为本次函数调⽤在栈区申请⼀块内存空间来保存函数调⽤期间
的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。
函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归
函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。
所以如果采⽤函数递归的⽅式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢
出(stack overflow)的问题
4.main函数也是被调用的。

所以在main函数之前已经有函数在堆栈中存在了,我们叫他tmainst,这是main函数的caller。然后把此时的EBP的值暂存并压栈(以达到暂存的目的)存入main的堆栈中(),在main函数退出时恢复(esp-4),并给予ebp新的值-----
。

esp在sub(减)掉一个空间的值(E4=16*15+4=224),再压入ebx esi edi

然后在开辟的空间里进行初始化为0xcc

但是3*16+9=57,其实是因为中间差了的这四个就是esp和ebp move之后ebp所占领的空间。
5.caller让参数和返回地址入栈,完成预构建(main函数无参数,暂时对于小白应该不考虑main的返回)
callee让EBP和通用寄存器入栈。

这是一篇笔记,方便我自己看懂,要详细学习可参考https://zhuanlan.zhihu.com/p/313608043