从编译器的角度去观察数组

刚学复习完c语言数组。。现在来总结一下编译器是怎么处理数组的。
我用的是vs2013,其他编译器处理数组的方法可能不一样

//c语言代码
int main()
{
        //数组名:arr   元素个数:5
    int arr[5] = { 1, 2, 3, 4, 5 };
    arr[3] = 9; //修改第四个元素的值
    return 0;
}
//汇编代码

//开辟栈空间
001F3050  push        ebp  
001F3051  mov         ebp,esp  
001F3053  sub         esp,0DCh  
//保存需要用到的寄存器
001F3059  push        ebx  
001F305A  push        esi  
001F305B  push        edi  
//填充堆栈缓冲区
001F305C  lea         edi,[ebp+FFFFFF24h]  
001F3062  mov         ecx,37h  
001F3067  mov         eax,0CCCCCCCCh  
001F306C  rep stos    dword ptr es:[edi]  
//分别把每个元素赋值到对应的内存地址
001F306E  mov         dword ptr [ebp-18h],1  
001F3075  mov         dword ptr [ebp-14h],2  
001F307C  mov         dword ptr [ebp-10h],3  
001F3083  mov         dword ptr [ebp-0Ch],4  
001F308A  mov         dword ptr [ebp-8],5  
//这里是修改第四个元素的值
013F2331  mov         eax,4  //这个4是int数据类型的大小
013F2336  imul        ecx,eax,3  //这个3是数组下标  
//ecx存的是4字节*第3个数组下标得到的结果是十六进制的C

013F2339  mov         dword ptr [ebp+ecx-18h],0  //把0赋值给arr[3]
//这里为什么是[ebp+ecx-18h]呢,看上面[ebp-18h]存的第一个元素的值吧
//因为18h-0xC=C,所以也就是第四个元素的内存地址[ebp-0Ch]

//还原寄存器 
001F30A4  pop         edi  
001F30A5  pop         esi  
001F30A6  pop         ebx  
001F30A7  mov         esp,ebp  //还原栈顶
001F30A9  pop         ebp  
001F30AA  ret  //函数返回

上面是一维数组的c语言代码和汇编代码
编译器只是将数组的每个元素放到对应的内存空间中
应该很简单吧........

现在在来看看二维数组编译器是如何处理的

int main()
{
    int arr[3][5] = { 
        { 1, 2, 3, 4, 5 },
        { 6, 7, 8, 9, 10 },
        { 11, 12,13, 14, 15 }
    };
    arr[2][3] = 21;
    return 0;
}
//汇编代码

//上面解释过的 我就不再次说了
00C222F0  push        ebp  
00C222F1  mov         ebp,esp  
00C222F3  sub         esp,104h  
00C222F9  push        ebx  
00C222FA  push        esi  
00C222FB  push        edi  
00C222FC  lea         edi,[ebp+FFFFFEFCh]  
00C22302  mov         ecx,41h  
00C22307  mov         eax,0CCCCCCCCh  
00C2230C  rep stos    dword ptr es:[edi] 
//分别把每个元素赋值到对应的内存地址
00C2230E  mov         dword ptr [ebp-40h],1  
00C22315  mov         dword ptr [ebp-3Ch],2  
00C2231C  mov         dword ptr [ebp-38h],3  
00C22323  mov         dword ptr [ebp-34h],4  
00C2232A  mov         dword ptr [ebp-30h],5  
00C22331  mov         dword ptr [ebp-2Ch],6  
00C22338  mov         dword ptr [ebp-28h],7  
00C2233F  mov         dword ptr [ebp-24h],8  
00C22346  mov         dword ptr [ebp-20h],9  
00C2234D  mov         dword ptr [ebp-1Ch],0Ah  
00C22354  mov         dword ptr [ebp-18h],0Bh  
00C2235B  mov         dword ptr [ebp-14h],0Ch  
00C22362  mov         dword ptr [ebp-10h],0Dh  
00C22369  mov         dword ptr [ebp-0Ch],0Eh  
00C22370  mov         dword ptr [ebp-8],0Fh  

//这里的14h是arr[3][5]中的5个元素类型的大小 5*sizeof(int)=14h 注意是十六进制的
02C2377  mov         eax,14h   
//把14h进行左移1位
002C237C  shl         eax,1  
//ecx=[ebp-18h]的内存地址,也就知道了arr数组的行数
002C237E  lea         ecx,[ebp+eax-40h]  

002C2382  mov         edx,4    //4就是4个字节因为int类型的大小为4字节
002C2387  imul        eax,edx,3  //eax存放的是arr数组的列数

//因为ecx相当于行数,虽然它是一个地址 。eax相当于列数
//可以计算一下ecx==[ebp-18h] eax==C
//[ecx+eax]==[ebp-18h+0xC]结果等于 [ebp-0Ch]   别告诉我你不会算-.-!
002C238A  mov         dword ptr [ecx+eax],15h  //然后赋值为21 十进制的...

00C2238A  pop         edi  
00C2238B  pop         esi  
00C2238C  pop         ebx  
00C2238D  mov         esp,ebp  
00C2238F  pop         ebp  
00C22390  ret  

所以呢。。不管在c语言里定义的数组是几维的,编译器会统统看做一维数组来处理的。。
读者若是发现了什么错误,还请多多帮忙指正。。毕竟我也只是个菜鸟。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • TITLE: 编程语言乱炖 码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快! 有时候还是蛮怀念十几、二...
    码园老农阅读 5,280评论 2 35
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,280评论 25 707
  • 在花开的那座城 我遇见了你 不是一见倾心 却为日久生情 在花开的那座城 我遇见了你 你不经意的行为 却勾起我的情思...
    六月安阅读 82评论 0 2
  • 在这个快节奏的时代中,我想有很多人不愿意放慢脚步来欣赏身边的景色了吧,更不要说安下心来去种植或养殖些什么东...
    媛媛和豆豆阅读 406评论 0 2
  • 经常……
    cl小灵子阅读 216评论 0 0