(没搞懂写的可能有问题!!!)
问题一:main函数调用sum,sum执行完以后,怎么知道回到哪个函数中?
问题二:sum函数执行完,回到main以后,怎么知道从哪一行指令继续运行的?
函数运行时,操作系统会在栈帧上给其分配空间:
- ebp是栈底指针,esp是栈顶指针;
- 上面是低 地址,下面是高地址;栈底是高地址,栈顶是低地址
1. 在mian中首先将参数依次翻入栈底,以及ret的定义:
2. 调用sum函数:
调用方首先压入参数,从右向左,放入栈顶(esp是永远指向栈顶的)
3.参数调用压完了,接下来是调用call命令:
会把当前指令的下一行的地址压入栈中:也就是执行sum函数之后的那一行。
4. 然后将ebp所在的指针地址压入栈:
5. 然后把esp地址赋给ebp:
因为此时函数的执行来到了sum函数中,ebp指向sum的栈底
6. 然后向上开辟栈帧空间,用0xCCCCCCCC填补-858993460({左括号对应指令)
7.开始执行sum中的指令:
执行a+b,再把值赋给temp
8.回退栈帧,ebp赋给esp,ebp到栈底
函数运行结束,栈帧回退,这块函数的栈帧空间已经交还系统了
9.执行ret操作:
- 1.出栈,esp自动更新,下移。
- 2.把出栈的内容放入CPU的PC寄存器里面(存放CPU执行下一条指令的地址)
esp一步步的归为,刚才sum函数return的时候,将值放在eax寄存器中。