函数栈帧的创建与销毁是一个难以理解的知识点,这里用到一个具体的例子去讲解。
注意:
1.ebp:寄存器存放栈帧的栈底地址;esp:寄存器存放栈帧的栈顶地址。
2.开辟Add函数栈帧之前,编译器就会把形参空间开辟出来,下图中的ecx、eax存放,而且是b先入栈,也就是说,开辟形参空间是由参数列表右边---->左边。
3.在函数栈帧开始后,都会初始化该函数空间为CCCCCCC,因此我们要是没有初始化变量,打印之后就会出现乱码“烫 ~烫~烫”之类的。
4.在Add函数内部执行加法操作时,可以看出,利用ebp+8/+12来找到形参,也就是没在Add这个函数栈帧里面的。
5.执行完成之后,把z的值存入寄存器里面去,因为函数栈帧被销毁,而需要返回z的值。
6.通过修改ebp的值,找到原先main函数的栈帧底部指针,同时根据此时栈顶存放的call指令的下一条指令的地址,找到原先应该继续执行的main函数中的指令,进而返回main函数继续执行。