第十四讲 多维数组学习
多维数组的汇编跟一维的类似,不过要细心看才能找出规律。还是看代码
int a[3][3];
a[0][0]=0;
a[0][1]=0;
a[0][1]=0;
a[1][0]=1;
a[1][1]=1;
a[1][2]=1;
a[2][0]=2;
a[2][1]=2;
a[2][2]=2;
画图出来是如下:
int a[3][3]
0 1 2 x
0 0 1 2
1 0 1 2
2 0 1 2
y
由以上图形我们清晰的看出这个int a[3][3] 二维数组,有9个值
看其汇编代码:
0040D700 push ebp
0040D701 mov ebp,esp
0040D703 sub esp,64h
0040D706 push ebx
0040D707 push esi
0040D708 push edi
0040D709 lea edi,[ebp-64h]
0040D70C mov ecx,19h
0040D711 mov eax,0CCCCCCCCh
0040D716 rep stos dword ptr [edi]
8:
9: int a[3][3];
10:
11: a[0][0]=0;
0040D718 mov dword ptr [ebp-24h],0
12: a[0][1]=0;
0040D71F mov dword ptr [ebp-20h],0
13: a[0][2]=0;
0040D726 mov dword ptr [ebp-1Ch],0
14:
15: a[1][0]=1;
0040D72D mov dword ptr [ebp-18h],1
16: a[1][1]=1;
0040D734 mov dword ptr [ebp-14h],1
17: a[1][2]=1;
0040D73B mov dword ptr [ebp-10h],1
18:
19: a[2][0]=2;
0040D742 mov dword ptr [ebp-0Ch],2
20: a[2][1]=2;
0040D749 mov dword ptr [ebp-8],2
21: a[2][2]=2;
0040D750 mov dword ptr [ebp-4],2
由[ebp-64h]可以知道 int a[3][3] 的二维数组占64h-40h=24h,24h===》十进制为36
由于每行占4个字节,那么就有9个EBP,一个EBP是4个字节,那么刚好跟我们前面画的9个数值的个数相同
int a[x][y]的占用字节为
(x*y*4)转化十六进制
因此可以推算出按照 int a[x][y]中的 x,y可以计算int a[x][y] 占( X*y )*4 字节
又一个问题来了,如何算出 a[1][2]=1; 的偏移地址呢?
大家看一下 Y决定在X的次数,比如Y=3时,X=0时,就有:
a[0][0]=0;
a[0][1]=0;
a[0][1]=0;
a[0][1]=0;
a[0][1]=0;
三条数据,每一条就是4个字节
因此就 计算出三维数组a[X][Y]的一个数组a[0][1]的偏移地址就可以这样子写
0*y*4+1*4=4===>十六进制4h
a[2][3]
2*y*4+3*4=8y+12
三维数组
int c[2][3][10]; // 占空间为 2*3*10*4=240 ==》F0h
c[1][0][2]=1;//此处的偏移地址是:f0-(1*3*10*4+0*10*4+2*4)=f0-14=70h
int c[x][y][Z];
c[1][0][2]=1;
====> 1*y*z*4+0*Z*4+2*4