当前位置: 代码迷 >> C语言 >> 大家帮我看一段c编译过后的汇编代码 帮我解释一下
  详细解决方案

大家帮我看一段c编译过后的汇编代码 帮我解释一下

热度:205   发布时间:2008-04-29 15:53:01.0
大家帮我看一段c编译过后的汇编代码 帮我解释一下
4:        char *p="abcd";
00401028   mov         dword ptr [ebp-4],offset string "abcd" (0042201c)
5:        char q[10]="abcd";
0040102F   mov         eax,[string "abcd" (0042201c)]
00401034   mov         dword ptr [ebp-10h],eax
00401037   mov         cl,byte ptr [string "abcd"+4 (00422020)]
0040103D   mov         byte ptr [ebp-0Ch],cl
00401040   xor         edx,edx
00401042   mov         dword ptr [ebp-0Bh],edx
00401045   mov         byte ptr [ebp-7],dl
先感谢了 我对汇编了解一点
搜索更多相关的解决方案: 编译  汇编  代码  解释  

----------------解决方案--------------------------------------------------------
什么IDE?
----------------解决方案--------------------------------------------------------
4:        char *p="abcd";
00401028   mov         dword ptr [ebp-4],offset string "abcd" (0042201c)

这个就不用说了吧?p变量的位置是ebp-4,可以看出是第一个局部变量……我们算算,q是第二个局部变量,q占十个字节的大小,那么q就应该是ebp-14~ebp-5,但是考虑到字节对齐,编译器选择了ebp-16(即下文的ebp-10h)~ebp-7讨论到了这里。接着看。
5:        char q[10]="abcd";
0040102F   mov         eax,[string "abcd" (0042201c)]
00401034   mov         dword ptr [ebp-10h],eax
啊,很明显,编译器做了优化,将那个字符串当作一个Dword,直接通过eax以间接寻址的方式送到了ebp-10h(是不是很阴?我也这么觉得!)
00401037   mov         cl,byte ptr [string "abcd"+4 (00422020)]
0040103D   mov         byte ptr [ebp-0Ch],cl
然后呢,在abcd的后面,填上一个字节的0,也就是字符串结束的'\0'
00401040   xor         edx,edx
00401042   mov         dword ptr [ebp-0Bh],edx
然后呢,再填充字符串(已经5个字节了)后面的四个0
00401045   mov         byte ptr [ebp-7],dl
是10长度的数组嘛,填充了5+4=9个字节,再接再厉,最后一个字节Orz……

分析完毕。其实没什么价值的说……

[[it] 本帖最后由 StarWing83 于 2008-4-29 17:02 编辑 [/it]]
----------------解决方案--------------------------------------------------------