我們知道每一次函式的呼叫都是乙個過程,這個過程我們通常稱為:函式的呼叫過程。這個過程要為函式開闢棧空間,用於本次函式的呼叫過程中臨時變數的儲存、現場保護。這塊棧空間被稱為函式棧幀。
在理解函式的棧幀之前,我們需要了解幾個特殊的暫存器和一些彙編指令。eip:程式計數器,存放當前指令的下一條指令的位址;ebp:存放指向函式棧幀棧底的位址;esp:存放指向函式棧幀棧頂的位址;call:1將當前指令的下一條指令儲存,儲存的目的是為了恢復(入棧儲存);2跳轉至目標函式的位址處;ret:1,將當前棧頂的內容出棧;2,用該內容修改eip。
下面來看這個例子:
#include;
#includeint my_add(int a, int b)
int main()
當我們要詳細研究函式的呼叫過程,必須的對應彙編**。
從main函式的地方開始,要展開main函式的呼叫就得為main函式建立棧幀
接下來是my_add函式的呼叫
剩下的是函式返回部分
所以說函式的呼叫就是函式的棧幀的開闢與釋放。同時我們也可以看到棧是往下生長的。在函式呼叫完成後,我們看到並沒有對所呼叫空間內資料的修改,而是這部分空間的內容可以被修改。
C語言 深度理解函式 函式的棧幀
c語言函式是如何呼叫的呢?初學時我想當然地回答 從呼叫部分轉到函式部分逐句執行,就是那麼簡單啊,然而你有沒有想過 函式呼叫前需要做哪些準備工作?函式是如何傳參的?傳參後又是如何使用的?引數使用完後又是如何銷毀的?呼叫的整個過程是怎樣的呢?今天就通過下面這個簡單的 帶大家走進函式的世界,一 竟 inc...
iframe深度理解
前言 如果你的頁面是乙個後台管理頁面,那麼你一定對iframe不陌生。從h5定稿開始,在涉及框架引入頁面時,統一建議使用iframe來進行相關的資源嵌入。使用場景 1 通常在不希望整體頁面跳轉,只需要主體頁面跳轉,則需要加入iframe標籤來作為展示頁面的視窗,通常在管理後台 qq郵箱等管理介面應用...
深度理解指標
首先,指標是什麼呢?我們看這樣一段 includeint main 知道了這些以後,讓我們再來看幾個有關指標的定義。指標陣列 指標陣列是陣列,是乙個存放指標的陣列。舉個栗子 int arr1 10 表示每個陣列元素是一級指標,int表示指標指示的型別是整型 char arr2 4 表示每個陣列元素是...