再次主要討論或者驗證三點:
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追蹤過,單步調試時,這一部分區域并沒有用到,這一區域的作用是什么?
代碼如下:
1
int sum()
2

{
3
int subResult=0;
4
for (int i=0;i<3;i++)
5
{
6
subResult+=1;
7
}
8
return subResult;
9
}
10
11
void main()
12

{
13
int result = sum();
14
printf("%\d\n",result);
15
}
由于方法的調用已經在上一篇中說過,這里直接分析內部有循環結構的sum()方法
int sum()2


{3
int subResult=0;4
for (int i=0;i<3;i++)5

{6
subResult+=1;7
}8
return subResult;9
}10

11
void main()12


{13
int result = sum();14
printf("%\d\n",result);15
}反匯編代碼及分析:
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

