午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

函數(shù)調(diào)用堆棧變化情況

 Fredanf 2013-04-27

函數(shù)調(diào)用堆棧變化情況

分類: C++語言 319人閱讀 評(píng)論(0) 收藏 舉報(bào)

  1. int goo(int a, int b)  
  2. {  
  3.     return a + b;  
  4. }  
  5.   
  6. void foo()  
  7. {  
  8.     int a[] = {1, 2, 3};  
  9.     int result = goo(a[1], a[2]);  
  10.     printf("result: %d", result);  
  11. }  

VS2010下編譯


foo函數(shù)部分匯編:

  1. 00EB3890  push        ebp    
  2. 00EB3891  mov         ebp,esp    
  3. 00EB3893  sub         esp,0E4h    
  4. 00EB3899  push        ebx    
  5. 00EB389A  push        esi    
  6. 00EB389B  push        edi    
  7. 00EB389C  lea         edi,[ebp-0E4h]    
  8. 00EB38A2  mov         ecx,39h    
  9. 00EB38A7  mov         eax,0CCCCCCCCh    
  10. 00EB38AC  rep stos    dword ptr es:[edi]    
  11. 00EB38AE  mov         eax,dword ptr [___security_cookie (0EB7000h)]    
  12. 00EB38B3  xor         eax,ebp    
  13. 00EB38B5  mov         dword ptr [ebp-4],eax    
  14.     int a[] = {1, 2, 3};  
  15. 00EB38B8  mov         dword ptr [ebp-14h],1    
  16. 00EB38BF  mov         dword ptr [ebp-10h],2    
  17. 00EB38C6  mov         dword ptr [ebp-0Ch],3    
  18.     int result = goo(a[1], a[2]);  
  19. 00EB38CD  mov         eax,dword ptr [ebp-0Ch]    
  20. 00EB38D0  push        eax    
  21. 00EB38D1  mov         ecx,dword ptr [ebp-10h]    
  22. 00EB38D4  push        ecx    
  23. 00EB38D5  call        goo (0EB11E5h)    
  24. 00EB38DA  add         esp,8    

goo函數(shù)完整匯編:

  1. 00EB1580  push        ebp    
  2. 00EB1581  mov         ebp,esp    
  3. 00EB1583  sub         esp,0C0h    
  4. 00EB1589  push        ebx    
  5. 00EB158A  push        esi    
  6. 00EB158B  push        edi    
  7. 00EB158C  lea         edi,[ebp-0C0h]    
  8. 00EB1592  mov         ecx,30h    
  9. 00EB1597  mov         eax,0CCCCCCCCh    
  10. 00EB159C  rep stos    dword ptr es:[edi]    
  11.     return a + b;  
  12. 00EB159E  mov         eax,dword ptr [a]    
  13. 00EB15A1  add         eax,dword ptr [b]    
  14. }  
  15. 00EB15A4  pop         edi    
  16. 00EB15A5  pop         esi    
  17. 00EB15A6  pop         ebx    
  18. 00EB15A7  mov         esp,ebp    
  19. 00EB15A9  pop         ebp    
  20. 00EB15AA  ret    


foo函數(shù)push ebp, mov ebp, esp后

保存原ebp,設(shè)定新的ebp為當(dāng)前esp位置



sub esp, 0E4h

給局部變量分配足夠大的??臻g


保存原先的一些寄存器值,每次push,esp繼續(xù)向下移



為局部變量a數(shù)組賦值


調(diào)用goo前Push兩個(gè)參數(shù),esp繼續(xù)下移


call goo函數(shù)時(shí),cpu自動(dòng)push下一條指令地址,esp繼續(xù)下移

在goo函數(shù)中,同樣保存foo函數(shù)中的ebp值,設(shè)定新的ebp,esp等


在執(zhí)行玩goo函數(shù)最后幾句指令時(shí),edi, esi, ebx恢復(fù),esp同時(shí)也編程goo中ebp的位置,ebp恢復(fù)至foo函數(shù)原來的位置(pop ebp)

下一條指令也裝入IP(ret指令),esp繼續(xù)向上一步



foo函數(shù)中的add esp, 8將esp值繼續(xù)往上(清除函數(shù)參數(shù))

清除函數(shù)參數(shù)的工作也可通過ret X在goo函數(shù)返回時(shí)設(shè)定(這樣的話不必在每次調(diào)用點(diǎn)上加上add esp, X指令縮短了編譯出來的文件大小,但在子函數(shù)中清除將不能做到printf等的可變參數(shù)個(gè)數(shù)功能,因?yàn)樽雍瘮?shù)不知道具體有多少要參數(shù)進(jìn)入了,只有調(diào)用處才知道)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多