一维数组
#include "stdafx.h"
void test1()
{
int s[5]={0};
int i=0;
while (i<5)
{
s[i]=i;
i++;
}
int a=s[3];
}
int _tmain(_In_ int _Argc,char* _In_reads_)
{
test1();
return 0;
}
反汇编里查看test函数
8: int s[5]={0};
004113F8 C7 45 E4 00 00 00 00 mov dword ptr [ebp-1Ch],0
004113FF 33 C0 xor eax,eax
00411401 89 45 E8 mov dword ptr [ebp-18h],eax
00411404 89 45 EC mov dword ptr [ebp-14h],eax
00411407 89 45 F0 mov dword ptr [ebp-10h],eax
0041140A 89 45 F4 mov dword ptr [ebp-0Ch],eax//这几句表明 int s[5]={0}; 这样写编译器会给这个数组初始化为0
9: int i=0;
0041140D C7 45 D8 00 00 00 00 mov dword ptr [ebp-28h],0
10: while (i<5)
00411414 83 7D D8 05 cmp dword ptr [ebp-28h],5
00411418 7D 15 jge 0041142F
11: {
12: s[i]=i;
0041141A 8B 45 D8 mov eax,dword ptr [ebp-28h]
0041141D 8B 4D D8 mov ecx,dword ptr [ebp-28h]
00411420 89 4C 85 E4 mov dword ptr [ebp+eax*4-1Ch],ecx //ebp-1ch为数组最开始的位置。
13: i++;
00411424 8B 45 D8 mov eax,dword ptr [ebp-28h]
00411427 83 C0 01 add eax,1
0041142A 89 45 D8 mov dword ptr [ebp-28h],eax
14: }
0041142D EB E5 jmp 00411414
15: int a=s[3];
0041142F B8 04 00 00 00 mov eax,4
00411434 6B C0 03 imul eax,eax,3
00411437 8B 4C 05 E4 mov ecx,dword ptr [ebp+eax-1Ch]
0041143B 89 4D CC mov dword ptr [ebp-34h],ecx
16: }
0041143E 52 push edx
0041143F 8B CD mov ecx,ebp
00411441 50 push eax
00411442 8D 15 60 14 41 00 lea edx,ds:[00411460h]
00411448 E8 44 FC FF FF call 00411091
0041144D 58 pop eax
0041144E 5A pop edx
0041144F 5F pop edi
00411450 5E pop esi
00411451 5B pop ebx
00411452 8B 4D FC mov ecx,dword ptr [ebp-4]
00411455 33 CD xor ecx,ebp
00411457 E8 C2 FB FF FF call 0041101E
16: }
0041145C 8B E5 mov esp,ebp
0041145E 5D pop ebp
0041145F C3 ret
二维数组
#include "stdafx.h"
void test1()
{
int s[2][3]={1,2,3,4,5,6};
int a=s[1][2];
}
int _tmain(_In_ int _Argc,char* _In_reads_)
{
test1();
return 0;
}
查看反汇编
8: int s[2][3]={1,2,3,4,5,6};
004113EE C7 45 E4 01 00 00 00 mov dword ptr [ebp-1Ch],1 //在这里给数组赋值
004113F5 C7 45 E8 02 00 00 00 mov dword ptr [ebp-18h],2
004113FC C7 45 EC 03 00 00 00 mov dword ptr [ebp-14h],3
00411403 C7 45 F0 04 00 00 00 mov dword ptr [ebp-10h],4
0041140A C7 45 F4 05 00 00 00 mov dword ptr [ebp-0Ch],5
00411411 C7 45 F8 06 00 00 00 mov dword ptr [ebp-8],6
9: int a=s[1][2];
00411418 B8 0C 00 00 00 mov eax,0Ch
0041141D C1 E0 00 shl eax,0 //eax=12 寻找在哪一行
00411420 8D 4C 05 E4 lea ecx,[ebp+eax-1Ch]
00411424 BA 04 00 00 00 mov edx,4
00411429 D1 E2 shl edx,1 //找到所在行的哪一个位置 两次定位
0041142B 8B 04 11 mov eax,dword ptr [ecx+edx]
0041142E 89 45 D8 mov dword ptr [ebp-28h],eax
10: }