栈
栈:一种由高地址向低地址扩展的数据结构
作用:
1.暂时保存函数内的局部变量
2.调用函数时传递参数
3.保存函数返回后的地址
先进后出原则
一个进程中,栈顶指针(ESP)初始状态指向栈底端,执行PUSH将数据压入栈,栈顶指针就会上移到栈顶端,若栈为空,则栈顶指针重新移动到栈底端。
EBP:存放栈底地址
向栈中压入数据时,栈顶指针减小,向低地址移动;弹出数据时,栈顶指针增加,向高地址移动。
栈帧
栈帧就是利用EBP(栈帧指针)寄存器访问栈内局部变量、参数、函数返回地址等的手段。
因为ESP的值一直在变化,使用ESP为基准很难指引CPU找到准确的地址,所以,先把用作基准点(函数起始地址)的ESP值保存到EBP,并维持在函数内部,这样可以很好的管理函数调用。
参数入栈的顺序和C语言源码中参数入栈的顺序是相反的,这叫做函数参数的逆向存储。