| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1737 人关注过本帖
标题:出一小题,考下内存堆栈
只看楼主 加入收藏
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 9楼 Devil_W
那你说是分配了多少的空间呢?

愿用余生致力编程
2010-12-18 16:16
无尽苍穹
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:101
注 册:2007-3-28
收藏
得分:0 
哦 这个与大小端有关系?
我小端 little ending
2010-12-18 16:19
zhouxy6759
Rank: 1
等 级:新手上路
帖 子:19
专家分:7
注 册:2009-11-2
收藏
得分:0 
亲自调试了下,发觉对于这个问题我还是没有真正搞懂啊,还有就是怎么看cpu的大小端啊?
2010-12-18 17:11
zhouxy6759
Rank: 1
等 级:新手上路
帖 子:19
专家分:7
注 册:2009-11-2
收藏
得分:0 
Devil_W 你好!能提供相关资料看看吗?老是debug,以我这水平也看不个所以然来啊,谢谢
2010-12-18 17:22
freedgun
Rank: 5Rank: 5
等 级:职业侠客
帖 子:147
专家分:302
注 册:2010-11-11
收藏
得分:0 
你们都是高手,低手来向你们学习了

有什么样的付出,就有什么样的收获!!
2010-12-18 17:23
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-12-18 18:01
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-12-18 18:02
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-12-18 18:09
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:0 
与编译器有关:
好吧,我承认我看了汇编代码
vc:
_TEXT    SEGMENT
_d$ = -8
_s$ = -12

char d[]="456789";

    mov    eax, DWORD PTR ??_C@_06GMII@456789?$AA@
    mov    DWORD PTR _d$[ebp], eax
    mov    cx, WORD PTR ??_C@_06GMII@456789?$AA@+4
    mov    WORD PTR _d$[ebp+4], cx
    mov    dl, BYTE PTR ??_C@_06GMII@456789?$AA@+6
    mov    BYTE PTR _d$[ebp+6], dl

; 7    :     char s[]="123";

    mov    eax, DWORD PTR ??_C@_03KHCO@123?$AA@    ; `string'
    mov    DWORD PTR _s$[ebp], eax
对栈的初始化,很明显先声明的d在高位,s在低位,就会出现前面结果
tc:
_DATA    segment word public 'DATA'
d@    label    byte
    db    52        ;d[]
    db    53
    db    54
    db    55
    db    56
    db    57
    db    0
    db    49        ;s[]
    db    50
    db    51
    db    0
_DATA    ends
lea    ax,word ptr [bp-12]        
    push    ax
    push    ds
    mov    ax,offset DGROUP:d@
    push    ax
    mov    cx,7
    call    far ptr SCOPY@        ;复制d到低地址
    push    ss
    lea    ax,word ptr [bp-4]
    push    ax
    push    ds
    mov    ax,offset DGROUP:d@+7
    push    ax
    mov    cx,4
    call    far ptr SCOPY@        ;复制s到高地址
于是结果为456789 456789(越界了?)
还有 我菜119 你知道那个填充的cc字节是怎么来的吗?为什么要用它填充?
tc下有点小问题,然我再看看
(tc下好像把返回地址给覆盖了)


[ 本帖最后由 xiaomarn 于 2010-12-18 21:17 编辑 ]
2010-12-18 20:48
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 19楼 xiaomarn
这个问题我并没有深入的理解,那我就说说我的理解吧,不知道对不对,如果不对,请指点!!!

我觉得这个问题要从cpu访问内存数据来讲,cpu通过数据总线来读取内存中的数据,现在的cpu数据总线是32位的,也就是每次都要访问四个字节,同时cpu会访问内存中特殊的地址,也就是0x00 , 0x04 , 0x08 .....这些地址值是4的倍数的地址,对于char数组来说char d[]="456789";按理是应该占据7个字节的内存空间,但是从cpu访问内存的效率来讲,所以填充一个多余的字节cc!!!!

本人只能够解释这么多了!!!

愿用余生致力编程
2010-12-18 21:31
快速回复:出一小题,考下内存堆栈
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023457 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved