關於函式呼叫中堆疊維護的原理
阿新 • • 發佈:2020-10-11
1.每個函式呼叫的棧幀組成 old ebp 、暫存器資訊、區域性變數、函式入參、呼叫的返回地址
2.需要注意的是,幀棧每次操作push 或者是 pop 幀指標esp 都會自動自減或者是自增
2.每次呼叫函式之前都有下面的彙編操作
push ebp
mov esp ebp
所以ebp指標指向的是,每個函式幀棧push ebp 之後的地址,old ebp儲存的是上一層函式呼叫的棧幀的基地址
3.返回,在函式呼叫返回之前,都會有下面的彙編操作
mov ebp esp
pop %ebp
這兩句話的意思是把ebp的地址值賦值給esp,相當於把esp回退值ebp處;在當前的esp地址上,pop一個值,賦值給ebp,其實就是把ebp指標回退到上一個函式呼叫的基地址。
pop操作之後,esp指標會回退至這個函式呼叫時候的棧頂處,也就是上一個函式呼叫的末尾處,與此同時ebp指向了上一個函式呼叫的棧幀的的基地址。
4.依次類推,直至全部函式呼叫返回。
5.理解的關鍵是棧幀的結構,以及ebp具體的位置是在哪裡,這點很關鍵。