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

 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}
由于方法的調(diào)用已經(jīng)在上一篇中說過,這里直接分析內(nèi)部有循環(huán)結(jié)構(gòu)的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)
;轉(zhuǎn)到地址00401051(下方藍字)處去判斷循環(huán)條件是否滿足(請從00401051處接著往下看)
00401048   mov         eax,dword ptr [ebp-8]
;將循環(huán)條件即i的值復(fù)制給eax
0040104B   add         eax,1
;循環(huán)條件修正
0040104E   mov         dword ptr [ebp-8],eax
;保存修正后的循環(huán)條件
00401051   cmp         dword ptr [ebp-8],3
00401055   jge         sum+42h (00401062)
;比較dword ptr [ebp-8]處的值,即局部變量i的值與3的大小,如果小于3,則往下執(zhí)行;如果大于等于3,則跳轉(zhuǎn)到00401062處執(zhí)行
;jge 指令 如果大于或等于則轉(zhuǎn)移
9:        {
10:           subResult+=1;
00401057   mov         ecx,dword ptr [ebp-4]
;將dword ptr [ebp-4]處的值即subResult的值傳個寄存器ecx
0040105A   add         ecx,1
;通過寄存器ecx實現(xiàn)循環(huán)加1操作
0040105D   mov         dword ptr [ebp-4],ecx
;將加1后的值復(fù)制給dword ptr [ebp-4]處
11:       }
00401060   jmp         sum+28h (00401048)
;轉(zhuǎn)移到00401048處,去進行下一輪的循環(huán)變量修正和判斷
12:       return subResult;
00401062   mov         eax,dword ptr [ebp-4]
;將最終的結(jié)果復(fù)制給eax,由此可以驗證,函數(shù)的返回值保存在寄存器eax中
;為了更好的說明這一點,看下邊main函數(shù)中sum函數(shù)的返回值的傳遞情況:

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