源码
void Function()
{
int x = 1;
int y = 2;
int r;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
r = arr[1];
r = arr[x];
r = arr[x+y];
r = arr[x*2+y];
}
int main()
{
Function();
return 0;
}
函数部分(Function()里面)
请仔细看里面的分析!!!
00AE1690 > 55 PUSH EBP
00AE1691 8BEC MOV EBP,ESP
00AE1693 81EC 14010000 SUB ESP,0x114
00AE1699 53 PUSH EBX
00AE169A 56 PUSH ESI
00AE169B 57 PUSH EDI
00AE169C 8DBD ECFEFFFF LEA EDI,DWORD PTR SS:[EBP-0x114]
00AE16A2 B9 45000000 MOV ECX,0x45
00AE16A7 B8 CCCCCCCC MOV EAX,0xCCCCCCCC
00AE16AC F3:AB REP STOS DWORD PTR ES:[EDI]
00AE16AE C745 F8 0100000>MOV DWORD PTR SS:[EBP-0x8],0x1 ; 局部变量[ebp-0x08]=0x1
00AE16B5 C745 EC 0200000>MOV DWORD PTR SS:[EBP-0x14],0x2 ; 局部变量[ebp-0x14]=0x02
00AE16BC C745 B0 0100000>MOV DWORD PTR SS:[EBP-0x50],0x1
00AE16C3 C745 B4 0200000>MOV DWORD PTR SS:[EBP-0x4C],0x2
00AE16CA C745 B8 0300000>MOV DWORD PTR SS:[EBP-0x48],0x3
00AE16D1 C745 BC 0400000>MOV DWORD PTR SS:[EBP-0x44],0x4
00AE16D8 C745 C0 0500000>MOV DWORD PTR SS:[EBP-0x40],0x5
00AE16DF C745 C4 0600000>MOV DWORD PTR SS:[EBP-0x3C],0x6
00AE16E6 C745 C8 0700000>MOV DWORD PTR SS:[EBP-0x38],0x7
00AE16ED C745 CC 0800000>MOV DWORD PTR SS:[EBP-0x34],0x8
00AE16F4 C745 D0 0900000>MOV DWORD PTR SS:[EBP-0x30],0x9
00AE16FB C745 D4 0A00000>MOV DWORD PTR SS:[EBP-0x2C],0xA
00AE1702 B8 04000000 MOV EAX,0x4 ; eax = 4
00AE1707 C1E0 00 SHL EAX,0x0
00AE170A 8B4C05 B0 MOV ECX,DWORD PTR SS:[EBP+EAX-0x50] ; mov ecx, [ebp + eax -0x50];ecx = arr[1];
00AE170E 894D E0 MOV DWORD PTR SS:[EBP-0x20],ECX ; r= arr[1];//[ebp -0x20]= ecx;将ecx中的值赋给了一个局部变量[ebp-0x20](这里应该就是int r)
00AE1711 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-0x8] ; EAX=[ebp-0x8] //这一行和下面2行是一起的
00AE1714 8B4C85 B0 MOV ECX,DWORD PTR SS:[EBP+EAX*4-0x50] ; ecx = [ebp + x*4 -0x50],这里的4为Int类型大小
00AE1718 894D E0 MOV DWORD PTR SS:[EBP-0x20],ECX ; [ebp-0x20]= ecx;以上2行包括这一行的功能:r = arr[x]
00AE171B 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-0x8] ; eax=[ebp-0x08]=x;//此行包括下面3行实现一个功能
00AE171E 0345 EC ADD EAX,DWORD PTR SS:[EBP-0x14] ; eax=[ebp-0x08]+[ebp-0x14] = x + y;
00AE1721 8B4C85 B0 MOV ECX,DWORD PTR SS:[EBP+EAX*4-0x50] ; mov ecx,[ebp+(x+y)*4 - 0x50]
00AE1725 894D E0 MOV DWORD PTR SS:[EBP-0x20],ECX ; r = [ebp-0x20]=ecx;//这几行功能:r = arr[x+y]
00AE1728 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-0x8] ; x = eax = [ebp -0x08];//这一行包括下面4行实现一个功能
00AE172B 8B4D EC MOV ECX,DWORD PTR SS:[EBP-0x14] ; y = ecx = [ebp-0x14];
00AE172E 8D1441 LEA EDX,DWORD PTR DS:[ECX+EAX*2] ; lea edx , [y+x*2] //这一步很妙,仔细体会!实际上吧y+x*2的和传给了edx
00AE1731 8B4495 B0 MOV EAX,DWORD PTR SS:[EBP+EDX*4-0x50] ; mov eax,[ebp + edx*4-0x50]
00AE1735 8945 E0 MOV DWORD PTR SS:[EBP-0x20],EAX ; [ebp-0x20] = eax;这五步相当于r = arr[x*2+y]
00AE1738 52 PUSH EDX
00AE1739 8BCD MOV ECX,EBP
00AE173B 50 PUSH EAX
00AE173C 8D15 5017AE00 LEA EDX,DWORD PTR DS:[0xAE1750]
00AE1742 E8 FDFAFFFF CALL 数组.00AE1244
00AE1747 58 POP EAX
00AE1748 5A POP EDX
00AE1749 5F POP EDI
00AE174A 5E POP ESI
00AE174B 5B POP EBX
00AE174C 8BE5 MOV ESP,EBP
00AE174E 5D POP EBP
00AE174F C3 RETN
VS中源码
void Function()
{
00AE1690 55 push ebp
00AE1691 8B EC mov ebp,esp
00AE1693 81 EC 14 01 00 00 sub esp,114h
00AE1699 53 push ebx
00AE169A 56 push esi
00AE169B 57 push edi
00AE169C 8D BD EC FE FF FF lea edi,[ebp-114h]
00AE16A2 B9 45 00 00 00 mov ecx,45h
00AE16A7 B8 CC CC CC CC mov eax,0CCCCCCCCh
00AE16AC F3 AB rep stos dword ptr es:[edi]
int x = 1;
00AE16AE C7 45 F8 01 00 00 00 mov dword ptr [x],1
int y = 2;
00AE16B5 C7 45 EC 02 00 00 00 mov dword ptr [y],2
int r;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
00AE16BC C7 45 B0 01 00 00 00 mov dword ptr [arr],1
00AE16C3 C7 45 B4 02 00 00 00 mov dword ptr [ebp-4Ch],2
00AE16CA C7 45 B8 03 00 00 00 mov dword ptr [ebp-48h],3
00AE16D1 C7 45 BC 04 00 00 00 mov dword ptr [ebp-44h],4
00AE16D8 C7 45 C0 05 00 00 00 mov dword ptr [ebp-40h],5
00AE16DF C7 45 C4 06 00 00 00 mov dword ptr [ebp-3Ch],6
00AE16E6 C7 45 C8 07 00 00 00 mov dword ptr [ebp-38h],7
00AE16ED C7 45 CC 08 00 00 00 mov dword ptr [ebp-34h],8
00AE16F4 C7 45 D0 09 00 00 00 mov dword ptr [ebp-30h],9
00AE16FB C7 45 D4 0A 00 00 00 mov dword ptr [ebp-2Ch],0Ah
r = arr[1];
00AE1702 B8 04 00 00 00 mov eax,4
00AE1707 C1 E0 00 shl eax,0
00AE170A 8B 4C 05 B0 mov ecx,dword ptr arr[eax]
00AE170E 89 4D E0 mov dword ptr [r],ecx
r = arr[x];
00AE1711 8B 45 F8 mov eax,dword ptr [x]
00AE1714 8B 4C 85 B0 mov ecx,dword ptr arr[eax*4]
00AE1718 89 4D E0 mov dword ptr [r],ecx
r = arr[x+y];
00AE171B 8B 45 F8 mov eax,dword ptr [x]
00AE171E 03 45 EC add eax,dword ptr [y]
00AE1721 8B 4C 85 B0 mov ecx,dword ptr arr[eax*4]
00AE1725 89 4D E0 mov dword ptr [r],ecx
r = arr[x*2+y];
00AE1728 8B 45 F8 mov eax,dword ptr [x]
00AE172B 8B 4D EC mov ecx,dword ptr [y]
00AE172E 8D 14 41 lea edx,[ecx+eax*2]
00AE1731 8B 44 95 B0 mov eax,dword ptr arr[edx*4]
00AE1735 89 45 E0 mov dword ptr [r],eax
}