esp和ebp的在函数调用时的行为

首先,高级语言的栈是从高地址向低地址增长的,为什么这样?

代码啥的在低地址,栈在高地址,这样就会向中间增长。



esp永远指向栈顶元素。不是指向没有数据的空地址。

push时,先减四后赋值

ebp永远指向栈底元素。他一般存储了上一个函数的ebp。


进入函数中,先push ebp

再mov ebp,esp 这时俩寄存器都指向保存的上个函数的ebp的值。


下面esp减去一大块,为临时变量流出空间。


离开函数时执行

leave时,他的作用与上面的相反,相当于

mov esp,ebp  让esp指向当前的栈底

pop ebp 将栈顶(esp指向的内存)的值给ebp这样,就恢复了上个函数调用此函数至少得值,esp因为弹栈而加四,然后指向的是返回地址。


随后执行ret,ret指令相当于

pop eip 即将栈顶的值(esp指向的内容)复制给eip指令寄存器。esp+4

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 10,174评论 1 19
  • 首先寄存器使用惯例:eip :指令地址寄存器,保存程序计数器的值,当前执行的指令的下一条指令的地址值,16位中为i...
    扎Zn了老Fe阅读 6,046评论 0 0
  • 栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函...
    zjfclimin阅读 9,565评论 0 5
  • 堆栈是连续的地址空间,且向低地址端生长。 esp 是堆栈指针ebp 是基址指针那两条指令的意思是将栈顶指向ebp的...
    wyrover阅读 4,852评论 0 1
  • 只要我还在乎你 你就是我心上的王子 从乱世中打马而过 不只是留给我惊鸿一瞥 如果你肯停下来 在这座孤零零的城 (反...
    素挲阅读 2,394评论 3 5