栈-函数调用
编译以下程序,分析此程序以得出栈的精髓:
1、主函数被上层调用者调用后,执行PUSH EBP,ESP-4(因为EBP入栈),EBP值没有改变,值得注意的是刚开始分配站的时候,第一个入栈的是return,主函数的返回地址,然后是EBP
2、然后是MOV EBP,ESP,将ESP的值赋给EBP,该语句未执行时,EBP仍为上层调用者的栈的栈底指针,执行该语句后,EBP变为新栈的栈底指针(先将其入栈,是为了返回上层时,栈的状态也会随之返回,函数调用结束,函数的栈即消失)
3、然后就是一些函数内部的数据入栈出栈等操作
4、函数即将结束时,执行MOV ESP,EBP操作,清空该栈,回到第二步的状态2
5、上步结束后,执行pop ebp操作,此时ebp指向上层调用者的栈底
6、最后一步为return,返回函数调用的地址,函数调用和函数返回的时候会调用栈顶指针ESP