#include
using namespace std;
void f1(int a,int b)
int main()
將上述**反彙編如下(vs05debug)
:int main()
void f1(int a,int b) //f1函式反彙編**。
004113be pop edi
004113bf pop esi
004113c0 pop ebx ;函式呼叫完畢,回覆
edi等暫存器的值
004113c1 mov esp,ebp
004113c3 pop ebp ;**為
f1函式分配的棧幀。
004113c4 ret ;此指令實際動作是
pop eip
;call f1
時push eip
,那時eip
的值是call
函式下條指令的值,程式跳轉
main
函式執行
。所以通過上述分析,我們得到一下的棧內資料的布局:
由於eip
要存入棧中,所以就有可能被修改,導致程式異常的執行,很多病毒就是利用了這一點。
參考:[1]
[2] 天書夜讀
組合語言 函式呼叫棧
當發生函式呼叫的時候,棧空間中存放的資料是這樣的 1 呼叫者函式把被調函式所需要的引數按照與被調函式的形參順序相反的順序壓入棧中,即 從右向左依次把被調函式所需要的引數壓入棧 2 呼叫者函式使用call指令呼叫被調函式,並把call指令的下一條指令的位址當成返回位址壓入棧中 這個壓棧操作隱含在cal...
C語言彙編 函式呼叫棧
函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...
彙編呼叫c函式設定棧的原因
一.棧的整體作用 1 儲存現場 上下文 2 傳遞引數 彙編 呼叫c函式時,需傳遞引數 3 儲存臨時變數 包括函式的非靜態區域性變數以及編譯器自動生成的其他臨時變數。1.儲存現場 上下文 在函式呼叫之前,應該將這些暫存器等現場,暫時保持起來 入棧push 等呼叫函式執行完畢返回後 出棧pop 再恢復現...