免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C++函數調用原理理解C++函數調用原理理解
C++函數調用原理理解C++函數調用原理理解

            空程序:
int main()
{
00411360 push ebp ;壓入ebp
00411361 mov ebp,esp ;ebp = esp,保留esp,待函數調用完再恢復,因為函數調用中肯定會用到esp.
00411363 sub esp,0C0h ;esp-=0C0h(192);為該函數留出臨時存儲區(qū)
;將其他指針或寄存器中的值入棧,以便在函數中使用這些寄存器。
00411369 push ebx  ;壓入ebx
0041136A push esi  ;壓入esi
0041136B push edi  ;壓入edi
0041136C lea edi,[ebp-0C0h] ;讀入[ebp-0C0h]有效地址,即原esp-0C0h,正好是為該函數留出的臨時存儲區(qū)的最低位
00411372 mov ecx,30h  ;ecx = 30h(48),30h*4 = 0C0h
00411377 mov eax,0CCCCCCCCh ;eax = 0CCCCCCCCh;
0041137C rep stos dword ptr es:[edi] ;重復在es:[edi]存入30個;0CCCCCCCCh? Debug模式下把Stack上的變量初始化為0xcc,檢查未初始化的問題
return 0;
0041137E xor eax,eax  ;將eax清零,作為返回值
}
;各指針出棧
00411380 pop edi  ;彈出edi
00411381 pop esi  ;彈出esi
00411382 pop ebx  ;彈出ebx
00411383 mov esp,ebp  ;esp復原
00411385 pop ebp  ;彈出ebp,也復原
00411386 ret  ;返回


函數調用:
 
int _tmain(int argc, _TCHAR* argv[])
{
同上理解, 保存現(xiàn)場
004113D0 push ebp
004113D1 mov ebp,esp
004113D3 sub esp,0F0h ;一共留了0F0h(240)空間
004113D9 push ebx
004113DA push esi
004113DB push edi
004113DC lea edi,[ebp-0F0h]
004113E2 mov ecx,3Ch ; ecx = 3C(60),3C*4 = 0F0h,
004113E7 mov eax,0CCCCCCCCh
004113EC rep stos dword ptr es:[edi]
同上理解.
 int a = 1, b = 2, c = 3;
定義a,b,c并存儲在為函數留出的臨時存儲空間中.
004113EE mov dword ptr [a],1
004113F5 mov dword ptr [b],2
004113FC mov dword ptr [c],3
 int d = Fun1(a, b, c);
參數反向入棧
00411403 mov eax,dword ptr [c]
00411406 push eax
00411407 mov ecx,dword ptr [b]
0041140A push ecx
0041140B mov edx,dword ptr [a]
0041140E push edx
調用Fun1
0041140F call Fun1 (4111DBh) ;Call調用時將下一行命令的EIP壓入堆棧
恢復因為Fun1參數入棧改變的棧指針,因為Fun1有3個參數,一個整數4個字節(jié),共0Ch(12)個字節(jié)
00411414 add esp,0Ch
00411417 mov dword ptr [d],eax
將返回值保存在d中.
 return 0;
返回值為0,讓eax清零
0041141A xor eax,eax

}

恢復現(xiàn)場
0041141C pop edi
0041141D pop esi
0041141E pop ebx
以下全為運行時ESP檢查:
先恢復因為為main預留空間而改變的棧指針
0041141F add esp,0F0h
00411425 cmp ebp,esp
00411427 call @ILT+320(__RTC_CheckEsp) (411145h)
正常時只需要以下兩句就可以正常恢復esp,再出棧,又可以恢復ebp.
0041142C mov esp,ebp
0041142E pop ebp
0041142F ret ;main返回


int Fun1(int a, int b, int c)
{
同上理解, 保存現(xiàn)場
00411A70 push ebp
00411A71 mov ebp,esp
00411A73 sub esp,0E4h ;留了0E4H(228)空間,
00411A79 push ebx
00411A7A push esi
00411A7B push edi
00411A7C lea edi,[ebp-0E4h]
00411A82 mov ecx,39h ; 39H(57)*4 = 0E4H(228)
00411A87 mov eax,0CCCCCCCCh
00411A8C rep stos dword ptr es:[edi]
 int d = 4, e = 5;
定義變量
00411A8E mov dword ptr [d],4
00411A95 mov dword ptr [e],5

 int f = Fun2(a, b, c, d, e);
再次參數反向入棧
00411A9C mov eax,dword ptr [e]
00411A9F push eax
00411AA0 mov ecx,dword ptr [d]
00411AA3 push ecx
00411AA4 mov edx,dword ptr [c]
00411AA7 push edx
00411AA8 mov eax,dword ptr [b]
00411AAB push eax
00411AAC mov ecx,dword ptr [a]
00411AAF push ecx

調用Fun2
00411AB0 call Fun2 (4111D6h) ;Call調用時將下一行命令的EIP壓入堆棧

00411AB5 add esp,14h ;恢復因為參數入棧改變的棧指針,因為Fun2有5個參數,一個整數4個字節(jié),共14h(20)個字節(jié)
將Fun2函數的返回值(保存在eax中),賦值給f;
00411AB8 mov dword ptr [f],eax

 return f;
將保留在f中的Fun1的返回值保存在eax中返回
00411ABB mov eax,dword ptr [f]
}
恢復現(xiàn)場
00411ABE pop edi
00411ABF pop esi
00411AC0 pop ebx

以下全為運行時ESP檢查:
先恢復因為預留函數存儲控件而改變的棧指針,
00411AC1 add esp,0E4h
再比較ebp,esp,假如程序運行正確,兩個值應該相等.
00411AC7 cmp ebp,esp
00411AC9 call @ILT+320(__RTC_CheckEsp) (411145h)
正常時只需要以下兩句就可以正?;謴蚭sp,再出棧,又可以恢復ebp.
00411ACE mov esp,ebp
00411AD0 pop ebp
返回main從pop堆棧中的EIP開始執(zhí)行
00411AD1 ret

int Fun2(int a, int b, int c, int d, int e)
{
同上理解, 保存現(xiàn)場
00412050 push ebp
00412051 mov ebp,esp
00412053 sub esp,0E4h ;保留0E4H(228)
00412059 push ebx
0041205A push esi
0041205B push edi
0041205C lea edi,[ebp-0E4h]
00412062 mov ecx,39h ; 39H(57)*4 = 0E4H(228)
00412067 mov eax,0CCCCCCCCh
0041206C rep stos dword ptr es:[edi]

 int f = 6, g = 7;
定義變量
0041206E mov dword ptr [f],6
00412075 mov dword ptr [g],7

 int h = a + b + c + d + e + f + g;
相加,存入a,再保存在h
0041207C mov eax,dword ptr [a]
0041207F add eax,dword ptr [b]
00412082 add eax,dword ptr [c]
00412085 add eax,dword ptr [d]
00412088 add eax,dword ptr [e]
0041208B add eax,dword ptr [f]
0041208E add eax,dword ptr [g]
00412091 mov dword ptr [h],eax

 return h;
將返回值h的值保存在eax中
00412094 mov eax,dword ptr [h]

}
恢復現(xiàn)場
00412097 pop edi
00412098 pop esi
00412099 pop ebx
0041209A mov esp,ebp
0041209C pop ebp
0041209D ret ;返回fun1 ,從pop堆棧中的EIP開始執(zhí)行
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一個簡單的C++程序反匯編解析
【代碼真相】函數調用 堆棧 轉載 - liangxiufei - 博客園
DLL中調用約定和名稱修飾(一)
函數調用方式介紹
360安全衛(wèi)士hookport.sys簡單逆向——KiFastCallEntry掛鉤
函數是如何被調用的?
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服