理解函式呼叫

2021-08-20 01:44:43 字數 839 閱讀 7018

在函式呼叫過程中,需要切換堆疊,

先介紹幾個常用的暫存器

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 中則多了引用傳遞。值傳遞的過程,是指在被傳遞的函式中,新建了一塊記憶體用來儲存被傳遞的引數。而引用傳遞,則沒有新建一塊記...