C语言函数调用过程原理及函数栈帧分析

昨天晚上张帅学长讲的栈溢出听的有点似懂非懂…不过其核心内容还是函数调用栈的相关知识。趁着这个机会温习一下。

关于栈

栈是向下生长的,从内存高地址->低地址的路径延伸。栈有栈底和栈顶,且栈顶的地址要比栈底低。

函数状态主要涉及三个寄存器–esp,ebp,eip。

esp (stack pointer),”栈指针”,用来存储函数调用栈的栈顶地址,在压栈和退栈时发生变化,也就是说,esp始终指向栈顶。

ebp (base pointer),”基址(帧)指针”,用来存储当前函数状态的基地址,在函数运行时不变,可以用来索引确定函数参数或局部变量的位置。

eip 用来存储即将执行的程序指令的地址,cpu 依照 eip 的存储内容读取指令并执行,eip 随之指向相邻的下一条指令,如此反复,程序就得以连续执行指令。

CSAPP的3.7节中描述的很清楚了

参考资料:

手把手教你栈溢出从入门到放弃

c函数调用过程原理及函数栈帧分析

未完待续…

坚持原创技术分享,您的支持将鼓励我继续创作!