先看一张图:
函数调用前后栈和寄存器的变化
四种寄存器:
eax(accumulator): 存放函数返回值
ebp(base pointer): 存放执行中的函数对应的栈帧的栈底地址
esp(stack pointer): 存放执行中的函数对应的栈帧的栈顶地址
eip(instruction pointer): 指向当前执行指令的下一条指令

需要了解的是,每个函数调用过程都对应一个栈帧,一个栈帧用esp和ebp两个寄存器表示,ebp表示栈帧的底部,esp表示栈帧的顶部。

以main函数调用foo()为例,首先将函数参数从右到左进栈,将函数返回地址进栈(其实就是当前eip的下一条指令的地址),注意此时加入的东西都还是属于main的栈帧。直到main得到ebp进栈,此时才到了foo()函数的栈帧(main的ebp指针位于foo的栈帧内),同时foo的ebp指向foo栈帧的栈底,foo的eip指向foo()第一条指令的地址(call调用)。最后,若有返回值,则存储在eax寄存器中。

相关文章:

  • 2021-05-27
  • 2022-12-23
  • 2022-12-23
  • 2021-08-31
  • 2022-12-23
  • 2021-12-30
  • 2022-01-21
  • 2022-12-23
猜你喜欢
  • 2021-07-29
  • 2021-05-25
  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
  • 2022-12-23
  • 2021-11-25
相关资源
相似解决方案