(没搞懂写的可能有问题!!!)
问题一: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寄存器中。
文章详细阐述了函数调用的过程,特别是从main调用sum函数时的栈帧操作。它解释了如何通过ebp和esp指针管理栈空间,sum执行完毕后如何通过ret指令返回main函数,并继续执行下一条指令。在调用过程中,参数压栈,然后执行函数体,最后通过出栈和更新PC寄存器来确定返回后的执行位置。
462

被折叠的 条评论
为什么被折叠?



