函数栈帧的创建和销毁
环境为vs2013,编译器越高级,越不容易学习和观察。在不同的编译器下函数栈帧的创建和销毁略有差异,大体逻辑是相同的。
1.寄存器 eax、ebx、ecx、edx..
今天介绍ebp和esp,这两个寄存器中存放的是地址,这两个地址是用来维护栈帧的。正在调用哪个函数,ebp和esp就维护哪一块空间。
每一个函数调用,都要在栈区创建一个空间。
F10-右键-反汇编-可以查看C语言对应的汇编代码
push压栈 从栈顶上放一个元素进去 - pop出栈:从栈顶删除一个元素
Mov 把esp的值给ebp
Sub 给esp减去0E4h,地址变小,指向上面的某一块区域
出现了为main函数开辟的空间(栈帧)
Push 三次 ebx esi edi
Push 一次 esp往上走
Lea load effecitive address加载有效地址 ebp-0E4h放在edi里面
mov把39h放在ecx里面。再mov把0CCCCCCCh放在eax里面
Rep stos把从edi开始的ecx也就是39h次dword(double word,一个word两个字节)全部改成eax的内容也就是0CCCCCCCCh。
开始执行语句块了
把0Ah(也就是10)放在ebp-8的位置,如果不初始化,打印出来随机值“烫烫烫烫”其实就是类似于CCCC的东西的作用。
倒着放00 00 00 0a
把ebp-14h的值(20)放到eax里面
压栈eax esp上移
call调用函数
压了地址进去
add函数
形参是实参的临时拷贝,函数调用
把z 放在eax寄存器里面保存
Pop esp往下走 mov把ebp赋给esp
ebp回去了,回到main底部
Add 把形参也释放
和放到c里面