函数调用的过程

当一个函数被调用时,程序会执行以下步骤:
1.保存当前上下文:保存程序计数器(指令指针)和寄存器的内容,用于恢复调用前的状态。
2.分配栈帧:在栈上为被调用函数分配内存,管理局部变量、参数和返回地址。
3.传递参数:通过栈或寄存器传递参数给被调用函数。
4.跳转到函数代码:更新程序计数器为被调用函数的入口地址。
5.执行函数:运行函数体的代码。
6.返回调用点:恢复上下文并跳转回原调用点。

栈帧是函数调用时在栈上分配的内存区域,包含以下内容:
1.函数的参数:传递给函数的输入数据。
2.返回地址:函数执行完毕后返回的地址。
3.局部变量和临时数据:函数内部声明的变量及中间计算结果。
4.保存的上下文信息:调用者的栈指针和寄存器状态。

扩展知识:
函数调用栈:
- 函数调用栈是管理函数调用顺序的内存区域。
- 调用函数时,参数、局部变量和返回地址入栈;函数执行完毕后出栈,控制权返回调用者。
- 确保程序执行有序且正确返回。

函数栈帧:
- 函数栈帧是调用栈中的单元,存储单个函数执行所需的信息。
- 函数调用时创建新栈帧,执行完毕后释放。
- 包含以下部分:
  -返回地址:函数结束后返回的指令地址。
  -参数:传递给函数的参数值。
  -局部变量:函数内部定义的变量。

寄存器基础知识:
- eax/rax:累加器,存储操作结果和函数返回值。
- ebx/rbx:基址寄存器,存放基地址。
- ecx/rcx:计数器,控制循环次数。
- ebp/rbp:栈底指针,保存栈帧基地址。
- esp/rsp:栈顶指针,指向当前栈顶。
- edi/rdi、esi/rsi:变址寄存器,用于参数传递和数据操作。

汇编指令:
- mov a,b:将b的值赋给a。
- call:将返回地址压栈(rsp递减),跳转至函数入口。
- ret:弹出返回地址(rsp递增),跳转至该地址。
- push:压栈操作,rsp递减。
- pop:出栈操作,rsp递增。

你可能感兴趣的:(c++)