x86汇编之栈与子程序调用
什么是栈 栈与普通数据结构所说的栈的概念是相似的,遵循后进先出原则。不同的是汇编中所说的栈是一个在内存中连续的保存数据的区域,也即是实际存在的内存区域,进栈和出栈遵循后进先出原则。 在x86架构中,栈是向下生长的,即栈顶指针小于栈底指针。 ESP ESP是x86架构中用于保存当前栈顶位置的寄存器。更多详细内容请参阅参考资料 [1] 下面的两对代码是相互等价的 入栈操作: push eax ;修改栈顶指针 sub esp, 4 ; 由于是向下生长,所以esp - 4, 减去4是因为eax占4个字节 mov DWORD PTR SS:[ESP], eax ;放入esp指定的内存区域 出栈操作 pop eax mov eax, dword ptr ss:[esp] add esp, 4 ;理解同入栈,注意这两行代码顺序与入栈不同 清除栈顶数据 假如我们要清除栈顶的四个双字的数据,只需要修改ESP即可 add esp, 4 * 4 ; 一个双字占4个字节,共4个双字 EBP 栈的一个典型应用就是函数调用时的参数传递。ESP保存的是当前栈的栈顶指针,EBP保存的是当前stack frame的基址 [2] . 如 [3] 所述,在可执行环境中函数经常以stack frame的形式来进行参数传递和函数局部变量的访问。stack frame的概念使得每一个子程序(在汇编中函数通常称为子程序