c語言種有三種迴圈:
do...while
while
for(初始化;條件判斷;步進)
主函式(main)
庫函式自定義函式
函式的發明,使得變成可以以函式為單位進行模組化,叫做面向過程。
軟體工程中,有「高內聚,低耦合」的要求。 函式就是為了實現以上要求發明的產物。 函式是面向過程的「介面",其介面包含了:引數、返回值。 函式與函式之間,就是通過引數、返回值進行互動的。並且,因為低耦合的設計,函式與函式之間,互相不需要直到對方內部的實現。具體而言,函式呼叫過程,會從傳參開始,到獲取函式呼叫的返回值結束。
函式是通過棧棧其實就是一塊記憶體區域,一般而言(純經驗),vs系列,棧的位址為0x0018***x或0x0019***x。 **區域,以0x0040***x, 0x00041***x開頭。
具體的傳參細節要複雜得多,包括:
1. 按照呼叫約定傳參
2. 儲存返回位址
3. 跳轉到被呼叫的函式**移流程)
5. 開闢區域性變數空間
6. 儲存程式環境
7. 開始執行被呼叫函式的**
函式的返回,從最頂部的棧幀開始(較低位址),逐漸往高位址的棧幀轉移。每返回一層函式,它對應的棧幀就「丟棄」。
1. 恢復暫存器環境
2. 放棄棧幀空間(也成為「平衡棧」)
3. 取返回位址並跳轉到該位址
還剩最後乙個問題,返回值到底是如何返回的?答: 在x86中,函式的返回值放在暫存器eax中。
傳參約定到底約定了什麼?
答:傳參的順序、用什麼傳參、誰平衡棧
1、標準約定,__stdcall
1. 從右往左依次傳參
2. 使用棧傳參
3. 被呼叫方平衡棧
2、c約定, __cdecl
1. 從右往左依次傳參
2. 使用棧傳參
3. 呼叫方平衡棧
問:printf的傳參約定是什麼?為什麼?
c約定,因為printf是變參函式,變參函式傳參的個數是變化的,只能呼叫方去平衡棧。
函式呼叫過程
每乙個未執行完的函式都對應著乙個棧幀,系統為單個函式分配的那部分棧空間就叫做棧幀,棧幀儲存了函式的資訊。以下面的 為例,通過彙編 的執行過程介紹棧幀建立和銷毀的過程 include int add int x,int y int main 從main函式建立自己的棧幀開始 其他內容先忽略 初始狀態 ...
函式呼叫過程
引數代入順序 引數入棧的順序是從右向左入棧的。8位元組的引數代入 push入棧的方式將引數傳遞 8位元組的引數代入 先在main函式的棧頂向上移動12位元組,然後將引數的資料拷貝到main函式棧頂開闢的記憶體。int fun1 int a,int b int main 第一步進行函式引數入棧,如圖 ...
函式呼叫過程
主要流程 呼叫前的準備 引數入棧,eip 入棧,ebp 入棧,eip跳轉 函式執行 恢復到呼叫前狀態 返回值 eax,恢復ebp,恢復 eip include intf intmain call f 0b711d6h pushl ebp movl esp,ebp subl 16,esp movl e...