淺析C語言中的棧操作
時間:2016-12-13作者:華清遠見
匯編/C語言中的'數據棧'跟數據結構中的'邏輯棧'類似都是遵循先進后出后進先出原則,但是在實際操作過程中的基本單位不同: 1.在數據結構中的'邏輯棧'按照使用者自己的需求定義大小及基本單位。例如可以存放10個char型,也可以存放20個結構體等。 2.在匯編或C語言本身的'數據棧'中棧大小由編譯器指定,遵循FIFO規則的基本單位是棧幀,即每調用一個函數都會有一個新的棧幀加入,而函數返回則以棧幀為單位出棧。 棧幀也叫過程活動記錄,是編譯器用來實現過程/函數調用的一種數據結構。其實就是一個函數執行的環境:函數參數、函數的局部變量、函數執行完后返回到哪里等等。 因此,在同一個棧幀內數據的訪問可以使隨機的,匯編中可以通過ebp 指針向上或向下任意偏移就可以訪問當前函數內部的所有局部變量,或向上偏移就可以訪問調用者對當前函數的傳參。(因為棧的增長空間是從高地址到低地址。) 下面是函數調用過程中的操作: 當發生函數調用的時候,棧空間中存放的數據是這樣的: 1、調用者函數把被調函數所需要的參數按照與被調函數的形參順序相反的順序壓入棧中,即:從右向左依次把被調函數所需要的參數壓入棧; 2、調用者函數使用call指令調用被調函數,并把call指令的下一條指令的地址當成返回地址壓入棧中(這個壓棧操作隱含在call指令中); 3、在被調函數中,被調函數會先保存調用者函數的棧底地址(push ebp),然后再保存調用者函數的棧頂地址,即:當前被調函數的棧底地址(mov ebp,esp); 4、在被調函數中,從ebp的位置處開始存放被調函數中的局部變量和臨時變量,并且這些變量的地址按照定義時的順序依次減小,即:這些變量的地址是按照棧的延伸方向排列的,先定義的變量先入棧,后定義的變量后入棧; 所以,發生函數調用時,入棧的順序為:
發表評論
|