0x00 栈介绍
栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示。
两种操作都操作栈顶,当然,它也有栈底。
0x01 C语言函数调用栈
程序的执行过程可看作连续的函数调用。
当一个函数执行完毕时,程序要回到调用指令的下一条指令 (紧接 call 指令) 处继续执行。
函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构 (call stack)。
编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文) 以备恢复以及存储本地局部变量。
1. 寄存器分配
寄存器是处理器加工数据或运行程序的重要载体,用于存放程序执行中用到的数据和指令。
因此函数调用栈的实现与处理器寄存器组密切相关。
我们常见的一般都是intel 32位体系架构的处理器,包含 8 个四字节寄存器。
其中
- ESP:堆栈指针寄存器,存放执行函数对应栈