首先,高級語言的棧是從高地址向低地址增長的,為什么這樣?
代碼啥的在低地址,棧在高地址,這樣就會向中間增長。
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