C++中全局变量、静态变量、自动变量的在内存中的位置【DEBUG】

来源:互联网 发布:ip地址数据库下载 编辑:程序博客网 时间:2024/05/22 13:28
#include<iostream>
int globle = 0;
void main( ){
011E4C80  push        ebp  
011E4C81  mov         ebp,esp  
011E4C83  sub         esp,0D8h  
011E4C89  push        ebx  
011E4C8A  push        esi  
011E4C8B  push        edi  
011E4C8C  lea         edi,[ebp-0D8h]  
011E4C92  mov         ecx,36h  
011E4C97  mov         eax,0CCCCCCCCh  
011E4C9C  rep stos    dword ptr es:[edi]  
char local = 'a';; 定义的位于main函数中的自动变量
011E4C9E  mov         byte ptr [local],61h  ;ESP = 0021FAFC EBP = 0021FBE0 local = 0021FBDBh ,可见local的地址位于main 函数的堆栈帧中。
{
int a =0; // 定义的位于代码块中的局部自动变量
011E4CA2  mov         dword ptr [ebp-14h],0  ; ebp - 14h 位于main函数帧中,保存在栈里面
static int b =0;//定义的静态变量
again: b++;
011E4CA9  mov         eax,dword ptr ds:[011EF21Ch]    ; 此处表明 b 保存于数据段,属于静态存储区,不保存在main函数的栈帧里面
011E4CAE  add         eax,1  
011E4CB1  mov         dword ptr ds:[011EF21Ch],eax   ; 执行b++ 操作
a++;
011E4CB6  mov         eax,dword ptr [ebp-14h]  
011E4CB9  add         eax,1    ; 执行a++ 操作
011E4CBC  mov         dword ptr [ebp-14h],eax  
if( b > 10) return ;
011E4CBF  cmp         dword ptr ds:[11EF21Ch],0Ah  
if( b > 10) return ;
011E4CC6  jle         again+21h (011E4CCAh)  
011E4CC8  jmp         again+23h (011E4CCCh)  
}
goto again;
011E4CCA  jmp         again (011E4CA9h)  
return;
}
011E4CCC  xor         eax,eax  
011E4CCE  pop         edi  
011E4CCF  pop         esi  
011E4CD0  pop         ebx  
011E4CD1  mov         esp,ebp  
011E4CD3  pop         ebp  

011E4CD4  ret  

思考:1、从上面的反汇编代码可以看出,static b 变量保存在静态数据区,即使在main函数的栈帧被覆盖的时候,该数据不会消失,而 local 和 a 变量只是保存在main 函数的栈帧中,当main函数退出时,栈帧中的变量值很有可能被新的栈帧里面的数据覆盖。这也说明了为什么不同变量的作用范围是不同的。

2、 C++语言的常量在汇编代码里是怎样保存的?是保存在指令里面,还是保存在其它地方?(常量包括字面值和const 修饰的量)

3、从此处的反汇编代码中并没有看到全部变量globle 被初始化的代码,那么它又是在什么时候被初始化的,以及它在内存中存放的位置。

扩展阅读:http://dev.yesky.com/105/2030105.shtml

// source code

#include<iostream>int globle = 0;void main( ){char local = 'a';{ int a =0;static int b =0;again:b++;a++; if( b > 10) return ;}goto again;return;}


原创粉丝点击