在函式呼叫過程中,需要切換堆疊,
先介紹幾個常用的暫存器
esp 堆疊指標暫存器,這個暫存器指向當前堆疊的棧頂
ebp 堆疊基位址暫存器,這個暫存器指向堆疊的棧底
eip 指令暫存器,儲存了下一條指令的位址
有了上面的鋪墊,開始接受當函式呼叫時候指向call以及返回ret時候堆疊的狀態,
當執行call的時候cs:eip以及指向了函式呼叫後的下一條指令,此時需要將cs:eip壓入堆疊,以便呼叫完繼續執行。
接下來,就是需要儲存當前的堆疊,所以把當前的ebp也壓入堆疊
這樣原理的堆疊基位址就儲存了,此時把esp 賦值給ebp,此時
這樣新的函式棧就建立了,此時的esp和ebp相等,等於說是乙個空棧
那麼接下來函式內部變數就可以使用這個棧了,
這樣堆疊就實現了函式的呼叫的切換
那如果函式呼叫結束後呢,此時就需要還原,
退出邏輯正好相反,此時需要把ebp的內容再複製給esp,然後再彈出(pop)ebp,這樣堆疊機恢復了,然後就可以ret了,下面接直接彈出cs:eip繼續執行。
C 函式呼叫原理理解
空程式 int main 各指標出棧 00411380 pop edi 彈出edi 00411381 pop esi 彈出esi 00411382 pop ebx 彈出ebx 00411383 mov esp,ebp esp 復原00411385 pop ebp 彈出ebp,也復原 00411386...
C 函式呼叫原理理解
空程式 int main 各指標出棧 00411380 pop edi 彈出edi 00411381 pop esi 彈出esi 00411382 pop ebx 彈出ebx 00411383 mov esp,ebp esp復原 00411385 pop ebp 彈出ebp,也復原 00411386...
c c 函式呼叫機制的理解
要想理解函式呼叫,首先必須理解函式。函式的值一般由返回值和傳遞的引數構成。所以當函式建立的時候,會有一段記憶體用來儲存函式的引數和返回值。在c中引數的傳遞只有值傳遞的形式,而在c 中則多了引用傳遞。值傳遞的過程,是指在被傳遞的函式中,新建了一塊記憶體用來儲存被傳遞的引數。而引用傳遞,則沒有新建一塊記...