首先,高级语言的栈是从高地址向低地址增长的,为什么这样?
代码啥的在低地址,栈在高地址,这样就会向中间增长。
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
网友评论