【c++】函数调用机制
1.建立栈帧空间
2.传递数据,为局部变量分配空间
3.保护现场,主调函数运行状态和返回值地址入栈
4.执行被调函数体
5.释放局部变量的栈空间
6.恢复现场,取主调函数运行状态和返回值地址
7.继续执行主调函数后续语句
详细介绍:
ebp esp eax 等均是寄存器
1. 建立栈帧空间:
当函数被调用时,操作系统会为该函数分配一个 栈帧(esp(低地址 栈顶) ebp(高地址 栈底)),这是函数的局部空间。
2. 传递数据,为局部变量分配空间:
函数的 参数(如果有)会传递到栈帧中(esp向上移动)。
此外,函数的 局部变量 也会在栈帧中分配空间。局部变量的空间在栈上分配,而不是在堆或其他地方。
3. 保护现场,主调函数运行状态和返回值地址入栈:
主调函数的 运行状态(下一步执行语句的地址)和 返回地址(ebp地址)会被保存在栈帧中。
(esp向上抬升44h 将原本esp地址给ebp 此时esp和ebp指向中间位置就是新栈帧空间 并使用cccc填充)
4. 执行被调函数体:
现在,被调函数的代码开始执行。
若有返回值 使用eax保存
5. 释放局部变量的栈空间:
当函数执行完毕后,它的 局部变量 被销毁,栈空间被释放。
此时,栈指针会回到被调函数调用前的位置,局部变量空间被清空。
6. 恢复现场,取主调函数运行状态和返回值地址:
恢复主调函数的 寄存器状态,确保主调函数继续从上次暂停的位置执行。(ebp给esp ebp原本的值从栈中获取)
恢复 返回地址,指向主调函数调用时的下一条指令地址。
7. 继续执行主调函数后续语句:
主调函数在栈帧被清除后,继续执行其后续的语句。
程序控制流会跳转到主调函数中返回地址的位置。