程序栈是什么样
过程调用
call 首先将被调函数的参数入栈,最后是返回地址入栈,再跳到被调函数起始地址
leave 准备返回时的桢栈 : 令栈指针指向先指向当前桢的起始处(这里保存的是调用者桢的起始地),出栈(桢指针重置为调用者桢的起始;且栈指针指向返回地址)
等同于 :
movl %ebp,%esp
popl %ebp
ret (栈指针指向返回地址)出栈并跳到那个位置(返回地址).
程序栈的布局:
关于寄存器
caller save:%eax,%edx,%ecx
callee save:%ebx,%esi,%edi
因为caller负责保存了%eax,%edx,%ecx,所以callee才可以直接用.
而caller却不负责保存%ebx,%esi,%edi,故callee想用的话必须先将其保存,才能使用.
所谓使用,即对其覆盖它原来的值
所谓保存,即入栈