內存地址與棧

vs2005中,斷點斷在要反彙編的程序中,alt + 8 顯示反彙編窗口

代碼如下:

  1. // TestMem.cpp : 定義控制檯應用程序的入口點。  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5. #include <memory.h> 
  6.  
  7. void f(int param1, int param2, int param3)  
  8. {  
  9. 004113A0  push        ebp    
  10. 004113A1  mov         ebp,esp   
  11. 004113A3  sub         esp,0E4h   
  12. 004113A9  push        ebx    
  13. 004113AA  push        esi    
  14. 004113AB  push        edi    
  15. 004113AC  lea         edi,[ebp-0E4h]   
  16. 004113B2  mov         ecx,39h   
  17. 004113B7  mov         eax,0CCCCCCCCh   
  18. 004113BC  rep stos    dword ptr es:[edi]   
  19.     int local1 = 1;  
  20. 004113BE  mov         dword ptr [local1],1   
  21.     int local2 = 2;  
  22. 004113C5  mov         dword ptr [local2],2   
  23.     int local3 = 3;  
  24. 004113CC  mov         dword ptr [local3],3   
  25.     memset(&local3, 0, 24);  
  26. 004113D3  push        18h    
  27. 004113D5  push        0      
  28. 004113D7  lea         eax,[local3]   
  29. 004113DA  push        eax    
  30. 004113DB  call        @ILT+460(_memset) (4111D1h)   
  31. 004113E0  add         esp,0Ch   
  32.     local3 = local1 + local2;  
  33. 004113E3  mov         eax,dword ptr [local1]   
  34. 004113E6  add         eax,dword ptr [local2]   
  35. 004113E9  mov         dword ptr [local3],eax   
  36. }  
  37.  
  38.  
  39. --- e:\myproject\testmem\testmem.cpp -------------------------------------------  
  40.  
  41. //param3->param2->param1->call_next_addr->local1->local2->local3  
  42. int _tmain(int argc, _TCHAR* argv[])  
  43. {  
  44. 00411450  push        ebp    
  45. 00411451  mov         ebp,esp   
  46. 00411453  sub         esp,0C0h   
  47. 00411459  push        ebx    
  48. 0041145A  push        esi    
  49. 0041145B  push        edi    
  50. 0041145C  lea         edi,[ebp-0C0h]   
  51. 00411462  mov         ecx,30h   
  52. 00411467  mov         eax,0CCCCCCCCh   
  53. 0041146C  rep stos    dword ptr es:[edi]   
  54.     f(1, 2, 3);  
  55. 0041146E  push        3      
  56. 00411470  push        2      
  57. 00411472  push        1      
  58. 00411474  call        f (411195h)   
  59. 00411479  add         esp,0Ch   
  60.     return 0;  
  61. 0041147C  xor         eax,eax   
  62. }  
  63.  

局部變量地址:
 


程序觀察的結果:
1,執行memset語句前的

 

2,執行memset語句後的
 
結論堆棧結構:
Param3=>Param2=>param1=>call_next_addr=>local1=>local2=>local3

擴展如果有數組,則設爲int a[4], 則棧爲....=>a[3]=>a[2]=>a[1]=>a[0]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章