有关数组的反汇编的一些总结

源码


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  

}

猜你喜欢

转载自blog.csdn.net/richard1230/article/details/80217133