浅析"烫烫烫烫"是怎么来的

来源:互联网 发布:学古筝的软件 编辑:程序博客网 时间:2024/06/09 22:58


在用VC写代码时,经常会遇到在栈中申请空间的并且没有被初始化的字符数组就会显示"烫烫烫烫。。。",虽然是知道编译器对栈中没有初始化的数据会进行默认的初始化工作,但是一直不得要领,在拜读《程序员的自我修养》的时候有所收获,还挺有意思的,写出来和大家分享。

 

代码很简单,就是在栈中申请了一个大小为4个字节的字符数组。

[cpp] view plaincopyprint?
  1. int main(void)  
  2. {  
  3.     char x[4];  
  4.     return 0;  
  5. }  

用断点查看X的值,可以发现,“烫烫”出现了:

x 0x0012ff60 "烫烫烫烫?" char [4]

 

查看反汇编:

[cpp] view plaincopyprint?
  1.      1: int main(void)  
  2.      2: {  
  3. 004113A0 55               push        ebp    
  4. 004113A1 8B EC            mov         ebp,esp   
  5. 004113A3 81 EC CC 00 00 00 sub         esp,0CCh   
  6. 004113A9 53               push        ebx    
  7. 004113AA 56               push        esi    
  8. 004113AB 57               push        edi    
  9. 004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh]   
  10. 004113B2 B9 33 00 00 00   mov         ecx,33h   
  11. 004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh   
  12. 004113BC F3 AB            rep stos    dword ptr es:[edi]   
  13.      3:     char x[4];  
  14.      4:     return 0;  
  15. 004113BE 33 C0            xor         eax,eax   
  16.      5: }  

 

简单解释一下关键句的含义:

004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh]

将获得的0CCh大小的栈空间首地址赋给edi

004113B2 B9 33 00 00 00   mov         ecx,33h

rep的循环次数为33h
004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh

eax = 0CCCCCCCCh 
004113BC F3 AB            rep stos    dword ptr es:[edi]

将栈空间的33H个双字节赋值为0CCCCCCCCh

 

而0xcccc用汉语表示刚好就是“烫”

oxcc正好是中断int 3的指令 起到保护作用

 

原创粉丝点击