一般的说法ebp指向栈底,esp指向栈顶
从堆栈的概念来讲,压栈就是把数据放到栈顶上面,于是栈顶又增长
不过悲剧的x86堆栈要倒着长,如果以为push以后esp会增加可就大错特错了。。ebp虽然叫栈底,但是永远大于等于栈顶
每push一个值,esp相应减小
从地址角度看,栈顶在下面,栈底在上面。。干脆管ebp叫栈顶好了,不知道谁最先定义的名字,我就认为栈是从栈底压栈又怎么了。。本来也是为了好理解,现在更难理解
坑爹
另外在函数调用时:
进入前:从右向左依次压栈传入的参数,然后压栈返回地址
刚进入:push ebp,然后更新esp给ebp,这样可以迅速的找到传入的参数,以及回去的地址(就压栈在了esp的上面),同时ebp指向了调用这个函数的函数的ebp。在gdb时bt就是这样层层递推,获得调用函数的。
返回时的leave就是执行相反动作就好