再次主要討論或者驗證三點:
1、循環結構的反匯編代碼分析
2、函數中,局部變量的保存位置
3、方法的返回值保存位置驗證
一個沒有找到答案的疑問
00401029   lea         edi,[ebp-48h]
0040102C   mov         ecx,12h
00401031   mov         eax,0CCCCCCCCh
;這段代碼是在棧中開辟一個48字節大小的區域來存放局部變量,但是如果函數內
沒有局部變量,則是lea         edi,[ebp-40h]
一個局部變量,則是lea         edi,[ebp-44h]
兩個局部變量,則是lea         edi,[ebp-48h]
也就是沒有局部變量時開辟的40個字節,我用F11追蹤過,單步調試時,這一部分區域并沒有用到,這一區域的作用是什么?
代碼如下:

 1int sum()
 2{
 3    int subResult=0;
 4    for (int i=0;i<3;i++)
 5    {
 6        subResult+=1;
 7    }
 8    return subResult;
 9}
10
11void main()
12{
13    int result = sum();
14    printf("%\d\n",result);
15}
由于方法的調用已經在上一篇中說過,這里直接分析內部有循環結構的sum()方法
反匯編代碼及分析:
5:    int sum()
6:    {
00401020   push        ebp
;ESP = 0012FEF0 EBP = 0012FF48
00401021   mov         ebp,esp
;ESP = 0012FEF0 EBP = 0012FEF0
00401023   sub         esp,48h
;ESP = 0012FEA8 EBP = 0012FEF0
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-48h]
0040102C   mov         ecx,12h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
7:        int subResult=0;
00401038   mov         dword ptr [ebp-4],0
8:        for (int i=0;i<3;i++)
0040103F   mov         dword ptr [ebp-8],0
;[ebp-4]=[0012FEEC]處存放的即是局部變量subResult的位置
;[ebp-8]=[0012FEE8]處存放的即是局部變量i的位置
;參看下圖可知


;subResult和i的初值均為0
00401046   jmp         sum+31h (00401051)
;轉到地址00401051(下方藍字)處去判斷循環條件是否滿足(請從00401051處接著往下看)
00401048   mov         eax,dword ptr [ebp-8]
;將循環條件即i的值復制給eax
0040104B   add         eax,1
;循環條件修正
0040104E   mov         dword ptr [ebp-8],eax
;保存修正后的循環條件
00401051   cmp         dword ptr [ebp-8],3
00401055   jge         sum+42h (00401062)
;比較dword ptr [ebp-8]處的值,即局部變量i的值與3的大小,如果小于3,則往下執行;如果大于等于3,則跳轉到00401062處執行
;jge 指令 如果大于或等于則轉移
9:        {
10:           subResult+=1;
00401057   mov         ecx,dword ptr [ebp-4]
;將dword ptr [ebp-4]處的值即subResult的值傳個寄存器ecx
0040105A   add         ecx,1
;通過寄存器ecx實現循環加1操作
0040105D   mov         dword ptr [ebp-4],ecx
;將加1后的值復制給dword ptr [ebp-4]處
11:       }
00401060   jmp         sum+28h (00401048)
;轉移到00401048處,去進行下一輪的循環變量修正和判斷
12:       return subResult;
00401062   mov         eax,dword ptr [ebp-4]
;將最終的結果復制給eax,由此可以驗證,函數的返回值保存在寄存器eax中
;為了更好的說明這一點,看下邊main函數中sum函數的返回值的傳遞情況:

13:   }
00401065   pop         edi
00401066   pop         esi
00401067   pop         ebx
00401068   mov         esp,ebp
0040106A   pop         ebp
0040106B   ret