首页
社区
课程
招聘
[旧帖] [讨论]小白-C数组在内存存储情况 0.00雪花
发表于: 2014-3-8 12:34 1306

[旧帖] [讨论]小白-C数组在内存存储情况 0.00雪花

2014-3-8 12:34
1306
刚看了几天的反汇编视频,想好好入门,觉得有点难啊~~~
        昨天做一道C题,看到有同学访问了数组的非法元素,觉得应该学习一下内存是如何存储处理的,于是简单的反汇编了一下,真心还没入门呢,看着就像天书···不过存储是看明白了,也就达到我的目的了。现在贴上OD和VC里边的代码,如果有没有注意这个小知识的,就瞥一眼吧。
        我小白,所以发的帖子也就没有技术含量,但是我不想浮浮躁躁的学习,所以脚踏实地的发一个新手入门路上的帖子,希望管理员别觉得没有技术含量就删了啊。我想用帖子激励着我进步。
        温馨提示:入门的同学就无视吧,和我一样的小白们,如果有什么异议,大家再回复讨论啊。

//****************************************************************

        这是c的源代码,只是测试数组几个非法元素而已,大家可以再考虑,如果有什么新的发现,麻烦共享一下,我们也学习一下,共同进步。

#include <stdio.h>

int main(int argc, char* argv[])
{
	int arr[10] = {0};

	printf("%d %d %d %d %d %d\n", arr[-2], arr[-1], arr[0], arr[5], arr[-10], arr[-20]);
	printf("%d %d %d %d %d %d\n", arr[0], arr[9], arr[10], arr[11], arr[20], arr[100]);

	return 0;
}


//****************************************************************

        VC++6.0里面Disassembly代码:
       
1:    #include <stdio.h>
2:
3:    int main(int argc, char* argv[])
4:    {
0040D720   push        ebp
0040D721   mov         ebp,esp
0040D723   sub         esp,68h
0040D726   push        ebx
0040D727   push        esi
0040D728   push        edi
0040D729   lea         edi,[ebp-68h]
0040D72C   mov         ecx,1Ah
0040D731   mov         eax,0CCCCCCCCh
0040D736   rep stos    dword ptr [edi]
5:        int arr[10] = {0};
0040D738   mov         dword ptr [ebp-28h],0
0040D73F   mov         ecx,9
0040D744   xor         eax,eax
0040D746   lea         edi,[ebp-24h]
0040D749   rep stos    dword ptr [edi]
6:
7:        printf("%d %d %d %d %d %d\n", arr[-2], arr[-1], arr[0], arr[5], arr[-10], arr[-20]);
0040D74B   lea         eax,[ebp-28h]
0040D74E   mov         ecx,dword ptr [eax-50h]
0040D751   push        ecx
0040D752   lea         edx,[ebp-28h]
0040D755   mov         eax,dword ptr [edx-28h]
0040D758   push        eax
0040D759   mov         ecx,dword ptr [ebp-14h]
0040D75C   push        ecx
0040D75D   mov         edx,dword ptr [ebp-28h]
0040D760   push        edx
0040D761   lea         eax,[ebp-28h]
0040D764   mov         ecx,dword ptr [eax-4]
0040D767   push        ecx
0040D768   lea         edx,[ebp-28h]
0040D76B   mov         eax,dword ptr [edx-8]
0040D76E   push        eax
0040D76F   push        offset string "%d %d %d %d %d %d\n" (00422fac)
0040D774   call        printf (00401090)
0040D779   add         esp,1Ch
8:        printf("%d %d %d %d %d %d\n", arr[0], arr[9], arr[10], arr[11], arr[20], arr[100]);
0040D77C   mov         ecx,dword ptr [ebp+168h]
0040D782   push        ecx
0040D783   mov         edx,dword ptr [ebp+28h]
0040D786   push        edx
0040D787   mov         eax,dword ptr [ebp+4]
0040D78A   push        eax
0040D78B   mov         ecx,dword ptr [ebp]
0040D78E   push        ecx
0040D78F   mov         edx,dword ptr [ebp-4]
0040D792   push        edx
0040D793   mov         eax,dword ptr [ebp-28h]
0040D796   push        eax
0040D797   push        offset string "%d %d %d %d %d %d\n" (00422fac)
0040D79C   call        printf (00401090)
0040D7A1   add         esp,1Ch
9:
10:       return 0;
0040D7A4   xor         eax,eax
11:   }


//****************************************************************

        OD里面的代码:

[SIZE="1"][SIZE="1"]0040D720  /> \55            push ebp                                 ;  保存寄存器
0040D721  |.  8BEC          mov ebp,esp                              ;  ebp = esp 后边使用ebp来做指针
0040D723  |.  83EC 68       sub esp,68                               ;  申请空间
0040D726  |.  53            push ebx                                 ;  保护可能用到的寄存器值
0040D727  |.  56            push esi
0040D728  |.  57            push edi
0040D729  |.  8D7D 98       lea edi,[local.26]                       ;  初始化,int 3填充防止变量空间执行
0040D72C  |.  B9 1A000000   mov ecx,1A
0040D731  |.  B8 CCCCCCCC   mov eax,CCCCCCCC
0040D736  |.  F3:AB         rep stos dword ptr es:[edi]
0040D738  |.  C745 D8 00000>mov [local.10],0                         ;  数组初始化 -->arr[10]={0};
0040D73F  |.  B9 09000000   mov ecx,9
0040D744  |.  33C0          xor eax,eax
0040D746  |.  8D7D DC       lea edi,[local.9]
0040D749  |.  F3:AB         rep stos dword ptr es:[edi]
0040D74B  |.  8D45 D8       lea eax,[local.10]
0040D74E  |.  8B48 B0       mov ecx,dword ptr ds:[eax-50]            ;  50H=20个内存单元(因为是dword)--> arr[-20]
0040D751  |.  51            push ecx                                 ; /Arg7
0040D752  |.  8D55 D8       lea edx,[local.10]                       ; |
0040D755  |.  8B42 D8       mov eax,dword ptr ds:[edx-28]            ; |同上;arr[-10]
0040D758  |.  50            push eax                                 ; |Arg6
0040D759  |.  8B4D EC       mov ecx,[local.5]                        ; |arr[5];下边都是访问数组元素对应内存单元,								     	     ;  取数值入栈
0040D75C  |.  51            push ecx                                 ; |Arg5
0040D75D  |.  8B55 D8       mov edx,[local.10]                       ; |arr[0]
0040D760  |.  52            push edx                                 ; |Arg4
0040D761  |.  8D45 D8       lea eax,[local.10]                       ; |
0040D764  |.  8B48 FC       mov ecx,dword ptr ds:[eax-4]             ; |arr[-1]
0040D767  |.  51            push ecx                                 ; |Arg3
0040D768  |.  8D55 D8       lea edx,[local.10]                       ; |
0040D76B  |.  8B42 F8       mov eax,dword ptr ds:[edx-8]             ; |arr[-2]
0040D76E  |.  50            push eax                                 ; |Arg2
0040D76F  |.  68 AC2F4200   push 关于数组.00422FAC                   ; |Arg1 = 00422FAC ASCII "%d %d %d %d %d %d
"
0040D774  |.  E8 1739FFFF   c[FONT="宋体"][SIZE="1"][SIZE="1"][/SIZE][/SIZE][/FONT]all 关于数组.00401090                   ; \关于数组.00401090
0040D779  |.  83C4 1C       add esp,1C                               ;  恢复堆栈平衡
0040D77C  |.  8B8D 68010000 mov ecx,dword ptr ss:[ebp+168]           ;  rr[100]
0040D782  |.  51            push ecx                                 ; /Arg7
0040D783  |.  8B55 28       mov edx,[arg.9]                          ; arr[20]
0040D786  |.  52            push edx                                 ; |Arg6
0040D787  |.  8B45 04       mov eax,dword ptr ss:[ebp+4]             ; |arr[11]
0040D78A  |.  50            push eax                                 ; |Arg5
0040D78B  |.  8B4D 00       mov ecx,dword ptr ss:[ebp]               ; |arr[10]
0040D78E  |.  51            push ecx                                 ; |Arg4
0040D78F  |.  8B55 FC       mov edx,[local.1]                        ; |arr[9]
0040D792  |.  52            push edx                                 ; |Arg3
0040D793  |.  8B45 D8       mov eax,[local.10]                       ; |arr[0]
0040D796  |.  50            push eax                                 ; |Arg2
0040D797  |.  68 AC2F4200   push 关于数组.00422FAC                   ; |Arg1 = 00422FAC ASCII "%d %d %d %d %d %d
"
0040D79C  |.  E8 EF38FFFF   call 关于数组.00401090                   ; \关于数组.00401090
0040D7A1  |.  83C4 1C       add esp,1C                               ;  恢复堆栈平衡
0040D7A4  |.  33C0          xor eax,eax                              ;  各种恢复和还原
0040D7A6  |.  5F            pop edi
0040D7A7  |.  5E            pop esi
0040D7A8  |.  5B            pop ebx
0040D7A9  |.  83C4 68       add esp,68
0040D7AC  |.  3BEC          cmp ebp,esp
0040D7AE  |.  E8 5D39FFFF   call 关于数组.00401110
0040D7B3  |.  8BE5          mov esp,ebp
0040D7B5  |.  5D            pop ebp
0040D7B6  \.  C3            retn                                     ;  返回[/SIZE][/SIZE]


//****************************************************************

        可能上边的代码太抽象。我也是刚看视频,但是有可能有人比我还基础,所以我弄个图,一目了然,内存数据的存放。小白们,天才确实有,但是那些人我们直接望尘莫及,与其感叹人生不如现在脚踏实地。别管别人怎么说,咱们学的问心无愧就好。大家共同努力,等到有一天,像看雪论坛那些神一样的高手站在你面前,对你说“高手,我们做朋友吧!”的时候,我才觉得我们是真的入门了!^_^

说实话,我是这样理解的,但是有些地方希望高手能给我指正,好让我们这些小白能正确的学习,谢谢了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 6
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不好意思,上边图片画错了。见谅啊。
上传的附件:
2014-3-8 17:01
0
雪    币: 80
活跃值: (109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我就是比你更小白的那一批的一个
2014-3-8 17:43
0
游客
登录 | 注册 方可回帖
返回
//