函式呼叫的相關注意點(棧)

2021-06-26 16:35:17 字數 1542 閱讀 2288

通常使用記憶體是從低向高位址用,但棧是預留的空間,棧底在高位址,push時,資料是向低位址存放。區域性變數定址,要用到棧的訪問。

呼叫函式時,計算機常用棧來儲存傳遞給函式的引數。

棧是一種先進後出的資料結構,棧有乙個儲存區、乙個棧頂指標。棧頂指標指向堆疊中第乙個可用的資料項(被稱為棧頂)。使用者可以在棧頂上方向棧中加入資料,這個操作被稱為壓棧(push),壓棧以後,棧頂自動變成新加入資料項的位置,棧頂指標也隨之修改(指標數值減小)。使用者也可以從堆疊中取走棧頂,稱為彈出棧(pop),彈出棧後,棧頂下的乙個元素變成棧頂,棧頂指標隨之修改(指標數值增大)。函式呼叫時,呼叫者依次把引數壓棧,然後呼叫函式,函式被呼叫以後,在堆疊中取得資料,並進行計算。函式計算結束以後,或者呼叫者、或者函式本身修改堆疊,使堆疊恢復原裝。

在引數傳遞中,有兩個重要的問題必須要明確說明:

1.當引數個數多於乙個時,按照什麼順序把引數壓入堆疊;

2.函式呼叫後,由誰來把堆疊恢復原狀。

在高階語言中,就是通過函式的呼叫方式來說明這兩個問題的。常見的呼叫方式有:

stdcall(pascal呼叫方式)

cdecl(c呼叫方式)

fastcall(快速呼叫方式)

thiscall(c++類成員函式預設的呼叫方式)

naked call(是一種比較少見的呼叫方式,一般高階程式語言中不常見)

cdecl

cdecl呼叫方式又稱為c呼叫方式,是c語言預設的呼叫方式,它的語法為:

int function(int a, int b)  // 不加修飾符就是c呼叫方式

int _cdecl function(int a, int b)  //明確指定用c呼叫方式

cdecl的呼叫方式決定了:

(1)引數從右向左依次壓入堆疊

(2) 由呼叫者恢復堆疊

(3)函式名自動加前導下劃線

由於是由呼叫者來恢復堆疊,因此c呼叫方式允許函式的引數個數是不固定的,這是c語言的一大特色。

此方式的函式被翻譯為:

push b 

// 先壓入第二個引數

push a 

// 在壓入第乙個引數

call funtion  // 呼叫函式

add  esp, 8 

// 清理堆疊

在編譯時,此方式的函式被翻譯成:_function

關於函式的呼叫有以下幾點:

1. 程序的堆疊儲存區是主調函式和被調函式進行通訊的主要區域。

2. c語言中引數是從右向左進棧的。

3. 被調函式使用的堆疊區域結構為:

區域性變數(如temp) 

低位址返回位址

函式引數 

高位址(先壓棧)

4.由主調函式在呼叫後清理堆疊(彙編**:add esp, 8 )。

5. 函式的返回值一般是放在暫存器中的。

MongoDB安裝教程及相關注意點

安裝mongodb bin目錄下建立下圖中三個檔案和資料夾 logs目錄下建立mongo.log 資料庫路徑 dbpath d mongodb server 3.6 data 日誌輸出檔案路徑 logpath d mongodb server 3.6 logs mongo.log 錯誤日誌採用追加模...

函式過載相關注意事項

1.過載函式呼叫問題中的列舉型別提公升 1 void newf unsigned char 2 void newf int 3 unsigned char uc 129 4 newf virtual calls newf int 5 newf uc calls newf unsigned char ...

SQL中拼湊SQL語句的相關注意點小結

一 基本注意點 sp executesql 的引數必須為unicode,即nchar,nvarchar,ntext型,否則報錯 如果是自己的儲存過程中有引數,也可以不用sp executesql,直接 return 1 godeclare name int exec name demo test s...