| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1048 人关注过本帖
标题:C语言探究 第一课 字符串数组篇
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
 问题点数:0 回复次数:18 
C语言探究 第一课 字符串数组篇
先上C语言  再上反汇编
程序代码:
int _tmain(int argc, _TCHAR* argv[])
{
    char str[]="user32";
    //char *str="user32"
    return 0;
}

程序代码:
text:004117C0
.text:004117C0                 push    ebp
.text:004117C1                 mov     ebp, esp
.text:004117C3                 sub     esp, 0D4h
.text:004117C9                 push    ebx
.text:004117CA                 push    esi
.text:004117CB                 push    edi
.text:004117CC                 lea     edi, [ebp+var_D4]
.text:004117D2                 mov     ecx, 35h
.text:004117D7                 mov     eax, 0CCCCCCCCh
.text:004117DC                 rep stosd


.text:004117DE                 mov     eax, __security_cookie ; 0BB40E64Eh
.text:004117E3                 xor     eax, ebp
.text:004117E5                 mov     [ebp+var_4], eax



.text:004117E8                 mov     eax, dword ptr ds:aUser32 ; "user32"   此处可以看到
.text:004117ED                 mov     [ebp+var_10], eax                   "user"
.text:004117F0                 mov     cx, word ptr ds:aUser32+4          
.text:004117F7                 mov     [ebp+var_C], cx                     "32"
.text:004117FB                 mov     dl, byte ptr ds:aUser32+6
.text:00411801                 mov     [ebp+var_A], dl                     0
                                                                            上面代码为  char str[]="user32" 的反汇编,可以看到 user32是被放到了栈中的



.text:00411804                 xor     eax, eax
.text:00411806                 push    edx
.text:00411807                 mov     ecx, ebp
.text:00411809                 push    eax
.text:0041180A                 lea     edx, dword_411828
.text:00411810                 call    j__RTC_CheckStackVars
.text:00411815                 pop     eax
.text:00411816                 pop     edx
.text:00411817                 pop     edi
.text:00411818                 pop     esi
.text:00411819                 pop     ebx
.text:0041181A                 mov     ecx, [ebp+var_4]
.text:0041181D                 xor     ecx, ebp
.text:0041181F                 call    j___security_check_cookie
.text:00411824                 mov     esp, ebp
.text:00411826                 pop     ebp
.text:00411827                 retn
.text:00411827 wmain           endp   


下面是另外一个版本
程序代码:
int _tmain(int argc, _TCHAR* argv[])
{
    //char str[]="user32";
    char *str="user32";
    return 0;
}

程序代码:
push    ebp
mov     ebp, esp
sub     esp, 0CCh
push    ebx
push    esi
push    edi
lea     edi, [ebp+var_CC]
mov     ecx, 33h
mov     eax, 0CCCCCCCCh
rep stosd

mov     [ebp+var_8], offset aUser32 ; "user32"        此处为char *str="user32"


xor     eax, eax
pop     edi
pop     esi
pop     ebx
mov     esp, ebp
pop     ebp
retn
wmain endp




总结   char str[]="user32"     char *str="user32"两个
1.两个操作的数据来源均来自于数据段
2.前者用mov指令将指定字符串 存放到了栈中 进行访问,后者直接将数据的地址存放到栈中用地址间接进行访问
3.采用前者进行操作容易产生栈溢出的错误 ,后者是不会的   所以用后者进行操作是比较安全和妥当的
4.前者数据初始化慢  后者初始化快

[ 本帖最后由 zhu224039 于 2014-6-7 15:35 编辑 ]
搜索更多相关主题的帖子: 字符串 C语言 
2014-06-06 16:59
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
第三点很牵强

总有那身价贱的人给作业贴回复完整的代码
2014-06-06 21:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这种东西不需要用汇编来解释,而且也不是那么说的。第3点确实牵强,各有各的用途和使用场合,不是纯看速度快慢的,那个也不见得有多快。

授人以渔,不授人以鱼。
2014-06-06 21:27
boyving
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-11-28
收藏
得分:0 
看汇编好深奥的说。
2014-06-07 15:25
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
因为是编译器做的 所以 除非是编译器有bug 否则是不会溢出的
2014-06-07 18:49
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
如果我要修改字符串呢

我要成为嘿嘿的黑客,替天行道
2014-06-08 15:11
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
第二种不可修改

DO IT YOURSELF !
2014-06-08 16:29
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 7 楼 wp231957
为什么不能修改呢  

我要成为嘿嘿的黑客,替天行道
2014-06-08 18:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
第二种是一个指向常量数据区的指针,第一种却是用拷贝的办法把字符串字面值复制到数组空间中,前者的数据只读,后者是可刷写的。所以我前面说选择什么是由实际需求决定,不是纯看速度快慢。

授人以渔,不授人以鱼。
2014-06-08 21:05
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
仅是探讨,呵呵

“可以看到 user32是被放到了栈中的”,如何确定的是栈而不是堆呢?
“采用前者进行操作容易产生栈溢出的错误”,上溢还是下溢?
“前者数据初始化慢  后者初始化快”,什么指标?

梦想拥有一台龙芯3A-4000
2014-06-09 00:37
快速回复:C语言探究 第一课 字符串数组篇
数据加载中...
 
   



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

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