再次主要討論或者驗證三點:
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ū)域的作用是什么?
代碼如下:
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

}
由于方法的調(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的初值均為000401046 jmp sum+31h (00401051)
;轉(zhuǎn)到地址00401051(下方藍字)處去判斷循環(huán)條件是否滿足(請從00401051處接著往下看)00401048 mov eax,dword ptr [ebp-8]
;將循環(huán)條件即i的值復制給eax0040104B 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的值傳個寄存器ecx0040105A add ecx,1
;通過寄存器ecx實現(xiàn)循環(huán)加1操作0040105D mov dword ptr [ebp-4],ecx
;將加1后的值復制給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é)果復制給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