實現的功能:兩層函式呼叫,外層函式的傳入的兩個引數再傳到子函式中相加,實現四個數相加返回
004010e8 |. 6a 03 push 3 ; 壓入3
004010ea |. 6a 02 push 2 ; 壓入2
004010ec |. 6a 01 push 1 ; 壓入1
004010ee |. e8 12ffffff call stackdem.00401005 ; 壓入call位址+指令長度,再呼叫call
004010f3 |. 83c4 0c add esp,0c ; 外平棧
004010f6 |. 33c0 xor eax,eax ; 清空eax
進入00401005 call
00401070 /> \55 push ebp ; 儲存ebp
00401071 |. 8bec mov ebp,esp ; 提公升棧底
00401073 |. 83ec 48 sub esp,48 ; 提公升棧頂
00401076 |. 53 push ebx ; 壓入ebx
00401077 |. 56 push esi ; 壓入esi
00401078 |. 57 push edi ; 壓入edi
00401079 |. 8d7d b8 lea edi,dword ptr ss:[ebp-48] ; 提公升棧頂的低位址賦值給edi
0040107c |. b9 12000000 mov ecx,12 ; ecx 為 0x12
00401081 |. b8 cccccccc mov eax,cccccccc ; eax 為 0xcccccccc
00401086 |. f3:ab rep stos dword ptr es:[edi] ; 將eax的值賦值給 之前提公升的棧頂和棧底之間的值
00401088 |. c745 fc 02000>mov dword ptr ss:[ebp-4],2 ; 給初始化中的第乙個位址賦值為2
0040108f |. 8b45 0c mov eax,dword ptr ss:[ebp+c] ; 將壓入的第乙個引數的值 賦值 給eax
00401092 |. 50 push eax ; 壓入 第乙個引數的值
00401093 |. 8b4d 08 mov ecx,dword ptr ss:[ebp+8] ; 將壓入的第二個引數的值 賦值 給eax
00401096 |. 51 push ecx ; 壓入 第二個引數的值
00401097 |. e8 6effffff call stackdem.0040100a
0040109c |. 83c4 08 add esp,8 ; 恢復入call之前的棧頂
0040109f |. 8945 f8 mov dword ptr ss:[ebp-8],eax ; 把上面的call返回值 賦值給這個call中處理的第二個引數
004010a2 |. 8b45 fc mov eax,dword ptr ss:[ebp-4] ; 把子call中的引數賦值給當前eax
004010a5 |. 0345 f8 add eax,dword ptr ss:[ebp-8] ; 上面兩個值相加
004010a8 |. 0345 10 add eax,dword ptr ss:[ebp+10] ; 上面兩個值相加完之後再加上這個call中壓入的第乙個引數
004010ab |. 5f pop edi
004010ac |. 5e pop esi
004010ad |. 5b pop ebx
004010ae |. 83c4 48 add esp,48 ; 恢復剛入call之前的棧頂
004010b1 |. 3bec cmp ebp,esp ; 比較棧頂和棧底是否相等
004010b3 |. e8 68000000 call stackdem.00401120 ; 檢查堆疊平衡
004010b8 |. 8be5 mov esp,ebp ; 把剛入call的時候堆疊中的棧底賦值給棧頂
004010ba |. 5d pop ebp ; 恢復入call之前的棧底
進入0040100a
00401030 /> \55 push ebp ; 壓入ebp
00401031 |. 8bec mov ebp,esp
00401033 |. 83ec 44 sub esp,44
00401036 |. 53 push ebx
00401037 |. 56 push esi
00401038 |. 57 push edi
00401039 |. 8d7d bc lea edi,dword ptr ss:[ebp-44]
0040103c |. b9 11000000 mov ecx,11
00401041 |. b8 cccccccc mov eax,cccccccc
00401046 |. f3:ab rep stos dword ptr es:[edi] ; 初始化垃圾資料
00401048 |. c745 fc 0a000>mov dword ptr ss:[ebp-4],0a ; 初始化的第乙個資料 賦值為0x0a
0040104f |. 8b45 08 mov eax,dword ptr ss:[ebp+8] ; 把壓入的第二個引數的值 賦值給eax
00401052 |. 0345 0c add eax,dword ptr ss:[ebp+c] ; 把壓入的第乙個引數的值 新增給eax
00401055 |. 0345 fc add eax,dword ptr ss:[ebp-4] ; 把初始化的第乙個資料 加給 eax
反彙編之簡單函式呼叫
簡單的函式呼叫,通過反彙編可以清楚了解 舉例 include int add int a,int b int main void 這是乙個簡單的通過呼叫函式計算兩數之和的程式 vc6.0生成的彙編 如下 ebp 棧低 高位址 esp 棧頂 低位址 add函式 push ebp ebp 1000 es...
反彙編深入分析函式呼叫
函式 int fun inta,intb int main f11 跟蹤到fun,alt 8 看反彙編 00401078push1100h 引數壓棧,這裡遵循 cdecl 呼叫規範,引數由右向左 0040107d push8899h 壓棧 00401082call ilt 0 fun 0040100...
通過VC學習反彙編 函式呼叫 呼叫約定
呼叫約定決定了以下內容 函式引數的壓棧順序 由呼叫者還是被呼叫者平衡堆疊。3.1 cdecl cdecl是c和c 程式的預設呼叫約定 引數通過堆疊來傳遞,從右向左依次入棧,由呼叫者平衡堆疊。同樣的 我們在addint函式前面加上 cdecl呼叫約定 int cdecl addint int a,in...