程序栈是什么样

过程调用
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想用的话必须先将其保存,才能使用.

所谓使用,即对其覆盖它原来的值

所谓保存,即入栈

原文地址:https://www.cnblogs.com/zhyryxz/p/1745439.html