函数调用前后栈和寄存器的变化

先看一张图:
在这里插入图片描述
四种寄存器:
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寄存器中。

发布了141 篇原创文章 · 获赞 27 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a13602955218/article/details/105283735