首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

珍藏 char a[5] = "king"这个king会在常量段有备份

2013-03-22 
收藏 char a[5] king这个king会在常量段有备份?之前看到的 一个帖子 没讨论完,就被结贴了,我还有疑问

收藏 char a[5] = "king";这个king会在常量段有备份?
之前看到的 一个帖子 没讨论完,就被结贴了,我还有疑问,现贴出来,希望大神指教

环境:ubuntu 3.2.0-38-generic-pae
工具:gcc


#include <stdio.h>
 
int main(void)
{
    char a[] = "king";
    return 0;
}


反汇编结果:



#include <stdio.h>

int main(void)
{
 8048404:55                   push   %ebp
 8048405:89 e5                mov    %esp,%ebp
 8048407:83 e4 f0             and    $0xfffffff0,%esp
 804840a:83 ec 10             sub    $0x10,%esp
 804840d:65 a1 14 00 00 00    mov    %gs:0x14,%eax
 8048413:89 44 24 0c          mov    %eax,0xc(%esp)
 8048417:31 c0                xor    %eax,%eax
char a[] = "king";
 8048419:c7 44 24 07 6b 69 6e movl   $0x676e696b,0x7(%esp)
 8048420:67 // 将"king"直接压入栈,未访问其他区域
 8048421:c6 44 24 0b 00       movb   $0x0,0xb(%esp)
return 0;
 8048426:b8 00 00 00 00       mov    $0x0,%eax
}
 804842b:8b 54 24 0c          mov    0xc(%esp),%edx
 804842f:65 33 15 14 00 00 00 xor    %gs:0x14,%edx
 8048436:74 05                je     804843d <main+0x39>
 8048438:e8 e3 fe ff ff       call   8048320 <__stack_chk_fail@plt>
 804843d:c9                   leave  
 804843e:c3                   ret    
 804843f:90                   nop




linux下反汇编结果 显示 “king”被直接压入栈,并未有什么备份

希望vc的朋友,贴一下反汇编的结果 汇编 linux gcc c
[解决办法]

(gdb) list
1
2#include <stdio.h>
3
4int main(void)
5{
6    char p[] = "king";
7    return 0;
8
9}
(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000004004c0 <+0>:movl   $0x0,-0x4(%rsp)


   0x00000000004004c8 <+8>:mov    0x4005a0,%eax
   0x00000000004004cf <+15>:mov    %eax,-0x9(%rsp)
   0x00000000004004d3 <+19>:mov    0x4005a4,%cl
   0x00000000004004da <+26>:mov    %cl,-0x5(%rsp)
   0x00000000004004de <+30>:mov    $0x0,%eax
   0x00000000004004e3 <+35>:retq   
End of assembler dump.
(gdb) b 6
Breakpoint 1 at 0x4004c8: file test.c, line 6.
(gdb) start
Temporary breakpoint 2 at 0x4004c0
Starting program: /home/wangxiao/a.out 

Temporary breakpoint 2, 0x00000000004004c0 in main ()
(gdb) x/s 0x4005a0
0x4005a0:"king"
(gdb) 



你就无视gcc这朵奇葩把
[解决办法]
另外LZ可以说说gcc的版本,看内核挺新的,ubuntu的gcc版本应该也不低,有可能优化掉了。

可以如下尝试:
1、关闭优化;
2、加上一句a[0] = 'k';。

热点排行