通常使用記憶體是從低向高位址用,但棧是預留的空間,棧底在高位址,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...