函式:
int
fun(
inta,
intb)
int
main()
f11
跟蹤到fun,alt+8
看反彙編**:
00401078push1100h
//引數壓棧,這裡遵循
__cdecl
呼叫規範,引數由右向左
0040107d
push8899h
//壓棧
00401082call@ilt+0(_fun) (00401005)
00401087
addesp,8
//被呼叫函式的堆疊由主調函式來清空
由上圖的
eip可以看到
0040b500
就是下條要執行的指令,在
memory
視窗中可以看到記憶體資料
99880000
和11000000,
實質上是
0x8899,0x1100,(intel
處理器一般都是小端儲存
),還可以看到有記憶體資料
87104000
,實質上是
00401087
,在主調函式中,可以很清楚的看到
00401087
被調函式返回以後執行的第一條指令,也就是堆疊清空指令(遵循
__cdecl
呼叫規範)。
call
指令隱含做了乙個操作:就是把函式返回後執行的第一條指令壓入堆疊。
1:int fun(int a, int b)
0040b
54a
popedi
0040b54bpopesi
0040b
54c
popebx //
彈棧0040b54dmovesp,ebp
0040b
54f
popebp//
恢復ebp
暫存器0040b550ret//
預設操作,恢復
eip:將堆疊中的
00401087
pop給
eip
執行完:
0040b50bpushedi
如下圖:
esp
:0012fe58
與剛進入函式的時候的
esp:
0012ff28
之間的堆疊圖如下:
執行完:
0040b
51c
rep stosdword ptr [edi]
後edi
為:0012ff24
,如下圖:
反彙編 函式巢狀呼叫
實現的功能 兩層函式呼叫,外層函式的傳入的兩個引數再傳到子函式中相加,實現四個數相加返回 004010e8 6a 03 push 3 壓入3 004010ea 6a 02 push 2 壓入2 004010ec 6a 01 push 1 壓入1 004010ee e8 12ffffff call s...
C 函式呼叫過程深入分析
0.引言 首先對三個常用的暫存器做一下說明,eip是指令指標,即指向下一條即將執行的指令的位址 ebp為基址指標,常用來指向棧底 esp為棧指標,常用來指向棧頂。看下面這個簡單的程式並在vc 6.0中檢視並分析彙編 圖11.函式呼叫 g func函式呼叫的彙編 如圖2 圖2首先是三條push指令,分...
C 函式呼叫過程深入分析
0.引言 首先對三個常用的暫存器做一下說明,eip是指令指標,即指向下一條即將執行的指令的位址 ebp為基址指標,常用來指向棧底 esp為棧指標,常用來指向棧頂。看下面這個簡單的程式並在vc 6.0中檢視並分析彙編 圖11.函式呼叫 g func函式呼叫的彙編 如圖2 圖2首先是三條push指令,分...