• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

悠悠客

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

第十四讲 多维数组学习

    多维数组的汇编跟一维的类似,不过要细心看才能找出规律。还是看代码
    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;
三条数据,每一条就是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



 



来自为知笔记(Wiz)


posted on 2014-04-25 21:08  悠悠客  阅读(165)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3